{"version":3,"file":"ideogram.min.js","mappings":"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","sources":["webpack://ideogram/webpack/universalModuleDefinition","webpack://ideogram/webpack/bootstrap","webpack://ideogram/webpack/runtime/define property getters","webpack://ideogram/webpack/runtime/hasOwnProperty shorthand","webpack://ideogram/webpack/runtime/make namespace object","webpack://ideogram/./node_modules/d3-selection/src/selector.js","webpack://ideogram/./node_modules/d3-selection/src/array.js","webpack://ideogram/./node_modules/d3-selection/src/selectorAll.js","webpack://ideogram/./node_modules/d3-selection/src/matcher.js","webpack://ideogram/./node_modules/d3-selection/src/selection/selectChild.js","webpack://ideogram/./node_modules/d3-selection/src/selection/selectChildren.js","webpack://ideogram/./node_modules/d3-selection/src/selection/sparse.js","webpack://ideogram/./node_modules/d3-selection/src/selection/enter.js","webpack://ideogram/./node_modules/d3-selection/src/constant.js","webpack://ideogram/./node_modules/d3-selection/src/selection/data.js","webpack://ideogram/./node_modules/d3-selection/src/selection/sort.js","webpack://ideogram/./node_modules/d3-selection/src/namespaces.js","webpack://ideogram/./node_modules/d3-selection/src/namespace.js","webpack://ideogram/./node_modules/d3-selection/src/selection/attr.js","webpack://ideogram/./node_modules/d3-selection/src/window.js","webpack://ideogram/./node_modules/d3-selection/src/selection/style.js","webpack://ideogram/./node_modules/d3-selection/src/selection/property.js","webpack://ideogram/./node_modules/d3-selection/src/selection/classed.js","webpack://ideogram/./node_modules/d3-selection/src/selection/text.js","webpack://ideogram/./node_modules/d3-selection/src/selection/html.js","webpack://ideogram/./node_modules/d3-selection/src/selection/raise.js","webpack://ideogram/./node_modules/d3-selection/src/selection/lower.js","webpack://ideogram/./node_modules/d3-selection/src/creator.js","webpack://ideogram/./node_modules/d3-selection/src/selection/insert.js","webpack://ideogram/./node_modules/d3-selection/src/selection/remove.js","webpack://ideogram/./node_modules/d3-selection/src/selection/clone.js","webpack://ideogram/./node_modules/d3-selection/src/selection/on.js","webpack://ideogram/./node_modules/d3-selection/src/selection/dispatch.js","webpack://ideogram/./node_modules/d3-selection/src/selection/index.js","webpack://ideogram/./node_modules/d3-selection/src/selection/select.js","webpack://ideogram/./node_modules/d3-selection/src/selection/selectAll.js","webpack://ideogram/./node_modules/d3-selection/src/selection/filter.js","webpack://ideogram/./node_modules/d3-selection/src/selection/exit.js","webpack://ideogram/./node_modules/d3-selection/src/selection/join.js","webpack://ideogram/./node_modules/d3-selection/src/selection/merge.js","webpack://ideogram/./node_modules/d3-selection/src/selection/order.js","webpack://ideogram/./node_modules/d3-selection/src/selection/call.js","webpack://ideogram/./node_modules/d3-selection/src/selection/nodes.js","webpack://ideogram/./node_modules/d3-selection/src/selection/node.js","webpack://ideogram/./node_modules/d3-selection/src/selection/size.js","webpack://ideogram/./node_modules/d3-selection/src/selection/empty.js","webpack://ideogram/./node_modules/d3-selection/src/selection/each.js","webpack://ideogram/./node_modules/d3-selection/src/selection/append.js","webpack://ideogram/./node_modules/d3-selection/src/selection/datum.js","webpack://ideogram/./node_modules/d3-selection/src/selection/iterator.js","webpack://ideogram/./node_modules/d3-selection/src/select.js","webpack://ideogram/./node_modules/d3-fetch/src/blob.js","webpack://ideogram/./node_modules/d3-fetch/src/buffer.js","webpack://ideogram/./node_modules/d3-dsv/src/dsv.js","webpack://ideogram/./node_modules/d3-dsv/src/csv.js","webpack://ideogram/./node_modules/d3-dsv/src/tsv.js","webpack://ideogram/./node_modules/d3-fetch/src/text.js","webpack://ideogram/./node_modules/d3-fetch/src/dsv.js","webpack://ideogram/./node_modules/d3-fetch/src/image.js","webpack://ideogram/./node_modules/d3-fetch/src/json.js","webpack://ideogram/./node_modules/d3-fetch/src/xml.js","webpack://ideogram/./node_modules/d3-dispatch/src/dispatch.js","webpack://ideogram/./node_modules/d3-drag/src/noevent.js","webpack://ideogram/./node_modules/d3-drag/src/nodrag.js","webpack://ideogram/./node_modules/d3-color/src/define.js","webpack://ideogram/./node_modules/d3-color/src/color.js","webpack://ideogram/./node_modules/d3-interpolate/src/basis.js","webpack://ideogram/./node_modules/d3-interpolate/src/constant.js","webpack://ideogram/./node_modules/d3-interpolate/src/color.js","webpack://ideogram/./node_modules/d3-interpolate/src/rgb.js","webpack://ideogram/./node_modules/d3-interpolate/src/array.js","webpack://ideogram/./node_modules/d3-interpolate/src/date.js","webpack://ideogram/./node_modules/d3-interpolate/src/number.js","webpack://ideogram/./node_modules/d3-interpolate/src/object.js","webpack://ideogram/./node_modules/d3-interpolate/src/basisClosed.js","webpack://ideogram/./node_modules/d3-interpolate/src/string.js","webpack://ideogram/./node_modules/d3-interpolate/src/numberArray.js","webpack://ideogram/./node_modules/d3-interpolate/src/value.js","webpack://ideogram/./node_modules/d3-selection/src/pointer.js","webpack://ideogram/./node_modules/d3-selection/src/sourceEvent.js","webpack://ideogram/./node_modules/d3-timer/src/timer.js","webpack://ideogram/./node_modules/d3-timer/src/timeout.js","webpack://ideogram/./node_modules/d3-transition/src/transition/schedule.js","webpack://ideogram/./node_modules/d3-transition/src/interrupt.js","webpack://ideogram/./node_modules/d3-interpolate/src/transform/decompose.js","webpack://ideogram/./node_modules/d3-interpolate/src/transform/parse.js","webpack://ideogram/./node_modules/d3-interpolate/src/transform/index.js","webpack://ideogram/./node_modules/d3-transition/src/transition/tween.js","webpack://ideogram/./node_modules/d3-transition/src/transition/interpolate.js","webpack://ideogram/./node_modules/d3-transition/src/transition/attr.js","webpack://ideogram/./node_modules/d3-transition/src/transition/attrTween.js","webpack://ideogram/./node_modules/d3-transition/src/transition/delay.js","webpack://ideogram/./node_modules/d3-transition/src/transition/duration.js","webpack://ideogram/./node_modules/d3-transition/src/transition/ease.js","webpack://ideogram/./node_modules/d3-transition/src/transition/on.js","webpack://ideogram/./node_modules/d3-transition/src/transition/selection.js","webpack://ideogram/./node_modules/d3-transition/src/transition/style.js","webpack://ideogram/./node_modules/d3-transition/src/transition/styleTween.js","webpack://ideogram/./node_modules/d3-transition/src/transition/textTween.js","webpack://ideogram/./node_modules/d3-transition/src/transition/index.js","webpack://ideogram/./node_modules/d3-transition/src/transition/select.js","webpack://ideogram/./node_modules/d3-transition/src/transition/selectAll.js","webpack://ideogram/./node_modules/d3-transition/src/transition/filter.js","webpack://ideogram/./node_modules/d3-transition/src/transition/merge.js","webpack://ideogram/./node_modules/d3-transition/src/transition/transition.js","webpack://ideogram/./node_modules/d3-transition/src/transition/text.js","webpack://ideogram/./node_modules/d3-transition/src/transition/remove.js","webpack://ideogram/./node_modules/d3-transition/src/transition/easeVarying.js","webpack://ideogram/./node_modules/d3-transition/src/transition/end.js","webpack://ideogram/./node_modules/d3-transition/src/selection/transition.js","webpack://ideogram/./node_modules/d3-ease/src/cubic.js","webpack://ideogram/./node_modules/d3-transition/src/selection/index.js","webpack://ideogram/./node_modules/d3-transition/src/selection/interrupt.js","webpack://ideogram/./node_modules/d3-brush/src/constant.js","webpack://ideogram/./node_modules/d3-brush/src/event.js","webpack://ideogram/./node_modules/d3-brush/src/noevent.js","webpack://ideogram/./node_modules/d3-brush/src/brush.js","webpack://ideogram/./node_modules/d3-format/src/formatDecimal.js","webpack://ideogram/./node_modules/d3-format/src/exponent.js","webpack://ideogram/./node_modules/d3-format/src/formatSpecifier.js","webpack://ideogram/./node_modules/d3-format/src/formatPrefixAuto.js","webpack://ideogram/./node_modules/d3-format/src/formatRounded.js","webpack://ideogram/./node_modules/d3-format/src/formatTypes.js","webpack://ideogram/./node_modules/d3-format/src/identity.js","webpack://ideogram/./node_modules/d3-format/src/locale.js","webpack://ideogram/./node_modules/d3-format/src/defaultLocale.js","webpack://ideogram/./node_modules/d3-format/src/formatGroup.js","webpack://ideogram/./node_modules/d3-format/src/formatNumerals.js","webpack://ideogram/./node_modules/d3-format/src/formatTrim.js","webpack://ideogram/./node_modules/d3-format/src/precisionFixed.js","webpack://ideogram/./node_modules/d3-format/src/precisionPrefix.js","webpack://ideogram/./node_modules/d3-format/src/precisionRound.js","webpack://ideogram/./node_modules/d3-array/src/ticks.js","webpack://ideogram/./node_modules/d3-array/src/ascending.js","webpack://ideogram/./node_modules/d3-array/src/bisector.js","webpack://ideogram/./node_modules/d3-array/src/bisect.js","webpack://ideogram/./node_modules/d3-array/src/number.js","webpack://ideogram/./node_modules/d3-interpolate/src/round.js","webpack://ideogram/./node_modules/d3-scale/src/number.js","webpack://ideogram/./node_modules/d3-scale/src/continuous.js","webpack://ideogram/./node_modules/d3-scale/src/constant.js","webpack://ideogram/./node_modules/d3-scale/src/init.js","webpack://ideogram/./node_modules/d3-scale/src/linear.js","webpack://ideogram/./node_modules/d3-scale/src/tickFormat.js","webpack://ideogram/./src/js/init/organism-metadata.js","webpack://ideogram/./src/js/bands/styles.js","webpack://ideogram/./src/js/lib.js","webpack://ideogram/./node_modules/d3-selection/src/selectAll.js","webpack://ideogram/./node_modules/d3-array/src/max.js","webpack://ideogram/./src/js/init/configure.js","webpack://ideogram/./src/js/collinear-vertical.js","webpack://ideogram/./src/js/collinear.js","webpack://ideogram/./src/js/init/finish-init.js","webpack://ideogram/./src/js/ploidy.js","webpack://ideogram/./src/js/views/chromosome-util.js","webpack://ideogram/./src/js/layouts/layout.js","webpack://ideogram/./src/js/layouts/vertical-layout.js","webpack://ideogram/./src/js/layouts/horizontal-layout.js","webpack://ideogram/./src/js/layouts/paired-layout.js","webpack://ideogram/./src/js/layouts/small-layout.js","webpack://ideogram/./src/js/init/write-container.js","webpack://ideogram/./src/js/layouts/layout-adapter.js","webpack://ideogram/./src/js/bands/fetch.js","webpack://ideogram/./src/js/init/init.js","webpack://ideogram/./src/js/parsers/bed-parser.js","webpack://ideogram/./src/js/parsers/tsv-parser.js","webpack://ideogram/./src/js/annotations/heatmap-lib.js","webpack://ideogram/./src/js/annotations/heatmap-collinear.js","webpack://ideogram/./src/js/annotations/heatmap-2d.js","webpack://ideogram/./src/js/annotations/track-labels.js","webpack://ideogram/./src/js/annotations/heatmap.js","webpack://ideogram/./src/js/annotations/track-labels-collinear.js","webpack://ideogram/./src/js/annotations/events.js","webpack://ideogram/./src/js/annotations/labels.js","webpack://ideogram/./src/js/annotations/histogram.js","webpack://ideogram/./src/js/annotations/legend.js","webpack://ideogram/./src/js/annotations/draw.js","webpack://ideogram/./src/js/annotations/synteny-lib.js","webpack://ideogram/./src/js/annotations/synteny-collinear.js","webpack://ideogram/./src/js/annotations/synteny-collinear-horizontal.js","webpack://ideogram/./src/js/annotations/synteny.js","webpack://ideogram/./src/js/annotations/filter.js","webpack://ideogram/./src/js/annotations/process.js","webpack://ideogram/./src/js/parsers/expression-matrix-parser.js","webpack://ideogram/./src/js/annotations/download.js","webpack://ideogram/./src/js/annotations/annotations.js","webpack://ideogram/./src/js/annotations/highlight.js","webpack://ideogram/./src/js/services/organisms.js","webpack://ideogram/./src/js/services/services.js","webpack://ideogram/./src/js/services/eutils-config.js","webpack://ideogram/./src/js/bands/show.js","webpack://ideogram/./src/js/bands/draw.js","webpack://ideogram/./src/js/bands/parse.js","webpack://ideogram/./src/js/bands/bands.js","webpack://ideogram/./src/js/brush.js","webpack://ideogram/./src/js/cursor.js","webpack://ideogram/./src/js/sex-chromosomes.js","webpack://ideogram/./src/js/coordinate-converters.js","webpack://ideogram/./node_modules/crossfilter2/src/array.js","webpack://ideogram/./node_modules/crossfilter2/src/filter.js","webpack://ideogram/./node_modules/crossfilter2/src/identity.js","webpack://ideogram/./node_modules/crossfilter2/src/null.js","webpack://ideogram/./node_modules/crossfilter2/src/zero.js","webpack://ideogram/./node_modules/crossfilter2/src/heap.js","webpack://ideogram/./node_modules/crossfilter2/src/heapselect.js","webpack://ideogram/./node_modules/crossfilter2/src/bisect.js","webpack://ideogram/./node_modules/crossfilter2/src/permute.js","webpack://ideogram/./node_modules/crossfilter2/src/reduce.js","webpack://ideogram/./node_modules/crossfilter2/src/result.js","webpack://ideogram/./node_modules/@ranfdev/deepobj/dist/deepobj.m.js","webpack://ideogram/./node_modules/crossfilter2/src/index.js","webpack://ideogram/./src/js/filter.js","webpack://ideogram/./src/js/views/chromosome-model.js","webpack://ideogram/./src/js/tools/tools.js","webpack://ideogram/./src/js/model-adapter.js","webpack://ideogram/./src/js/color.js","webpack://ideogram/./src/js/range.js","webpack://ideogram/./src/js/views/chromosome.js","webpack://ideogram/./src/js/views/draw-chromosomes.js","webpack://ideogram/./src/js/views/chromosome-labels.js","webpack://ideogram/./node_modules/fflate/esm/browser.js","webpack://ideogram/./src/js/kit/analyze-related-genes.js","webpack://ideogram/./src/js/gene-cache.js","webpack://ideogram/./src/js/kit/wikipathways.js","webpack://ideogram/./src/js/kit/related-genes.js","webpack://ideogram/./src/js/ideogram.js","webpack://ideogram/./src/js/version.js","webpack://ideogram/./src/js/index.js"],"sourcesContent":["(function webpackUniversalModuleDefinition(root, factory) {\n\tif(typeof exports === 'object' && typeof module === 'object')\n\t\tmodule.exports = factory();\n\telse if(typeof define === 'function' && define.amd)\n\t\tdefine([], factory);\n\telse {\n\t\tvar a = factory();\n\t\tfor(var i in a) (typeof exports === 'object' ? exports : root)[i] = a[i];\n\t}\n})(self, function() {\nreturn ","// The require scope\nvar __webpack_require__ = {};\n\n","// define getter functions for harmony exports\n__webpack_require__.d = (exports, definition) => {\n\tfor(var key in definition) {\n\t\tif(__webpack_require__.o(definition, key) && !__webpack_require__.o(exports, key)) {\n\t\t\tObject.defineProperty(exports, key, { enumerable: true, get: definition[key] });\n\t\t}\n\t}\n};","__webpack_require__.o = (obj, prop) => (Object.prototype.hasOwnProperty.call(obj, prop))","// define __esModule on exports\n__webpack_require__.r = (exports) => {\n\tif(typeof Symbol !== 'undefined' && Symbol.toStringTag) {\n\t\tObject.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });\n\t}\n\tObject.defineProperty(exports, '__esModule', { value: true });\n};","function none() {}\n\nexport default function(selector) {\n return selector == null ? none : function() {\n return this.querySelector(selector);\n };\n}\n","export default function(x) {\n return typeof x === \"object\" && \"length\" in x\n ? x // Array, TypedArray, NodeList, array-like\n : Array.from(x); // Map, Set, iterable, string, or anything else\n}\n","function empty() {\n return [];\n}\n\nexport default function(selector) {\n return selector == null ? empty : function() {\n return this.querySelectorAll(selector);\n };\n}\n","export default function(selector) {\n return function() {\n return this.matches(selector);\n };\n}\n\nexport function childMatcher(selector) {\n return function(node) {\n return node.matches(selector);\n };\n}\n\n","import {childMatcher} from \"../matcher.js\";\n\nvar find = Array.prototype.find;\n\nfunction childFind(match) {\n return function() {\n return find.call(this.children, match);\n };\n}\n\nfunction childFirst() {\n return this.firstElementChild;\n}\n\nexport default function(match) {\n return this.select(match == null ? childFirst\n : childFind(typeof match === \"function\" ? match : childMatcher(match)));\n}\n","import {childMatcher} from \"../matcher.js\";\n\nvar filter = Array.prototype.filter;\n\nfunction children() {\n return this.children;\n}\n\nfunction childrenFilter(match) {\n return function() {\n return filter.call(this.children, match);\n };\n}\n\nexport default function(match) {\n return this.selectAll(match == null ? children\n : childrenFilter(typeof match === \"function\" ? match : childMatcher(match)));\n}\n","export default function(update) {\n return new Array(update.length);\n}\n","import sparse from \"./sparse.js\";\nimport {Selection} from \"./index.js\";\n\nexport default function() {\n return new Selection(this._enter || this._groups.map(sparse), this._parents);\n}\n\nexport function EnterNode(parent, datum) {\n this.ownerDocument = parent.ownerDocument;\n this.namespaceURI = parent.namespaceURI;\n this._next = null;\n this._parent = parent;\n this.__data__ = datum;\n}\n\nEnterNode.prototype = {\n constructor: EnterNode,\n appendChild: function(child) { return this._parent.insertBefore(child, this._next); },\n insertBefore: function(child, next) { return this._parent.insertBefore(child, next); },\n querySelector: function(selector) { return this._parent.querySelector(selector); },\n querySelectorAll: function(selector) { return this._parent.querySelectorAll(selector); }\n};\n","export default function(x) {\n return function() {\n return x;\n };\n}\n","import {Selection} from \"./index.js\";\nimport {EnterNode} from \"./enter.js\";\nimport array from \"../array.js\";\nimport constant from \"../constant.js\";\n\nfunction bindIndex(parent, group, enter, update, exit, data) {\n var i = 0,\n node,\n groupLength = group.length,\n dataLength = data.length;\n\n // Put any non-null nodes that fit into update.\n // Put any null nodes into enter.\n // Put any remaining data into enter.\n for (; i < dataLength; ++i) {\n if (node = group[i]) {\n node.__data__ = data[i];\n update[i] = node;\n } else {\n enter[i] = new EnterNode(parent, data[i]);\n }\n }\n\n // Put any non-null nodes that don’t fit into exit.\n for (; i < groupLength; ++i) {\n if (node = group[i]) {\n exit[i] = node;\n }\n }\n}\n\nfunction bindKey(parent, group, enter, update, exit, data, key) {\n var i,\n node,\n nodeByKeyValue = new Map,\n groupLength = group.length,\n dataLength = data.length,\n keyValues = new Array(groupLength),\n keyValue;\n\n // Compute the key for each node.\n // If multiple nodes have the same key, the duplicates are added to exit.\n for (i = 0; i < groupLength; ++i) {\n if (node = group[i]) {\n keyValues[i] = keyValue = key.call(node, node.__data__, i, group) + \"\";\n if (nodeByKeyValue.has(keyValue)) {\n exit[i] = node;\n } else {\n nodeByKeyValue.set(keyValue, node);\n }\n }\n }\n\n // Compute the key for each datum.\n // If there a node associated with this key, join and add it to update.\n // If there is not (or the key is a duplicate), add it to enter.\n for (i = 0; i < dataLength; ++i) {\n keyValue = key.call(parent, data[i], i, data) + \"\";\n if (node = nodeByKeyValue.get(keyValue)) {\n update[i] = node;\n node.__data__ = data[i];\n nodeByKeyValue.delete(keyValue);\n } else {\n enter[i] = new EnterNode(parent, data[i]);\n }\n }\n\n // Add any remaining nodes that were not bound to data to exit.\n for (i = 0; i < groupLength; ++i) {\n if ((node = group[i]) && (nodeByKeyValue.get(keyValues[i]) === node)) {\n exit[i] = node;\n }\n }\n}\n\nfunction datum(node) {\n return node.__data__;\n}\n\nexport default function(value, key) {\n if (!arguments.length) return Array.from(this, datum);\n\n var bind = key ? bindKey : bindIndex,\n parents = this._parents,\n groups = this._groups;\n\n if (typeof value !== \"function\") value = constant(value);\n\n for (var m = groups.length, update = new Array(m), enter = new Array(m), exit = new Array(m), j = 0; j < m; ++j) {\n var parent = parents[j],\n group = groups[j],\n groupLength = group.length,\n data = array(value.call(parent, parent && parent.__data__, j, parents)),\n dataLength = data.length,\n enterGroup = enter[j] = new Array(dataLength),\n updateGroup = update[j] = new Array(dataLength),\n exitGroup = exit[j] = new Array(groupLength);\n\n bind(parent, group, enterGroup, updateGroup, exitGroup, data, key);\n\n // Now connect the enter nodes to their following update node, such that\n // appendChild can insert the materialized enter node before this node,\n // rather than at the end of the parent node.\n for (var i0 = 0, i1 = 0, previous, next; i0 < dataLength; ++i0) {\n if (previous = enterGroup[i0]) {\n if (i0 >= i1) i1 = i0 + 1;\n while (!(next = updateGroup[i1]) && ++i1 < dataLength);\n previous._next = next || null;\n }\n }\n }\n\n update = new Selection(update, parents);\n update._enter = enter;\n update._exit = exit;\n return update;\n}\n","import {Selection} from \"./index.js\";\n\nexport default function(compare) {\n if (!compare) compare = ascending;\n\n function compareNode(a, b) {\n return a && b ? compare(a.__data__, b.__data__) : !a - !b;\n }\n\n for (var groups = this._groups, m = groups.length, sortgroups = new Array(m), j = 0; j < m; ++j) {\n for (var group = groups[j], n = group.length, sortgroup = sortgroups[j] = new Array(n), node, i = 0; i < n; ++i) {\n if (node = group[i]) {\n sortgroup[i] = node;\n }\n }\n sortgroup.sort(compareNode);\n }\n\n return new Selection(sortgroups, this._parents).order();\n}\n\nfunction ascending(a, b) {\n return a < b ? -1 : a > b ? 1 : a >= b ? 0 : NaN;\n}\n","export var xhtml = \"http://www.w3.org/1999/xhtml\";\n\nexport default {\n svg: \"http://www.w3.org/2000/svg\",\n xhtml: xhtml,\n xlink: \"http://www.w3.org/1999/xlink\",\n xml: \"http://www.w3.org/XML/1998/namespace\",\n xmlns: \"http://www.w3.org/2000/xmlns/\"\n};\n","import namespaces from \"./namespaces.js\";\n\nexport default function(name) {\n var prefix = name += \"\", i = prefix.indexOf(\":\");\n if (i >= 0 && (prefix = name.slice(0, i)) !== \"xmlns\") name = name.slice(i + 1);\n return namespaces.hasOwnProperty(prefix) ? {space: namespaces[prefix], local: name} : name; // eslint-disable-line no-prototype-builtins\n}\n","import namespace from \"../namespace.js\";\n\nfunction attrRemove(name) {\n return function() {\n this.removeAttribute(name);\n };\n}\n\nfunction attrRemoveNS(fullname) {\n return function() {\n this.removeAttributeNS(fullname.space, fullname.local);\n };\n}\n\nfunction attrConstant(name, value) {\n return function() {\n this.setAttribute(name, value);\n };\n}\n\nfunction attrConstantNS(fullname, value) {\n return function() {\n this.setAttributeNS(fullname.space, fullname.local, value);\n };\n}\n\nfunction attrFunction(name, value) {\n return function() {\n var v = value.apply(this, arguments);\n if (v == null) this.removeAttribute(name);\n else this.setAttribute(name, v);\n };\n}\n\nfunction attrFunctionNS(fullname, value) {\n return function() {\n var v = value.apply(this, arguments);\n if (v == null) this.removeAttributeNS(fullname.space, fullname.local);\n else this.setAttributeNS(fullname.space, fullname.local, v);\n };\n}\n\nexport default function(name, value) {\n var fullname = namespace(name);\n\n if (arguments.length < 2) {\n var node = this.node();\n return fullname.local\n ? node.getAttributeNS(fullname.space, fullname.local)\n : node.getAttribute(fullname);\n }\n\n return this.each((value == null\n ? (fullname.local ? attrRemoveNS : attrRemove) : (typeof value === \"function\"\n ? (fullname.local ? attrFunctionNS : attrFunction)\n : (fullname.local ? attrConstantNS : attrConstant)))(fullname, value));\n}\n","export default function(node) {\n return (node.ownerDocument && node.ownerDocument.defaultView) // node is a Node\n || (node.document && node) // node is a Window\n || node.defaultView; // node is a Document\n}\n","import defaultView from \"../window.js\";\n\nfunction styleRemove(name) {\n return function() {\n this.style.removeProperty(name);\n };\n}\n\nfunction styleConstant(name, value, priority) {\n return function() {\n this.style.setProperty(name, value, priority);\n };\n}\n\nfunction styleFunction(name, value, priority) {\n return function() {\n var v = value.apply(this, arguments);\n if (v == null) this.style.removeProperty(name);\n else this.style.setProperty(name, v, priority);\n };\n}\n\nexport default function(name, value, priority) {\n return arguments.length > 1\n ? this.each((value == null\n ? styleRemove : typeof value === \"function\"\n ? styleFunction\n : styleConstant)(name, value, priority == null ? \"\" : priority))\n : styleValue(this.node(), name);\n}\n\nexport function styleValue(node, name) {\n return node.style.getPropertyValue(name)\n || defaultView(node).getComputedStyle(node, null).getPropertyValue(name);\n}\n","function propertyRemove(name) {\n return function() {\n delete this[name];\n };\n}\n\nfunction propertyConstant(name, value) {\n return function() {\n this[name] = value;\n };\n}\n\nfunction propertyFunction(name, value) {\n return function() {\n var v = value.apply(this, arguments);\n if (v == null) delete this[name];\n else this[name] = v;\n };\n}\n\nexport default function(name, value) {\n return arguments.length > 1\n ? this.each((value == null\n ? propertyRemove : typeof value === \"function\"\n ? propertyFunction\n : propertyConstant)(name, value))\n : this.node()[name];\n}\n","function classArray(string) {\n return string.trim().split(/^|\\s+/);\n}\n\nfunction classList(node) {\n return node.classList || new ClassList(node);\n}\n\nfunction ClassList(node) {\n this._node = node;\n this._names = classArray(node.getAttribute(\"class\") || \"\");\n}\n\nClassList.prototype = {\n add: function(name) {\n var i = this._names.indexOf(name);\n if (i < 0) {\n this._names.push(name);\n this._node.setAttribute(\"class\", this._names.join(\" \"));\n }\n },\n remove: function(name) {\n var i = this._names.indexOf(name);\n if (i >= 0) {\n this._names.splice(i, 1);\n this._node.setAttribute(\"class\", this._names.join(\" \"));\n }\n },\n contains: function(name) {\n return this._names.indexOf(name) >= 0;\n }\n};\n\nfunction classedAdd(node, names) {\n var list = classList(node), i = -1, n = names.length;\n while (++i < n) list.add(names[i]);\n}\n\nfunction classedRemove(node, names) {\n var list = classList(node), i = -1, n = names.length;\n while (++i < n) list.remove(names[i]);\n}\n\nfunction classedTrue(names) {\n return function() {\n classedAdd(this, names);\n };\n}\n\nfunction classedFalse(names) {\n return function() {\n classedRemove(this, names);\n };\n}\n\nfunction classedFunction(names, value) {\n return function() {\n (value.apply(this, arguments) ? classedAdd : classedRemove)(this, names);\n };\n}\n\nexport default function(name, value) {\n var names = classArray(name + \"\");\n\n if (arguments.length < 2) {\n var list = classList(this.node()), i = -1, n = names.length;\n while (++i < n) if (!list.contains(names[i])) return false;\n return true;\n }\n\n return this.each((typeof value === \"function\"\n ? classedFunction : value\n ? classedTrue\n : classedFalse)(names, value));\n}\n","function textRemove() {\n this.textContent = \"\";\n}\n\nfunction textConstant(value) {\n return function() {\n this.textContent = value;\n };\n}\n\nfunction textFunction(value) {\n return function() {\n var v = value.apply(this, arguments);\n this.textContent = v == null ? \"\" : v;\n };\n}\n\nexport default function(value) {\n return arguments.length\n ? this.each(value == null\n ? textRemove : (typeof value === \"function\"\n ? textFunction\n : textConstant)(value))\n : this.node().textContent;\n}\n","function htmlRemove() {\n this.innerHTML = \"\";\n}\n\nfunction htmlConstant(value) {\n return function() {\n this.innerHTML = value;\n };\n}\n\nfunction htmlFunction(value) {\n return function() {\n var v = value.apply(this, arguments);\n this.innerHTML = v == null ? \"\" : v;\n };\n}\n\nexport default function(value) {\n return arguments.length\n ? this.each(value == null\n ? htmlRemove : (typeof value === \"function\"\n ? htmlFunction\n : htmlConstant)(value))\n : this.node().innerHTML;\n}\n","function raise() {\n if (this.nextSibling) this.parentNode.appendChild(this);\n}\n\nexport default function() {\n return this.each(raise);\n}\n","function lower() {\n if (this.previousSibling) this.parentNode.insertBefore(this, this.parentNode.firstChild);\n}\n\nexport default function() {\n return this.each(lower);\n}\n","import namespace from \"./namespace.js\";\nimport {xhtml} from \"./namespaces.js\";\n\nfunction creatorInherit(name) {\n return function() {\n var document = this.ownerDocument,\n uri = this.namespaceURI;\n return uri === xhtml && document.documentElement.namespaceURI === xhtml\n ? document.createElement(name)\n : document.createElementNS(uri, name);\n };\n}\n\nfunction creatorFixed(fullname) {\n return function() {\n return this.ownerDocument.createElementNS(fullname.space, fullname.local);\n };\n}\n\nexport default function(name) {\n var fullname = namespace(name);\n return (fullname.local\n ? creatorFixed\n : creatorInherit)(fullname);\n}\n","import creator from \"../creator.js\";\nimport selector from \"../selector.js\";\n\nfunction constantNull() {\n return null;\n}\n\nexport default function(name, before) {\n var create = typeof name === \"function\" ? name : creator(name),\n select = before == null ? constantNull : typeof before === \"function\" ? before : selector(before);\n return this.select(function() {\n return this.insertBefore(create.apply(this, arguments), select.apply(this, arguments) || null);\n });\n}\n","function remove() {\n var parent = this.parentNode;\n if (parent) parent.removeChild(this);\n}\n\nexport default function() {\n return this.each(remove);\n}\n","function selection_cloneShallow() {\n var clone = this.cloneNode(false), parent = this.parentNode;\n return parent ? parent.insertBefore(clone, this.nextSibling) : clone;\n}\n\nfunction selection_cloneDeep() {\n var clone = this.cloneNode(true), parent = this.parentNode;\n return parent ? parent.insertBefore(clone, this.nextSibling) : clone;\n}\n\nexport default function(deep) {\n return this.select(deep ? selection_cloneDeep : selection_cloneShallow);\n}\n","function contextListener(listener) {\n return function(event) {\n listener.call(this, event, this.__data__);\n };\n}\n\nfunction parseTypenames(typenames) {\n return typenames.trim().split(/^|\\s+/).map(function(t) {\n var name = \"\", i = t.indexOf(\".\");\n if (i >= 0) name = t.slice(i + 1), t = t.slice(0, i);\n return {type: t, name: name};\n });\n}\n\nfunction onRemove(typename) {\n return function() {\n var on = this.__on;\n if (!on) return;\n for (var j = 0, i = -1, m = on.length, o; j < m; ++j) {\n if (o = on[j], (!typename.type || o.type === typename.type) && o.name === typename.name) {\n this.removeEventListener(o.type, o.listener, o.options);\n } else {\n on[++i] = o;\n }\n }\n if (++i) on.length = i;\n else delete this.__on;\n };\n}\n\nfunction onAdd(typename, value, options) {\n return function() {\n var on = this.__on, o, listener = contextListener(value);\n if (on) for (var j = 0, m = on.length; j < m; ++j) {\n if ((o = on[j]).type === typename.type && o.name === typename.name) {\n this.removeEventListener(o.type, o.listener, o.options);\n this.addEventListener(o.type, o.listener = listener, o.options = options);\n o.value = value;\n return;\n }\n }\n this.addEventListener(typename.type, listener, options);\n o = {type: typename.type, name: typename.name, value: value, listener: listener, options: options};\n if (!on) this.__on = [o];\n else on.push(o);\n };\n}\n\nexport default function(typename, value, options) {\n var typenames = parseTypenames(typename + \"\"), i, n = typenames.length, t;\n\n if (arguments.length < 2) {\n var on = this.node().__on;\n if (on) for (var j = 0, m = on.length, o; j < m; ++j) {\n for (i = 0, o = on[j]; i < n; ++i) {\n if ((t = typenames[i]).type === o.type && t.name === o.name) {\n return o.value;\n }\n }\n }\n return;\n }\n\n on = value ? onAdd : onRemove;\n for (i = 0; i < n; ++i) this.each(on(typenames[i], value, options));\n return this;\n}\n","import defaultView from \"../window.js\";\n\nfunction dispatchEvent(node, type, params) {\n var window = defaultView(node),\n event = window.CustomEvent;\n\n if (typeof event === \"function\") {\n event = new event(type, params);\n } else {\n event = window.document.createEvent(\"Event\");\n if (params) event.initEvent(type, params.bubbles, params.cancelable), event.detail = params.detail;\n else event.initEvent(type, false, false);\n }\n\n node.dispatchEvent(event);\n}\n\nfunction dispatchConstant(type, params) {\n return function() {\n return dispatchEvent(this, type, params);\n };\n}\n\nfunction dispatchFunction(type, params) {\n return function() {\n return dispatchEvent(this, type, params.apply(this, arguments));\n };\n}\n\nexport default function(type, params) {\n return this.each((typeof params === \"function\"\n ? dispatchFunction\n : dispatchConstant)(type, params));\n}\n","import selection_select from \"./select.js\";\nimport selection_selectAll from \"./selectAll.js\";\nimport selection_selectChild from \"./selectChild.js\";\nimport selection_selectChildren from \"./selectChildren.js\";\nimport selection_filter from \"./filter.js\";\nimport selection_data from \"./data.js\";\nimport selection_enter from \"./enter.js\";\nimport selection_exit from \"./exit.js\";\nimport selection_join from \"./join.js\";\nimport selection_merge from \"./merge.js\";\nimport selection_order from \"./order.js\";\nimport selection_sort from \"./sort.js\";\nimport selection_call from \"./call.js\";\nimport selection_nodes from \"./nodes.js\";\nimport selection_node from \"./node.js\";\nimport selection_size from \"./size.js\";\nimport selection_empty from \"./empty.js\";\nimport selection_each from \"./each.js\";\nimport selection_attr from \"./attr.js\";\nimport selection_style from \"./style.js\";\nimport selection_property from \"./property.js\";\nimport selection_classed from \"./classed.js\";\nimport selection_text from \"./text.js\";\nimport selection_html from \"./html.js\";\nimport selection_raise from \"./raise.js\";\nimport selection_lower from \"./lower.js\";\nimport selection_append from \"./append.js\";\nimport selection_insert from \"./insert.js\";\nimport selection_remove from \"./remove.js\";\nimport selection_clone from \"./clone.js\";\nimport selection_datum from \"./datum.js\";\nimport selection_on from \"./on.js\";\nimport selection_dispatch from \"./dispatch.js\";\nimport selection_iterator from \"./iterator.js\";\n\nexport var root = [null];\n\nexport function Selection(groups, parents) {\n this._groups = groups;\n this._parents = parents;\n}\n\nfunction selection() {\n return new Selection([[document.documentElement]], root);\n}\n\nfunction selection_selection() {\n return this;\n}\n\nSelection.prototype = selection.prototype = {\n constructor: Selection,\n select: selection_select,\n selectAll: selection_selectAll,\n selectChild: selection_selectChild,\n selectChildren: selection_selectChildren,\n filter: selection_filter,\n data: selection_data,\n enter: selection_enter,\n exit: selection_exit,\n join: selection_join,\n merge: selection_merge,\n selection: selection_selection,\n order: selection_order,\n sort: selection_sort,\n call: selection_call,\n nodes: selection_nodes,\n node: selection_node,\n size: selection_size,\n empty: selection_empty,\n each: selection_each,\n attr: selection_attr,\n style: selection_style,\n property: selection_property,\n classed: selection_classed,\n text: selection_text,\n html: selection_html,\n raise: selection_raise,\n lower: selection_lower,\n append: selection_append,\n insert: selection_insert,\n remove: selection_remove,\n clone: selection_clone,\n datum: selection_datum,\n on: selection_on,\n dispatch: selection_dispatch,\n [Symbol.iterator]: selection_iterator\n};\n\nexport default selection;\n","import {Selection} from \"./index.js\";\nimport selector from \"../selector.js\";\n\nexport default function(select) {\n if (typeof select !== \"function\") select = selector(select);\n\n for (var groups = this._groups, m = groups.length, subgroups = new Array(m), j = 0; j < m; ++j) {\n for (var group = groups[j], n = group.length, subgroup = subgroups[j] = new Array(n), node, subnode, i = 0; i < n; ++i) {\n if ((node = group[i]) && (subnode = select.call(node, node.__data__, i, group))) {\n if (\"__data__\" in node) subnode.__data__ = node.__data__;\n subgroup[i] = subnode;\n }\n }\n }\n\n return new Selection(subgroups, this._parents);\n}\n","import {Selection} from \"./index.js\";\nimport array from \"../array.js\";\nimport selectorAll from \"../selectorAll.js\";\n\nfunction arrayAll(select) {\n return function() {\n var group = select.apply(this, arguments);\n return group == null ? [] : array(group);\n };\n}\n\nexport default function(select) {\n if (typeof select === \"function\") select = arrayAll(select);\n else select = selectorAll(select);\n\n for (var groups = this._groups, m = groups.length, subgroups = [], parents = [], j = 0; j < m; ++j) {\n for (var group = groups[j], n = group.length, node, i = 0; i < n; ++i) {\n if (node = group[i]) {\n subgroups.push(select.call(node, node.__data__, i, group));\n parents.push(node);\n }\n }\n }\n\n return new Selection(subgroups, parents);\n}\n","import {Selection} from \"./index.js\";\nimport matcher from \"../matcher.js\";\n\nexport default function(match) {\n if (typeof match !== \"function\") match = matcher(match);\n\n for (var groups = this._groups, m = groups.length, subgroups = new Array(m), j = 0; j < m; ++j) {\n for (var group = groups[j], n = group.length, subgroup = subgroups[j] = [], node, i = 0; i < n; ++i) {\n if ((node = group[i]) && match.call(node, node.__data__, i, group)) {\n subgroup.push(node);\n }\n }\n }\n\n return new Selection(subgroups, this._parents);\n}\n","import sparse from \"./sparse.js\";\nimport {Selection} from \"./index.js\";\n\nexport default function() {\n return new Selection(this._exit || this._groups.map(sparse), this._parents);\n}\n","export default function(onenter, onupdate, onexit) {\n var enter = this.enter(), update = this, exit = this.exit();\n enter = typeof onenter === \"function\" ? onenter(enter) : enter.append(onenter + \"\");\n if (onupdate != null) update = onupdate(update);\n if (onexit == null) exit.remove(); else onexit(exit);\n return enter && update ? enter.merge(update).order() : update;\n}\n","import {Selection} from \"./index.js\";\n\nexport default function(selection) {\n if (!(selection instanceof Selection)) throw new Error(\"invalid merge\");\n\n for (var groups0 = this._groups, groups1 = selection._groups, m0 = groups0.length, m1 = groups1.length, m = Math.min(m0, m1), merges = new Array(m0), j = 0; j < m; ++j) {\n for (var group0 = groups0[j], group1 = groups1[j], n = group0.length, merge = merges[j] = new Array(n), node, i = 0; i < n; ++i) {\n if (node = group0[i] || group1[i]) {\n merge[i] = node;\n }\n }\n }\n\n for (; j < m0; ++j) {\n merges[j] = groups0[j];\n }\n\n return new Selection(merges, this._parents);\n}\n","export default function() {\n\n for (var groups = this._groups, j = -1, m = groups.length; ++j < m;) {\n for (var group = groups[j], i = group.length - 1, next = group[i], node; --i >= 0;) {\n if (node = group[i]) {\n if (next && node.compareDocumentPosition(next) ^ 4) next.parentNode.insertBefore(node, next);\n next = node;\n }\n }\n }\n\n return this;\n}\n","export default function() {\n var callback = arguments[0];\n arguments[0] = this;\n callback.apply(null, arguments);\n return this;\n}\n","export default function() {\n return Array.from(this);\n}\n","export default function() {\n\n for (var groups = this._groups, j = 0, m = groups.length; j < m; ++j) {\n for (var group = groups[j], i = 0, n = group.length; i < n; ++i) {\n var node = group[i];\n if (node) return node;\n }\n }\n\n return null;\n}\n","export default function() {\n let size = 0;\n for (const node of this) ++size; // eslint-disable-line no-unused-vars\n return size;\n}\n","export default function() {\n return !this.node();\n}\n","export default function(callback) {\n\n for (var groups = this._groups, j = 0, m = groups.length; j < m; ++j) {\n for (var group = groups[j], i = 0, n = group.length, node; i < n; ++i) {\n if (node = group[i]) callback.call(node, node.__data__, i, group);\n }\n }\n\n return this;\n}\n","import creator from \"../creator.js\";\n\nexport default function(name) {\n var create = typeof name === \"function\" ? name : creator(name);\n return this.select(function() {\n return this.appendChild(create.apply(this, arguments));\n });\n}\n","export default function(value) {\n return arguments.length\n ? this.property(\"__data__\", value)\n : this.node().__data__;\n}\n","export default function*() {\n for (var groups = this._groups, j = 0, m = groups.length; j < m; ++j) {\n for (var group = groups[j], i = 0, n = group.length, node; i < n; ++i) {\n if (node = group[i]) yield node;\n }\n }\n}\n","import {Selection, root} from \"./selection/index.js\";\n\nexport default function(selector) {\n return typeof selector === \"string\"\n ? new Selection([[document.querySelector(selector)]], [document.documentElement])\n : new Selection([[selector]], root);\n}\n","function responseBlob(response) {\n if (!response.ok) throw new Error(response.status + \" \" + response.statusText);\n return response.blob();\n}\n\nexport default function(input, init) {\n return fetch(input, init).then(responseBlob);\n}\n","function responseArrayBuffer(response) {\n if (!response.ok) throw new Error(response.status + \" \" + response.statusText);\n return response.arrayBuffer();\n}\n\nexport default function(input, init) {\n return fetch(input, init).then(responseArrayBuffer);\n}\n","var EOL = {},\n EOF = {},\n QUOTE = 34,\n NEWLINE = 10,\n RETURN = 13;\n\nfunction objectConverter(columns) {\n return new Function(\"d\", \"return {\" + columns.map(function(name, i) {\n return JSON.stringify(name) + \": d[\" + i + \"] || \\\"\\\"\";\n }).join(\",\") + \"}\");\n}\n\nfunction customConverter(columns, f) {\n var object = objectConverter(columns);\n return function(row, i) {\n return f(object(row), i, columns);\n };\n}\n\n// Compute unique columns in order of discovery.\nfunction inferColumns(rows) {\n var columnSet = Object.create(null),\n columns = [];\n\n rows.forEach(function(row) {\n for (var column in row) {\n if (!(column in columnSet)) {\n columns.push(columnSet[column] = column);\n }\n }\n });\n\n return columns;\n}\n\nfunction pad(value, width) {\n var s = value + \"\", length = s.length;\n return length < width ? new Array(width - length + 1).join(0) + s : s;\n}\n\nfunction formatYear(year) {\n return year < 0 ? \"-\" + pad(-year, 6)\n : year > 9999 ? \"+\" + pad(year, 6)\n : pad(year, 4);\n}\n\nfunction formatDate(date) {\n var hours = date.getUTCHours(),\n minutes = date.getUTCMinutes(),\n seconds = date.getUTCSeconds(),\n milliseconds = date.getUTCMilliseconds();\n return isNaN(date) ? \"Invalid Date\"\n : formatYear(date.getUTCFullYear(), 4) + \"-\" + pad(date.getUTCMonth() + 1, 2) + \"-\" + pad(date.getUTCDate(), 2)\n + (milliseconds ? \"T\" + pad(hours, 2) + \":\" + pad(minutes, 2) + \":\" + pad(seconds, 2) + \".\" + pad(milliseconds, 3) + \"Z\"\n : seconds ? \"T\" + pad(hours, 2) + \":\" + pad(minutes, 2) + \":\" + pad(seconds, 2) + \"Z\"\n : minutes || hours ? \"T\" + pad(hours, 2) + \":\" + pad(minutes, 2) + \"Z\"\n : \"\");\n}\n\nexport default function(delimiter) {\n var reFormat = new RegExp(\"[\\\"\" + delimiter + \"\\n\\r]\"),\n DELIMITER = delimiter.charCodeAt(0);\n\n function parse(text, f) {\n var convert, columns, rows = parseRows(text, function(row, i) {\n if (convert) return convert(row, i - 1);\n columns = row, convert = f ? customConverter(row, f) : objectConverter(row);\n });\n rows.columns = columns || [];\n return rows;\n }\n\n function parseRows(text, f) {\n var rows = [], // output rows\n N = text.length,\n I = 0, // current character index\n n = 0, // current line number\n t, // current token\n eof = N <= 0, // current token followed by EOF?\n eol = false; // current token followed by EOL?\n\n // Strip the trailing newline.\n if (text.charCodeAt(N - 1) === NEWLINE) --N;\n if (text.charCodeAt(N - 1) === RETURN) --N;\n\n function token() {\n if (eof) return EOF;\n if (eol) return eol = false, EOL;\n\n // Unescape quotes.\n var i, j = I, c;\n if (text.charCodeAt(j) === QUOTE) {\n while (I++ < N && text.charCodeAt(I) !== QUOTE || text.charCodeAt(++I) === QUOTE);\n if ((i = I) >= N) eof = true;\n else if ((c = text.charCodeAt(I++)) === NEWLINE) eol = true;\n else if (c === RETURN) { eol = true; if (text.charCodeAt(I) === NEWLINE) ++I; }\n return text.slice(j + 1, i - 1).replace(/\"\"/g, \"\\\"\");\n }\n\n // Find next delimiter or newline.\n while (I < N) {\n if ((c = text.charCodeAt(i = I++)) === NEWLINE) eol = true;\n else if (c === RETURN) { eol = true; if (text.charCodeAt(I) === NEWLINE) ++I; }\n else if (c !== DELIMITER) continue;\n return text.slice(j, i);\n }\n\n // Return last token before EOF.\n return eof = true, text.slice(j, N);\n }\n\n while ((t = token()) !== EOF) {\n var row = [];\n while (t !== EOL && t !== EOF) row.push(t), t = token();\n if (f && (row = f(row, n++)) == null) continue;\n rows.push(row);\n }\n\n return rows;\n }\n\n function preformatBody(rows, columns) {\n return rows.map(function(row) {\n return columns.map(function(column) {\n return formatValue(row[column]);\n }).join(delimiter);\n });\n }\n\n function format(rows, columns) {\n if (columns == null) columns = inferColumns(rows);\n return [columns.map(formatValue).join(delimiter)].concat(preformatBody(rows, columns)).join(\"\\n\");\n }\n\n function formatBody(rows, columns) {\n if (columns == null) columns = inferColumns(rows);\n return preformatBody(rows, columns).join(\"\\n\");\n }\n\n function formatRows(rows) {\n return rows.map(formatRow).join(\"\\n\");\n }\n\n function formatRow(row) {\n return row.map(formatValue).join(delimiter);\n }\n\n function formatValue(value) {\n return value == null ? \"\"\n : value instanceof Date ? formatDate(value)\n : reFormat.test(value += \"\") ? \"\\\"\" + value.replace(/\"/g, \"\\\"\\\"\") + \"\\\"\"\n : value;\n }\n\n return {\n parse: parse,\n parseRows: parseRows,\n format: format,\n formatBody: formatBody,\n formatRows: formatRows,\n formatRow: formatRow,\n formatValue: formatValue\n };\n}\n","import dsv from \"./dsv.js\";\n\nvar csv = dsv(\",\");\n\nexport var csvParse = csv.parse;\nexport var csvParseRows = csv.parseRows;\nexport var csvFormat = csv.format;\nexport var csvFormatBody = csv.formatBody;\nexport var csvFormatRows = csv.formatRows;\nexport var csvFormatRow = csv.formatRow;\nexport var csvFormatValue = csv.formatValue;\n","import dsv from \"./dsv.js\";\n\nvar tsv = dsv(\"\\t\");\n\nexport var tsvParse = tsv.parse;\nexport var tsvParseRows = tsv.parseRows;\nexport var tsvFormat = tsv.format;\nexport var tsvFormatBody = tsv.formatBody;\nexport var tsvFormatRows = tsv.formatRows;\nexport var tsvFormatRow = tsv.formatRow;\nexport var tsvFormatValue = tsv.formatValue;\n","function responseText(response) {\n if (!response.ok) throw new Error(response.status + \" \" + response.statusText);\n return response.text();\n}\n\nexport default function(input, init) {\n return fetch(input, init).then(responseText);\n}\n","import {csvParse, dsvFormat, tsvParse} from \"d3-dsv\";\nimport text from \"./text.js\";\n\nfunction dsvParse(parse) {\n return function(input, init, row) {\n if (arguments.length === 2 && typeof init === \"function\") row = init, init = undefined;\n return text(input, init).then(function(response) {\n return parse(response, row);\n });\n };\n}\n\nexport default function dsv(delimiter, input, init, row) {\n if (arguments.length === 3 && typeof init === \"function\") row = init, init = undefined;\n var format = dsvFormat(delimiter);\n return text(input, init).then(function(response) {\n return format.parse(response, row);\n });\n}\n\nexport var csv = dsvParse(csvParse);\nexport var tsv = dsvParse(tsvParse);\n","export default function(input, init) {\n return new Promise(function(resolve, reject) {\n var image = new Image;\n for (var key in init) image[key] = init[key];\n image.onerror = reject;\n image.onload = function() { resolve(image); };\n image.src = input;\n });\n}\n","function responseJson(response) {\n if (!response.ok) throw new Error(response.status + \" \" + response.statusText);\n if (response.status === 204 || response.status === 205) return;\n return response.json();\n}\n\nexport default function(input, init) {\n return fetch(input, init).then(responseJson);\n}\n","import text from \"./text.js\";\n\nfunction parser(type) {\n return (input, init) => text(input, init)\n .then(text => (new DOMParser).parseFromString(text, type));\n}\n\nexport default parser(\"application/xml\");\n\nexport var html = parser(\"text/html\");\n\nexport var svg = parser(\"image/svg+xml\");\n","var noop = {value: () => {}};\n\nfunction dispatch() {\n for (var i = 0, n = arguments.length, _ = {}, t; i < n; ++i) {\n if (!(t = arguments[i] + \"\") || (t in _) || /[\\s.]/.test(t)) throw new Error(\"illegal type: \" + t);\n _[t] = [];\n }\n return new Dispatch(_);\n}\n\nfunction Dispatch(_) {\n this._ = _;\n}\n\nfunction parseTypenames(typenames, types) {\n return typenames.trim().split(/^|\\s+/).map(function(t) {\n var name = \"\", i = t.indexOf(\".\");\n if (i >= 0) name = t.slice(i + 1), t = t.slice(0, i);\n if (t && !types.hasOwnProperty(t)) throw new Error(\"unknown type: \" + t);\n return {type: t, name: name};\n });\n}\n\nDispatch.prototype = dispatch.prototype = {\n constructor: Dispatch,\n on: function(typename, callback) {\n var _ = this._,\n T = parseTypenames(typename + \"\", _),\n t,\n i = -1,\n n = T.length;\n\n // If no callback was specified, return the callback of the given type and name.\n if (arguments.length < 2) {\n while (++i < n) if ((t = (typename = T[i]).type) && (t = get(_[t], typename.name))) return t;\n return;\n }\n\n // If a type was specified, set the callback for the given type and name.\n // Otherwise, if a null callback was specified, remove callbacks of the given name.\n if (callback != null && typeof callback !== \"function\") throw new Error(\"invalid callback: \" + callback);\n while (++i < n) {\n if (t = (typename = T[i]).type) _[t] = set(_[t], typename.name, callback);\n else if (callback == null) for (t in _) _[t] = set(_[t], typename.name, null);\n }\n\n return this;\n },\n copy: function() {\n var copy = {}, _ = this._;\n for (var t in _) copy[t] = _[t].slice();\n return new Dispatch(copy);\n },\n call: function(type, that) {\n if ((n = arguments.length - 2) > 0) for (var args = new Array(n), i = 0, n, t; i < n; ++i) args[i] = arguments[i + 2];\n if (!this._.hasOwnProperty(type)) throw new Error(\"unknown type: \" + type);\n for (t = this._[type], i = 0, n = t.length; i < n; ++i) t[i].value.apply(that, args);\n },\n apply: function(type, that, args) {\n if (!this._.hasOwnProperty(type)) throw new Error(\"unknown type: \" + type);\n for (var t = this._[type], i = 0, n = t.length; i < n; ++i) t[i].value.apply(that, args);\n }\n};\n\nfunction get(type, name) {\n for (var i = 0, n = type.length, c; i < n; ++i) {\n if ((c = type[i]).name === name) {\n return c.value;\n }\n }\n}\n\nfunction set(type, name, callback) {\n for (var i = 0, n = type.length; i < n; ++i) {\n if (type[i].name === name) {\n type[i] = noop, type = type.slice(0, i).concat(type.slice(i + 1));\n break;\n }\n }\n if (callback != null) type.push({name: name, value: callback});\n return type;\n}\n\nexport default dispatch;\n","export function nopropagation(event) {\n event.stopImmediatePropagation();\n}\n\nexport default function(event) {\n event.preventDefault();\n event.stopImmediatePropagation();\n}\n","import {select} from \"d3-selection\";\nimport noevent from \"./noevent.js\";\n\nexport default function(view) {\n var root = view.document.documentElement,\n selection = select(view).on(\"dragstart.drag\", noevent, true);\n if (\"onselectstart\" in root) {\n selection.on(\"selectstart.drag\", noevent, true);\n } else {\n root.__noselect = root.style.MozUserSelect;\n root.style.MozUserSelect = \"none\";\n }\n}\n\nexport function yesdrag(view, noclick) {\n var root = view.document.documentElement,\n selection = select(view).on(\"dragstart.drag\", null);\n if (noclick) {\n selection.on(\"click.drag\", noevent, true);\n setTimeout(function() { selection.on(\"click.drag\", null); }, 0);\n }\n if (\"onselectstart\" in root) {\n selection.on(\"selectstart.drag\", null);\n } else {\n root.style.MozUserSelect = root.__noselect;\n delete root.__noselect;\n }\n}\n","export default function(constructor, factory, prototype) {\n constructor.prototype = factory.prototype = prototype;\n prototype.constructor = constructor;\n}\n\nexport function extend(parent, definition) {\n var prototype = Object.create(parent.prototype);\n for (var key in definition) prototype[key] = definition[key];\n return prototype;\n}\n","import define, {extend} from \"./define.js\";\n\nexport function Color() {}\n\nexport var darker = 0.7;\nexport var brighter = 1 / darker;\n\nvar reI = \"\\\\s*([+-]?\\\\d+)\\\\s*\",\n reN = \"\\\\s*([+-]?\\\\d*\\\\.?\\\\d+(?:[eE][+-]?\\\\d+)?)\\\\s*\",\n reP = \"\\\\s*([+-]?\\\\d*\\\\.?\\\\d+(?:[eE][+-]?\\\\d+)?)%\\\\s*\",\n reHex = /^#([0-9a-f]{3,8})$/,\n reRgbInteger = new RegExp(\"^rgb\\\\(\" + [reI, reI, reI] + \"\\\\)$\"),\n reRgbPercent = new RegExp(\"^rgb\\\\(\" + [reP, reP, reP] + \"\\\\)$\"),\n reRgbaInteger = new RegExp(\"^rgba\\\\(\" + [reI, reI, reI, reN] + \"\\\\)$\"),\n reRgbaPercent = new RegExp(\"^rgba\\\\(\" + [reP, reP, reP, reN] + \"\\\\)$\"),\n reHslPercent = new RegExp(\"^hsl\\\\(\" + [reN, reP, reP] + \"\\\\)$\"),\n reHslaPercent = new RegExp(\"^hsla\\\\(\" + [reN, reP, reP, reN] + \"\\\\)$\");\n\nvar named = {\n aliceblue: 0xf0f8ff,\n antiquewhite: 0xfaebd7,\n aqua: 0x00ffff,\n aquamarine: 0x7fffd4,\n azure: 0xf0ffff,\n beige: 0xf5f5dc,\n bisque: 0xffe4c4,\n black: 0x000000,\n blanchedalmond: 0xffebcd,\n blue: 0x0000ff,\n blueviolet: 0x8a2be2,\n brown: 0xa52a2a,\n burlywood: 0xdeb887,\n cadetblue: 0x5f9ea0,\n chartreuse: 0x7fff00,\n chocolate: 0xd2691e,\n coral: 0xff7f50,\n cornflowerblue: 0x6495ed,\n cornsilk: 0xfff8dc,\n crimson: 0xdc143c,\n cyan: 0x00ffff,\n darkblue: 0x00008b,\n darkcyan: 0x008b8b,\n darkgoldenrod: 0xb8860b,\n darkgray: 0xa9a9a9,\n darkgreen: 0x006400,\n darkgrey: 0xa9a9a9,\n darkkhaki: 0xbdb76b,\n darkmagenta: 0x8b008b,\n darkolivegreen: 0x556b2f,\n darkorange: 0xff8c00,\n darkorchid: 0x9932cc,\n darkred: 0x8b0000,\n darksalmon: 0xe9967a,\n darkseagreen: 0x8fbc8f,\n darkslateblue: 0x483d8b,\n darkslategray: 0x2f4f4f,\n darkslategrey: 0x2f4f4f,\n darkturquoise: 0x00ced1,\n darkviolet: 0x9400d3,\n deeppink: 0xff1493,\n deepskyblue: 0x00bfff,\n dimgray: 0x696969,\n dimgrey: 0x696969,\n dodgerblue: 0x1e90ff,\n firebrick: 0xb22222,\n floralwhite: 0xfffaf0,\n forestgreen: 0x228b22,\n fuchsia: 0xff00ff,\n gainsboro: 0xdcdcdc,\n ghostwhite: 0xf8f8ff,\n gold: 0xffd700,\n goldenrod: 0xdaa520,\n gray: 0x808080,\n green: 0x008000,\n greenyellow: 0xadff2f,\n grey: 0x808080,\n honeydew: 0xf0fff0,\n hotpink: 0xff69b4,\n indianred: 0xcd5c5c,\n indigo: 0x4b0082,\n ivory: 0xfffff0,\n khaki: 0xf0e68c,\n lavender: 0xe6e6fa,\n lavenderblush: 0xfff0f5,\n lawngreen: 0x7cfc00,\n lemonchiffon: 0xfffacd,\n lightblue: 0xadd8e6,\n lightcoral: 0xf08080,\n lightcyan: 0xe0ffff,\n lightgoldenrodyellow: 0xfafad2,\n lightgray: 0xd3d3d3,\n lightgreen: 0x90ee90,\n lightgrey: 0xd3d3d3,\n lightpink: 0xffb6c1,\n lightsalmon: 0xffa07a,\n lightseagreen: 0x20b2aa,\n lightskyblue: 0x87cefa,\n lightslategray: 0x778899,\n lightslategrey: 0x778899,\n lightsteelblue: 0xb0c4de,\n lightyellow: 0xffffe0,\n lime: 0x00ff00,\n limegreen: 0x32cd32,\n linen: 0xfaf0e6,\n magenta: 0xff00ff,\n maroon: 0x800000,\n mediumaquamarine: 0x66cdaa,\n mediumblue: 0x0000cd,\n mediumorchid: 0xba55d3,\n mediumpurple: 0x9370db,\n mediumseagreen: 0x3cb371,\n mediumslateblue: 0x7b68ee,\n mediumspringgreen: 0x00fa9a,\n mediumturquoise: 0x48d1cc,\n mediumvioletred: 0xc71585,\n midnightblue: 0x191970,\n mintcream: 0xf5fffa,\n mistyrose: 0xffe4e1,\n moccasin: 0xffe4b5,\n navajowhite: 0xffdead,\n navy: 0x000080,\n oldlace: 0xfdf5e6,\n olive: 0x808000,\n olivedrab: 0x6b8e23,\n orange: 0xffa500,\n orangered: 0xff4500,\n orchid: 0xda70d6,\n palegoldenrod: 0xeee8aa,\n palegreen: 0x98fb98,\n paleturquoise: 0xafeeee,\n palevioletred: 0xdb7093,\n papayawhip: 0xffefd5,\n peachpuff: 0xffdab9,\n peru: 0xcd853f,\n pink: 0xffc0cb,\n plum: 0xdda0dd,\n powderblue: 0xb0e0e6,\n purple: 0x800080,\n rebeccapurple: 0x663399,\n red: 0xff0000,\n rosybrown: 0xbc8f8f,\n royalblue: 0x4169e1,\n saddlebrown: 0x8b4513,\n salmon: 0xfa8072,\n sandybrown: 0xf4a460,\n seagreen: 0x2e8b57,\n seashell: 0xfff5ee,\n sienna: 0xa0522d,\n silver: 0xc0c0c0,\n skyblue: 0x87ceeb,\n slateblue: 0x6a5acd,\n slategray: 0x708090,\n slategrey: 0x708090,\n snow: 0xfffafa,\n springgreen: 0x00ff7f,\n steelblue: 0x4682b4,\n tan: 0xd2b48c,\n teal: 0x008080,\n thistle: 0xd8bfd8,\n tomato: 0xff6347,\n turquoise: 0x40e0d0,\n violet: 0xee82ee,\n wheat: 0xf5deb3,\n white: 0xffffff,\n whitesmoke: 0xf5f5f5,\n yellow: 0xffff00,\n yellowgreen: 0x9acd32\n};\n\ndefine(Color, color, {\n copy: function(channels) {\n return Object.assign(new this.constructor, this, channels);\n },\n displayable: function() {\n return this.rgb().displayable();\n },\n hex: color_formatHex, // Deprecated! Use color.formatHex.\n formatHex: color_formatHex,\n formatHsl: color_formatHsl,\n formatRgb: color_formatRgb,\n toString: color_formatRgb\n});\n\nfunction color_formatHex() {\n return this.rgb().formatHex();\n}\n\nfunction color_formatHsl() {\n return hslConvert(this).formatHsl();\n}\n\nfunction color_formatRgb() {\n return this.rgb().formatRgb();\n}\n\nexport default function color(format) {\n var m, l;\n format = (format + \"\").trim().toLowerCase();\n return (m = reHex.exec(format)) ? (l = m[1].length, m = parseInt(m[1], 16), l === 6 ? rgbn(m) // #ff0000\n : l === 3 ? new Rgb((m >> 8 & 0xf) | (m >> 4 & 0xf0), (m >> 4 & 0xf) | (m & 0xf0), ((m & 0xf) << 4) | (m & 0xf), 1) // #f00\n : l === 8 ? rgba(m >> 24 & 0xff, m >> 16 & 0xff, m >> 8 & 0xff, (m & 0xff) / 0xff) // #ff000000\n : l === 4 ? rgba((m >> 12 & 0xf) | (m >> 8 & 0xf0), (m >> 8 & 0xf) | (m >> 4 & 0xf0), (m >> 4 & 0xf) | (m & 0xf0), (((m & 0xf) << 4) | (m & 0xf)) / 0xff) // #f000\n : null) // invalid hex\n : (m = reRgbInteger.exec(format)) ? new Rgb(m[1], m[2], m[3], 1) // rgb(255, 0, 0)\n : (m = reRgbPercent.exec(format)) ? new Rgb(m[1] * 255 / 100, m[2] * 255 / 100, m[3] * 255 / 100, 1) // rgb(100%, 0%, 0%)\n : (m = reRgbaInteger.exec(format)) ? rgba(m[1], m[2], m[3], m[4]) // rgba(255, 0, 0, 1)\n : (m = reRgbaPercent.exec(format)) ? rgba(m[1] * 255 / 100, m[2] * 255 / 100, m[3] * 255 / 100, m[4]) // rgb(100%, 0%, 0%, 1)\n : (m = reHslPercent.exec(format)) ? hsla(m[1], m[2] / 100, m[3] / 100, 1) // hsl(120, 50%, 50%)\n : (m = reHslaPercent.exec(format)) ? hsla(m[1], m[2] / 100, m[3] / 100, m[4]) // hsla(120, 50%, 50%, 1)\n : named.hasOwnProperty(format) ? rgbn(named[format]) // eslint-disable-line no-prototype-builtins\n : format === \"transparent\" ? new Rgb(NaN, NaN, NaN, 0)\n : null;\n}\n\nfunction rgbn(n) {\n return new Rgb(n >> 16 & 0xff, n >> 8 & 0xff, n & 0xff, 1);\n}\n\nfunction rgba(r, g, b, a) {\n if (a <= 0) r = g = b = NaN;\n return new Rgb(r, g, b, a);\n}\n\nexport function rgbConvert(o) {\n if (!(o instanceof Color)) o = color(o);\n if (!o) return new Rgb;\n o = o.rgb();\n return new Rgb(o.r, o.g, o.b, o.opacity);\n}\n\nexport function rgb(r, g, b, opacity) {\n return arguments.length === 1 ? rgbConvert(r) : new Rgb(r, g, b, opacity == null ? 1 : opacity);\n}\n\nexport function Rgb(r, g, b, opacity) {\n this.r = +r;\n this.g = +g;\n this.b = +b;\n this.opacity = +opacity;\n}\n\ndefine(Rgb, rgb, extend(Color, {\n brighter: function(k) {\n k = k == null ? brighter : Math.pow(brighter, k);\n return new Rgb(this.r * k, this.g * k, this.b * k, this.opacity);\n },\n darker: function(k) {\n k = k == null ? darker : Math.pow(darker, k);\n return new Rgb(this.r * k, this.g * k, this.b * k, this.opacity);\n },\n rgb: function() {\n return this;\n },\n displayable: function() {\n return (-0.5 <= this.r && this.r < 255.5)\n && (-0.5 <= this.g && this.g < 255.5)\n && (-0.5 <= this.b && this.b < 255.5)\n && (0 <= this.opacity && this.opacity <= 1);\n },\n hex: rgb_formatHex, // Deprecated! Use color.formatHex.\n formatHex: rgb_formatHex,\n formatRgb: rgb_formatRgb,\n toString: rgb_formatRgb\n}));\n\nfunction rgb_formatHex() {\n return \"#\" + hex(this.r) + hex(this.g) + hex(this.b);\n}\n\nfunction rgb_formatRgb() {\n var a = this.opacity; a = isNaN(a) ? 1 : Math.max(0, Math.min(1, a));\n return (a === 1 ? \"rgb(\" : \"rgba(\")\n + Math.max(0, Math.min(255, Math.round(this.r) || 0)) + \", \"\n + Math.max(0, Math.min(255, Math.round(this.g) || 0)) + \", \"\n + Math.max(0, Math.min(255, Math.round(this.b) || 0))\n + (a === 1 ? \")\" : \", \" + a + \")\");\n}\n\nfunction hex(value) {\n value = Math.max(0, Math.min(255, Math.round(value) || 0));\n return (value < 16 ? \"0\" : \"\") + value.toString(16);\n}\n\nfunction hsla(h, s, l, a) {\n if (a <= 0) h = s = l = NaN;\n else if (l <= 0 || l >= 1) h = s = NaN;\n else if (s <= 0) h = NaN;\n return new Hsl(h, s, l, a);\n}\n\nexport function hslConvert(o) {\n if (o instanceof Hsl) return new Hsl(o.h, o.s, o.l, o.opacity);\n if (!(o instanceof Color)) o = color(o);\n if (!o) return new Hsl;\n if (o instanceof Hsl) return o;\n o = o.rgb();\n var r = o.r / 255,\n g = o.g / 255,\n b = o.b / 255,\n min = Math.min(r, g, b),\n max = Math.max(r, g, b),\n h = NaN,\n s = max - min,\n l = (max + min) / 2;\n if (s) {\n if (r === max) h = (g - b) / s + (g < b) * 6;\n else if (g === max) h = (b - r) / s + 2;\n else h = (r - g) / s + 4;\n s /= l < 0.5 ? max + min : 2 - max - min;\n h *= 60;\n } else {\n s = l > 0 && l < 1 ? 0 : h;\n }\n return new Hsl(h, s, l, o.opacity);\n}\n\nexport function hsl(h, s, l, opacity) {\n return arguments.length === 1 ? hslConvert(h) : new Hsl(h, s, l, opacity == null ? 1 : opacity);\n}\n\nfunction Hsl(h, s, l, opacity) {\n this.h = +h;\n this.s = +s;\n this.l = +l;\n this.opacity = +opacity;\n}\n\ndefine(Hsl, hsl, extend(Color, {\n brighter: function(k) {\n k = k == null ? brighter : Math.pow(brighter, k);\n return new Hsl(this.h, this.s, this.l * k, this.opacity);\n },\n darker: function(k) {\n k = k == null ? darker : Math.pow(darker, k);\n return new Hsl(this.h, this.s, this.l * k, this.opacity);\n },\n rgb: function() {\n var h = this.h % 360 + (this.h < 0) * 360,\n s = isNaN(h) || isNaN(this.s) ? 0 : this.s,\n l = this.l,\n m2 = l + (l < 0.5 ? l : 1 - l) * s,\n m1 = 2 * l - m2;\n return new Rgb(\n hsl2rgb(h >= 240 ? h - 240 : h + 120, m1, m2),\n hsl2rgb(h, m1, m2),\n hsl2rgb(h < 120 ? h + 240 : h - 120, m1, m2),\n this.opacity\n );\n },\n displayable: function() {\n return (0 <= this.s && this.s <= 1 || isNaN(this.s))\n && (0 <= this.l && this.l <= 1)\n && (0 <= this.opacity && this.opacity <= 1);\n },\n formatHsl: function() {\n var a = this.opacity; a = isNaN(a) ? 1 : Math.max(0, Math.min(1, a));\n return (a === 1 ? \"hsl(\" : \"hsla(\")\n + (this.h || 0) + \", \"\n + (this.s || 0) * 100 + \"%, \"\n + (this.l || 0) * 100 + \"%\"\n + (a === 1 ? \")\" : \", \" + a + \")\");\n }\n}));\n\n/* From FvD 13.37, CSS Color Module Level 3 */\nfunction hsl2rgb(h, m1, m2) {\n return (h < 60 ? m1 + (m2 - m1) * h / 60\n : h < 180 ? m2\n : h < 240 ? m1 + (m2 - m1) * (240 - h) / 60\n : m1) * 255;\n}\n","export function basis(t1, v0, v1, v2, v3) {\n var t2 = t1 * t1, t3 = t2 * t1;\n return ((1 - 3 * t1 + 3 * t2 - t3) * v0\n + (4 - 6 * t2 + 3 * t3) * v1\n + (1 + 3 * t1 + 3 * t2 - 3 * t3) * v2\n + t3 * v3) / 6;\n}\n\nexport default function(values) {\n var n = values.length - 1;\n return function(t) {\n var i = t <= 0 ? (t = 0) : t >= 1 ? (t = 1, n - 1) : Math.floor(t * n),\n v1 = values[i],\n v2 = values[i + 1],\n v0 = i > 0 ? values[i - 1] : 2 * v1 - v2,\n v3 = i < n - 1 ? values[i + 2] : 2 * v2 - v1;\n return basis((t - i / n) * n, v0, v1, v2, v3);\n };\n}\n","export default x => () => x;\n","import constant from \"./constant.js\";\n\nfunction linear(a, d) {\n return function(t) {\n return a + t * d;\n };\n}\n\nfunction exponential(a, b, y) {\n return a = Math.pow(a, y), b = Math.pow(b, y) - a, y = 1 / y, function(t) {\n return Math.pow(a + t * b, y);\n };\n}\n\nexport function hue(a, b) {\n var d = b - a;\n return d ? linear(a, d > 180 || d < -180 ? d - 360 * Math.round(d / 360) : d) : constant(isNaN(a) ? b : a);\n}\n\nexport function gamma(y) {\n return (y = +y) === 1 ? nogamma : function(a, b) {\n return b - a ? exponential(a, b, y) : constant(isNaN(a) ? b : a);\n };\n}\n\nexport default function nogamma(a, b) {\n var d = b - a;\n return d ? linear(a, d) : constant(isNaN(a) ? b : a);\n}\n","import {rgb as colorRgb} from \"d3-color\";\nimport basis from \"./basis.js\";\nimport basisClosed from \"./basisClosed.js\";\nimport nogamma, {gamma} from \"./color.js\";\n\nexport default (function rgbGamma(y) {\n var color = gamma(y);\n\n function rgb(start, end) {\n var r = color((start = colorRgb(start)).r, (end = colorRgb(end)).r),\n g = color(start.g, end.g),\n b = color(start.b, end.b),\n opacity = nogamma(start.opacity, end.opacity);\n return function(t) {\n start.r = r(t);\n start.g = g(t);\n start.b = b(t);\n start.opacity = opacity(t);\n return start + \"\";\n };\n }\n\n rgb.gamma = rgbGamma;\n\n return rgb;\n})(1);\n\nfunction rgbSpline(spline) {\n return function(colors) {\n var n = colors.length,\n r = new Array(n),\n g = new Array(n),\n b = new Array(n),\n i, color;\n for (i = 0; i < n; ++i) {\n color = colorRgb(colors[i]);\n r[i] = color.r || 0;\n g[i] = color.g || 0;\n b[i] = color.b || 0;\n }\n r = spline(r);\n g = spline(g);\n b = spline(b);\n color.opacity = 1;\n return function(t) {\n color.r = r(t);\n color.g = g(t);\n color.b = b(t);\n return color + \"\";\n };\n };\n}\n\nexport var rgbBasis = rgbSpline(basis);\nexport var rgbBasisClosed = rgbSpline(basisClosed);\n","import value from \"./value.js\";\nimport numberArray, {isNumberArray} from \"./numberArray.js\";\n\nexport default function(a, b) {\n return (isNumberArray(b) ? numberArray : genericArray)(a, b);\n}\n\nexport function genericArray(a, b) {\n var nb = b ? b.length : 0,\n na = a ? Math.min(nb, a.length) : 0,\n x = new Array(na),\n c = new Array(nb),\n i;\n\n for (i = 0; i < na; ++i) x[i] = value(a[i], b[i]);\n for (; i < nb; ++i) c[i] = b[i];\n\n return function(t) {\n for (i = 0; i < na; ++i) c[i] = x[i](t);\n return c;\n };\n}\n","export default function(a, b) {\n var d = new Date;\n return a = +a, b = +b, function(t) {\n return d.setTime(a * (1 - t) + b * t), d;\n };\n}\n","export default function(a, b) {\n return a = +a, b = +b, function(t) {\n return a * (1 - t) + b * t;\n };\n}\n","import value from \"./value.js\";\n\nexport default function(a, b) {\n var i = {},\n c = {},\n k;\n\n if (a === null || typeof a !== \"object\") a = {};\n if (b === null || typeof b !== \"object\") b = {};\n\n for (k in b) {\n if (k in a) {\n i[k] = value(a[k], b[k]);\n } else {\n c[k] = b[k];\n }\n }\n\n return function(t) {\n for (k in i) c[k] = i[k](t);\n return c;\n };\n}\n","import {basis} from \"./basis.js\";\n\nexport default function(values) {\n var n = values.length;\n return function(t) {\n var i = Math.floor(((t %= 1) < 0 ? ++t : t) * n),\n v0 = values[(i + n - 1) % n],\n v1 = values[i % n],\n v2 = values[(i + 1) % n],\n v3 = values[(i + 2) % n];\n return basis((t - i / n) * n, v0, v1, v2, v3);\n };\n}\n","import number from \"./number.js\";\n\nvar reA = /[-+]?(?:\\d+\\.?\\d*|\\.?\\d+)(?:[eE][-+]?\\d+)?/g,\n reB = new RegExp(reA.source, \"g\");\n\nfunction zero(b) {\n return function() {\n return b;\n };\n}\n\nfunction one(b) {\n return function(t) {\n return b(t) + \"\";\n };\n}\n\nexport default function(a, b) {\n var bi = reA.lastIndex = reB.lastIndex = 0, // scan index for next number in b\n am, // current match in a\n bm, // current match in b\n bs, // string preceding current number in b, if any\n i = -1, // index in s\n s = [], // string constants and placeholders\n q = []; // number interpolators\n\n // Coerce inputs to strings.\n a = a + \"\", b = b + \"\";\n\n // Interpolate pairs of numbers in a & b.\n while ((am = reA.exec(a))\n && (bm = reB.exec(b))) {\n if ((bs = bm.index) > bi) { // a string precedes the next number in b\n bs = b.slice(bi, bs);\n if (s[i]) s[i] += bs; // coalesce with previous string\n else s[++i] = bs;\n }\n if ((am = am[0]) === (bm = bm[0])) { // numbers in a & b match\n if (s[i]) s[i] += bm; // coalesce with previous string\n else s[++i] = bm;\n } else { // interpolate non-matching numbers\n s[++i] = null;\n q.push({i: i, x: number(am, bm)});\n }\n bi = reB.lastIndex;\n }\n\n // Add remains of b.\n if (bi < b.length) {\n bs = b.slice(bi);\n if (s[i]) s[i] += bs; // coalesce with previous string\n else s[++i] = bs;\n }\n\n // Special optimization for only a single match.\n // Otherwise, interpolate each of the numbers and rejoin the string.\n return s.length < 2 ? (q[0]\n ? one(q[0].x)\n : zero(b))\n : (b = q.length, function(t) {\n for (var i = 0, o; i < b; ++i) s[(o = q[i]).i] = o.x(t);\n return s.join(\"\");\n });\n}\n","export default function(a, b) {\n if (!b) b = [];\n var n = a ? Math.min(b.length, a.length) : 0,\n c = b.slice(),\n i;\n return function(t) {\n for (i = 0; i < n; ++i) c[i] = a[i] * (1 - t) + b[i] * t;\n return c;\n };\n}\n\nexport function isNumberArray(x) {\n return ArrayBuffer.isView(x) && !(x instanceof DataView);\n}\n","import {color} from \"d3-color\";\nimport rgb from \"./rgb.js\";\nimport {genericArray} from \"./array.js\";\nimport date from \"./date.js\";\nimport number from \"./number.js\";\nimport object from \"./object.js\";\nimport string from \"./string.js\";\nimport constant from \"./constant.js\";\nimport numberArray, {isNumberArray} from \"./numberArray.js\";\n\nexport default function(a, b) {\n var t = typeof b, c;\n return b == null || t === \"boolean\" ? constant(b)\n : (t === \"number\" ? number\n : t === \"string\" ? ((c = color(b)) ? (b = c, rgb) : string)\n : b instanceof color ? rgb\n : b instanceof Date ? date\n : isNumberArray(b) ? numberArray\n : Array.isArray(b) ? genericArray\n : typeof b.valueOf !== \"function\" && typeof b.toString !== \"function\" || isNaN(b) ? object\n : number)(a, b);\n}\n","import sourceEvent from \"./sourceEvent.js\";\n\nexport default function(event, node) {\n event = sourceEvent(event);\n if (node === undefined) node = event.currentTarget;\n if (node) {\n var svg = node.ownerSVGElement || node;\n if (svg.createSVGPoint) {\n var point = svg.createSVGPoint();\n point.x = event.clientX, point.y = event.clientY;\n point = point.matrixTransform(node.getScreenCTM().inverse());\n return [point.x, point.y];\n }\n if (node.getBoundingClientRect) {\n var rect = node.getBoundingClientRect();\n return [event.clientX - rect.left - node.clientLeft, event.clientY - rect.top - node.clientTop];\n }\n }\n return [event.pageX, event.pageY];\n}\n","export default function(event) {\n let sourceEvent;\n while (sourceEvent = event.sourceEvent) event = sourceEvent;\n return event;\n}\n","var frame = 0, // is an animation frame pending?\n timeout = 0, // is a timeout pending?\n interval = 0, // are any timers active?\n pokeDelay = 1000, // how frequently we check for clock skew\n taskHead,\n taskTail,\n clockLast = 0,\n clockNow = 0,\n clockSkew = 0,\n clock = typeof performance === \"object\" && performance.now ? performance : Date,\n setFrame = typeof window === \"object\" && window.requestAnimationFrame ? window.requestAnimationFrame.bind(window) : function(f) { setTimeout(f, 17); };\n\nexport function now() {\n return clockNow || (setFrame(clearNow), clockNow = clock.now() + clockSkew);\n}\n\nfunction clearNow() {\n clockNow = 0;\n}\n\nexport function Timer() {\n this._call =\n this._time =\n this._next = null;\n}\n\nTimer.prototype = timer.prototype = {\n constructor: Timer,\n restart: function(callback, delay, time) {\n if (typeof callback !== \"function\") throw new TypeError(\"callback is not a function\");\n time = (time == null ? now() : +time) + (delay == null ? 0 : +delay);\n if (!this._next && taskTail !== this) {\n if (taskTail) taskTail._next = this;\n else taskHead = this;\n taskTail = this;\n }\n this._call = callback;\n this._time = time;\n sleep();\n },\n stop: function() {\n if (this._call) {\n this._call = null;\n this._time = Infinity;\n sleep();\n }\n }\n};\n\nexport function timer(callback, delay, time) {\n var t = new Timer;\n t.restart(callback, delay, time);\n return t;\n}\n\nexport function timerFlush() {\n now(); // Get the current time, if not already set.\n ++frame; // Pretend we’ve set an alarm, if we haven’t already.\n var t = taskHead, e;\n while (t) {\n if ((e = clockNow - t._time) >= 0) t._call.call(null, e);\n t = t._next;\n }\n --frame;\n}\n\nfunction wake() {\n clockNow = (clockLast = clock.now()) + clockSkew;\n frame = timeout = 0;\n try {\n timerFlush();\n } finally {\n frame = 0;\n nap();\n clockNow = 0;\n }\n}\n\nfunction poke() {\n var now = clock.now(), delay = now - clockLast;\n if (delay > pokeDelay) clockSkew -= delay, clockLast = now;\n}\n\nfunction nap() {\n var t0, t1 = taskHead, t2, time = Infinity;\n while (t1) {\n if (t1._call) {\n if (time > t1._time) time = t1._time;\n t0 = t1, t1 = t1._next;\n } else {\n t2 = t1._next, t1._next = null;\n t1 = t0 ? t0._next = t2 : taskHead = t2;\n }\n }\n taskTail = t0;\n sleep(time);\n}\n\nfunction sleep(time) {\n if (frame) return; // Soonest alarm already set, or will be.\n if (timeout) timeout = clearTimeout(timeout);\n var delay = time - clockNow; // Strictly less than if we recomputed clockNow.\n if (delay > 24) {\n if (time < Infinity) timeout = setTimeout(wake, time - clock.now() - clockSkew);\n if (interval) interval = clearInterval(interval);\n } else {\n if (!interval) clockLast = clock.now(), interval = setInterval(poke, pokeDelay);\n frame = 1, setFrame(wake);\n }\n}\n","import {Timer} from \"./timer.js\";\n\nexport default function(callback, delay, time) {\n var t = new Timer;\n delay = delay == null ? 0 : +delay;\n t.restart(elapsed => {\n t.stop();\n callback(elapsed + delay);\n }, delay, time);\n return t;\n}\n","import {dispatch} from \"d3-dispatch\";\nimport {timer, timeout} from \"d3-timer\";\n\nvar emptyOn = dispatch(\"start\", \"end\", \"cancel\", \"interrupt\");\nvar emptyTween = [];\n\nexport var CREATED = 0;\nexport var SCHEDULED = 1;\nexport var STARTING = 2;\nexport var STARTED = 3;\nexport var RUNNING = 4;\nexport var ENDING = 5;\nexport var ENDED = 6;\n\nexport default function(node, name, id, index, group, timing) {\n var schedules = node.__transition;\n if (!schedules) node.__transition = {};\n else if (id in schedules) return;\n create(node, id, {\n name: name,\n index: index, // For context during callback.\n group: group, // For context during callback.\n on: emptyOn,\n tween: emptyTween,\n time: timing.time,\n delay: timing.delay,\n duration: timing.duration,\n ease: timing.ease,\n timer: null,\n state: CREATED\n });\n}\n\nexport function init(node, id) {\n var schedule = get(node, id);\n if (schedule.state > CREATED) throw new Error(\"too late; already scheduled\");\n return schedule;\n}\n\nexport function set(node, id) {\n var schedule = get(node, id);\n if (schedule.state > STARTED) throw new Error(\"too late; already running\");\n return schedule;\n}\n\nexport function get(node, id) {\n var schedule = node.__transition;\n if (!schedule || !(schedule = schedule[id])) throw new Error(\"transition not found\");\n return schedule;\n}\n\nfunction create(node, id, self) {\n var schedules = node.__transition,\n tween;\n\n // Initialize the self timer when the transition is created.\n // Note the actual delay is not known until the first callback!\n schedules[id] = self;\n self.timer = timer(schedule, 0, self.time);\n\n function schedule(elapsed) {\n self.state = SCHEDULED;\n self.timer.restart(start, self.delay, self.time);\n\n // If the elapsed delay is less than our first sleep, start immediately.\n if (self.delay <= elapsed) start(elapsed - self.delay);\n }\n\n function start(elapsed) {\n var i, j, n, o;\n\n // If the state is not SCHEDULED, then we previously errored on start.\n if (self.state !== SCHEDULED) return stop();\n\n for (i in schedules) {\n o = schedules[i];\n if (o.name !== self.name) continue;\n\n // While this element already has a starting transition during this frame,\n // defer starting an interrupting transition until that transition has a\n // chance to tick (and possibly end); see d3/d3-transition#54!\n if (o.state === STARTED) return timeout(start);\n\n // Interrupt the active transition, if any.\n if (o.state === RUNNING) {\n o.state = ENDED;\n o.timer.stop();\n o.on.call(\"interrupt\", node, node.__data__, o.index, o.group);\n delete schedules[i];\n }\n\n // Cancel any pre-empted transitions.\n else if (+i < id) {\n o.state = ENDED;\n o.timer.stop();\n o.on.call(\"cancel\", node, node.__data__, o.index, o.group);\n delete schedules[i];\n }\n }\n\n // Defer the first tick to end of the current frame; see d3/d3#1576.\n // Note the transition may be canceled after start and before the first tick!\n // Note this must be scheduled before the start event; see d3/d3-transition#16!\n // Assuming this is successful, subsequent callbacks go straight to tick.\n timeout(function() {\n if (self.state === STARTED) {\n self.state = RUNNING;\n self.timer.restart(tick, self.delay, self.time);\n tick(elapsed);\n }\n });\n\n // Dispatch the start event.\n // Note this must be done before the tween are initialized.\n self.state = STARTING;\n self.on.call(\"start\", node, node.__data__, self.index, self.group);\n if (self.state !== STARTING) return; // interrupted\n self.state = STARTED;\n\n // Initialize the tween, deleting null tween.\n tween = new Array(n = self.tween.length);\n for (i = 0, j = -1; i < n; ++i) {\n if (o = self.tween[i].value.call(node, node.__data__, self.index, self.group)) {\n tween[++j] = o;\n }\n }\n tween.length = j + 1;\n }\n\n function tick(elapsed) {\n var t = elapsed < self.duration ? self.ease.call(null, elapsed / self.duration) : (self.timer.restart(stop), self.state = ENDING, 1),\n i = -1,\n n = tween.length;\n\n while (++i < n) {\n tween[i].call(node, t);\n }\n\n // Dispatch the end event.\n if (self.state === ENDING) {\n self.on.call(\"end\", node, node.__data__, self.index, self.group);\n stop();\n }\n }\n\n function stop() {\n self.state = ENDED;\n self.timer.stop();\n delete schedules[id];\n for (var i in schedules) return; // eslint-disable-line no-unused-vars\n delete node.__transition;\n }\n}\n","import {STARTING, ENDING, ENDED} from \"./transition/schedule.js\";\n\nexport default function(node, name) {\n var schedules = node.__transition,\n schedule,\n active,\n empty = true,\n i;\n\n if (!schedules) return;\n\n name = name == null ? null : name + \"\";\n\n for (i in schedules) {\n if ((schedule = schedules[i]).name !== name) { empty = false; continue; }\n active = schedule.state > STARTING && schedule.state < ENDING;\n schedule.state = ENDED;\n schedule.timer.stop();\n schedule.on.call(active ? \"interrupt\" : \"cancel\", node, node.__data__, schedule.index, schedule.group);\n delete schedules[i];\n }\n\n if (empty) delete node.__transition;\n}\n","var degrees = 180 / Math.PI;\n\nexport var identity = {\n translateX: 0,\n translateY: 0,\n rotate: 0,\n skewX: 0,\n scaleX: 1,\n scaleY: 1\n};\n\nexport default function(a, b, c, d, e, f) {\n var scaleX, scaleY, skewX;\n if (scaleX = Math.sqrt(a * a + b * b)) a /= scaleX, b /= scaleX;\n if (skewX = a * c + b * d) c -= a * skewX, d -= b * skewX;\n if (scaleY = Math.sqrt(c * c + d * d)) c /= scaleY, d /= scaleY, skewX /= scaleY;\n if (a * d < b * c) a = -a, b = -b, skewX = -skewX, scaleX = -scaleX;\n return {\n translateX: e,\n translateY: f,\n rotate: Math.atan2(b, a) * degrees,\n skewX: Math.atan(skewX) * degrees,\n scaleX: scaleX,\n scaleY: scaleY\n };\n}\n","import decompose, {identity} from \"./decompose.js\";\n\nvar svgNode;\n\n/* eslint-disable no-undef */\nexport function parseCss(value) {\n const m = new (typeof DOMMatrix === \"function\" ? DOMMatrix : WebKitCSSMatrix)(value + \"\");\n return m.isIdentity ? identity : decompose(m.a, m.b, m.c, m.d, m.e, m.f);\n}\n\nexport function parseSvg(value) {\n if (value == null) return identity;\n if (!svgNode) svgNode = document.createElementNS(\"http://www.w3.org/2000/svg\", \"g\");\n svgNode.setAttribute(\"transform\", value);\n if (!(value = svgNode.transform.baseVal.consolidate())) return identity;\n value = value.matrix;\n return decompose(value.a, value.b, value.c, value.d, value.e, value.f);\n}\n","import number from \"../number.js\";\nimport {parseCss, parseSvg} from \"./parse.js\";\n\nfunction interpolateTransform(parse, pxComma, pxParen, degParen) {\n\n function pop(s) {\n return s.length ? s.pop() + \" \" : \"\";\n }\n\n function translate(xa, ya, xb, yb, s, q) {\n if (xa !== xb || ya !== yb) {\n var i = s.push(\"translate(\", null, pxComma, null, pxParen);\n q.push({i: i - 4, x: number(xa, xb)}, {i: i - 2, x: number(ya, yb)});\n } else if (xb || yb) {\n s.push(\"translate(\" + xb + pxComma + yb + pxParen);\n }\n }\n\n function rotate(a, b, s, q) {\n if (a !== b) {\n if (a - b > 180) b += 360; else if (b - a > 180) a += 360; // shortest path\n q.push({i: s.push(pop(s) + \"rotate(\", null, degParen) - 2, x: number(a, b)});\n } else if (b) {\n s.push(pop(s) + \"rotate(\" + b + degParen);\n }\n }\n\n function skewX(a, b, s, q) {\n if (a !== b) {\n q.push({i: s.push(pop(s) + \"skewX(\", null, degParen) - 2, x: number(a, b)});\n } else if (b) {\n s.push(pop(s) + \"skewX(\" + b + degParen);\n }\n }\n\n function scale(xa, ya, xb, yb, s, q) {\n if (xa !== xb || ya !== yb) {\n var i = s.push(pop(s) + \"scale(\", null, \",\", null, \")\");\n q.push({i: i - 4, x: number(xa, xb)}, {i: i - 2, x: number(ya, yb)});\n } else if (xb !== 1 || yb !== 1) {\n s.push(pop(s) + \"scale(\" + xb + \",\" + yb + \")\");\n }\n }\n\n return function(a, b) {\n var s = [], // string constants and placeholders\n q = []; // number interpolators\n a = parse(a), b = parse(b);\n translate(a.translateX, a.translateY, b.translateX, b.translateY, s, q);\n rotate(a.rotate, b.rotate, s, q);\n skewX(a.skewX, b.skewX, s, q);\n scale(a.scaleX, a.scaleY, b.scaleX, b.scaleY, s, q);\n a = b = null; // gc\n return function(t) {\n var i = -1, n = q.length, o;\n while (++i < n) s[(o = q[i]).i] = o.x(t);\n return s.join(\"\");\n };\n };\n}\n\nexport var interpolateTransformCss = interpolateTransform(parseCss, \"px, \", \"px)\", \"deg)\");\nexport var interpolateTransformSvg = interpolateTransform(parseSvg, \", \", \")\", \")\");\n","import {get, set} from \"./schedule.js\";\n\nfunction tweenRemove(id, name) {\n var tween0, tween1;\n return function() {\n var schedule = set(this, id),\n tween = schedule.tween;\n\n // If this node shared tween with the previous node,\n // just assign the updated shared tween and we’re done!\n // Otherwise, copy-on-write.\n if (tween !== tween0) {\n tween1 = tween0 = tween;\n for (var i = 0, n = tween1.length; i < n; ++i) {\n if (tween1[i].name === name) {\n tween1 = tween1.slice();\n tween1.splice(i, 1);\n break;\n }\n }\n }\n\n schedule.tween = tween1;\n };\n}\n\nfunction tweenFunction(id, name, value) {\n var tween0, tween1;\n if (typeof value !== \"function\") throw new Error;\n return function() {\n var schedule = set(this, id),\n tween = schedule.tween;\n\n // If this node shared tween with the previous node,\n // just assign the updated shared tween and we’re done!\n // Otherwise, copy-on-write.\n if (tween !== tween0) {\n tween1 = (tween0 = tween).slice();\n for (var t = {name: name, value: value}, i = 0, n = tween1.length; i < n; ++i) {\n if (tween1[i].name === name) {\n tween1[i] = t;\n break;\n }\n }\n if (i === n) tween1.push(t);\n }\n\n schedule.tween = tween1;\n };\n}\n\nexport default function(name, value) {\n var id = this._id;\n\n name += \"\";\n\n if (arguments.length < 2) {\n var tween = get(this.node(), id).tween;\n for (var i = 0, n = tween.length, t; i < n; ++i) {\n if ((t = tween[i]).name === name) {\n return t.value;\n }\n }\n return null;\n }\n\n return this.each((value == null ? tweenRemove : tweenFunction)(id, name, value));\n}\n\nexport function tweenValue(transition, name, value) {\n var id = transition._id;\n\n transition.each(function() {\n var schedule = set(this, id);\n (schedule.value || (schedule.value = {}))[name] = value.apply(this, arguments);\n });\n\n return function(node) {\n return get(node, id).value[name];\n };\n}\n","import {color} from \"d3-color\";\nimport {interpolateNumber, interpolateRgb, interpolateString} from \"d3-interpolate\";\n\nexport default function(a, b) {\n var c;\n return (typeof b === \"number\" ? interpolateNumber\n : b instanceof color ? interpolateRgb\n : (c = color(b)) ? (b = c, interpolateRgb)\n : interpolateString)(a, b);\n}\n","import {interpolateTransformSvg as interpolateTransform} from \"d3-interpolate\";\nimport {namespace} from \"d3-selection\";\nimport {tweenValue} from \"./tween.js\";\nimport interpolate from \"./interpolate.js\";\n\nfunction attrRemove(name) {\n return function() {\n this.removeAttribute(name);\n };\n}\n\nfunction attrRemoveNS(fullname) {\n return function() {\n this.removeAttributeNS(fullname.space, fullname.local);\n };\n}\n\nfunction attrConstant(name, interpolate, value1) {\n var string00,\n string1 = value1 + \"\",\n interpolate0;\n return function() {\n var string0 = this.getAttribute(name);\n return string0 === string1 ? null\n : string0 === string00 ? interpolate0\n : interpolate0 = interpolate(string00 = string0, value1);\n };\n}\n\nfunction attrConstantNS(fullname, interpolate, value1) {\n var string00,\n string1 = value1 + \"\",\n interpolate0;\n return function() {\n var string0 = this.getAttributeNS(fullname.space, fullname.local);\n return string0 === string1 ? null\n : string0 === string00 ? interpolate0\n : interpolate0 = interpolate(string00 = string0, value1);\n };\n}\n\nfunction attrFunction(name, interpolate, value) {\n var string00,\n string10,\n interpolate0;\n return function() {\n var string0, value1 = value(this), string1;\n if (value1 == null) return void this.removeAttribute(name);\n string0 = this.getAttribute(name);\n string1 = value1 + \"\";\n return string0 === string1 ? null\n : string0 === string00 && string1 === string10 ? interpolate0\n : (string10 = string1, interpolate0 = interpolate(string00 = string0, value1));\n };\n}\n\nfunction attrFunctionNS(fullname, interpolate, value) {\n var string00,\n string10,\n interpolate0;\n return function() {\n var string0, value1 = value(this), string1;\n if (value1 == null) return void this.removeAttributeNS(fullname.space, fullname.local);\n string0 = this.getAttributeNS(fullname.space, fullname.local);\n string1 = value1 + \"\";\n return string0 === string1 ? null\n : string0 === string00 && string1 === string10 ? interpolate0\n : (string10 = string1, interpolate0 = interpolate(string00 = string0, value1));\n };\n}\n\nexport default function(name, value) {\n var fullname = namespace(name), i = fullname === \"transform\" ? interpolateTransform : interpolate;\n return this.attrTween(name, typeof value === \"function\"\n ? (fullname.local ? attrFunctionNS : attrFunction)(fullname, i, tweenValue(this, \"attr.\" + name, value))\n : value == null ? (fullname.local ? attrRemoveNS : attrRemove)(fullname)\n : (fullname.local ? attrConstantNS : attrConstant)(fullname, i, value));\n}\n","import {namespace} from \"d3-selection\";\n\nfunction attrInterpolate(name, i) {\n return function(t) {\n this.setAttribute(name, i.call(this, t));\n };\n}\n\nfunction attrInterpolateNS(fullname, i) {\n return function(t) {\n this.setAttributeNS(fullname.space, fullname.local, i.call(this, t));\n };\n}\n\nfunction attrTweenNS(fullname, value) {\n var t0, i0;\n function tween() {\n var i = value.apply(this, arguments);\n if (i !== i0) t0 = (i0 = i) && attrInterpolateNS(fullname, i);\n return t0;\n }\n tween._value = value;\n return tween;\n}\n\nfunction attrTween(name, value) {\n var t0, i0;\n function tween() {\n var i = value.apply(this, arguments);\n if (i !== i0) t0 = (i0 = i) && attrInterpolate(name, i);\n return t0;\n }\n tween._value = value;\n return tween;\n}\n\nexport default function(name, value) {\n var key = \"attr.\" + name;\n if (arguments.length < 2) return (key = this.tween(key)) && key._value;\n if (value == null) return this.tween(key, null);\n if (typeof value !== \"function\") throw new Error;\n var fullname = namespace(name);\n return this.tween(key, (fullname.local ? attrTweenNS : attrTween)(fullname, value));\n}\n","import {get, init} from \"./schedule.js\";\n\nfunction delayFunction(id, value) {\n return function() {\n init(this, id).delay = +value.apply(this, arguments);\n };\n}\n\nfunction delayConstant(id, value) {\n return value = +value, function() {\n init(this, id).delay = value;\n };\n}\n\nexport default function(value) {\n var id = this._id;\n\n return arguments.length\n ? this.each((typeof value === \"function\"\n ? delayFunction\n : delayConstant)(id, value))\n : get(this.node(), id).delay;\n}\n","import {get, set} from \"./schedule.js\";\n\nfunction durationFunction(id, value) {\n return function() {\n set(this, id).duration = +value.apply(this, arguments);\n };\n}\n\nfunction durationConstant(id, value) {\n return value = +value, function() {\n set(this, id).duration = value;\n };\n}\n\nexport default function(value) {\n var id = this._id;\n\n return arguments.length\n ? this.each((typeof value === \"function\"\n ? durationFunction\n : durationConstant)(id, value))\n : get(this.node(), id).duration;\n}\n","import {get, set} from \"./schedule.js\";\n\nfunction easeConstant(id, value) {\n if (typeof value !== \"function\") throw new Error;\n return function() {\n set(this, id).ease = value;\n };\n}\n\nexport default function(value) {\n var id = this._id;\n\n return arguments.length\n ? this.each(easeConstant(id, value))\n : get(this.node(), id).ease;\n}\n","import {get, set, init} from \"./schedule.js\";\n\nfunction start(name) {\n return (name + \"\").trim().split(/^|\\s+/).every(function(t) {\n var i = t.indexOf(\".\");\n if (i >= 0) t = t.slice(0, i);\n return !t || t === \"start\";\n });\n}\n\nfunction onFunction(id, name, listener) {\n var on0, on1, sit = start(name) ? init : set;\n return function() {\n var schedule = sit(this, id),\n on = schedule.on;\n\n // If this node shared a dispatch with the previous node,\n // just assign the updated shared dispatch and we’re done!\n // Otherwise, copy-on-write.\n if (on !== on0) (on1 = (on0 = on).copy()).on(name, listener);\n\n schedule.on = on1;\n };\n}\n\nexport default function(name, listener) {\n var id = this._id;\n\n return arguments.length < 2\n ? get(this.node(), id).on.on(name)\n : this.each(onFunction(id, name, listener));\n}\n","import {selection} from \"d3-selection\";\n\nvar Selection = selection.prototype.constructor;\n\nexport default function() {\n return new Selection(this._groups, this._parents);\n}\n","import {interpolateTransformCss as interpolateTransform} from \"d3-interpolate\";\nimport {style} from \"d3-selection\";\nimport {set} from \"./schedule.js\";\nimport {tweenValue} from \"./tween.js\";\nimport interpolate from \"./interpolate.js\";\n\nfunction styleNull(name, interpolate) {\n var string00,\n string10,\n interpolate0;\n return function() {\n var string0 = style(this, name),\n string1 = (this.style.removeProperty(name), style(this, name));\n return string0 === string1 ? null\n : string0 === string00 && string1 === string10 ? interpolate0\n : interpolate0 = interpolate(string00 = string0, string10 = string1);\n };\n}\n\nfunction styleRemove(name) {\n return function() {\n this.style.removeProperty(name);\n };\n}\n\nfunction styleConstant(name, interpolate, value1) {\n var string00,\n string1 = value1 + \"\",\n interpolate0;\n return function() {\n var string0 = style(this, name);\n return string0 === string1 ? null\n : string0 === string00 ? interpolate0\n : interpolate0 = interpolate(string00 = string0, value1);\n };\n}\n\nfunction styleFunction(name, interpolate, value) {\n var string00,\n string10,\n interpolate0;\n return function() {\n var string0 = style(this, name),\n value1 = value(this),\n string1 = value1 + \"\";\n if (value1 == null) string1 = value1 = (this.style.removeProperty(name), style(this, name));\n return string0 === string1 ? null\n : string0 === string00 && string1 === string10 ? interpolate0\n : (string10 = string1, interpolate0 = interpolate(string00 = string0, value1));\n };\n}\n\nfunction styleMaybeRemove(id, name) {\n var on0, on1, listener0, key = \"style.\" + name, event = \"end.\" + key, remove;\n return function() {\n var schedule = set(this, id),\n on = schedule.on,\n listener = schedule.value[key] == null ? remove || (remove = styleRemove(name)) : undefined;\n\n // If this node shared a dispatch with the previous node,\n // just assign the updated shared dispatch and we’re done!\n // Otherwise, copy-on-write.\n if (on !== on0 || listener0 !== listener) (on1 = (on0 = on).copy()).on(event, listener0 = listener);\n\n schedule.on = on1;\n };\n}\n\nexport default function(name, value, priority) {\n var i = (name += \"\") === \"transform\" ? interpolateTransform : interpolate;\n return value == null ? this\n .styleTween(name, styleNull(name, i))\n .on(\"end.style.\" + name, styleRemove(name))\n : typeof value === \"function\" ? this\n .styleTween(name, styleFunction(name, i, tweenValue(this, \"style.\" + name, value)))\n .each(styleMaybeRemove(this._id, name))\n : this\n .styleTween(name, styleConstant(name, i, value), priority)\n .on(\"end.style.\" + name, null);\n}\n","function styleInterpolate(name, i, priority) {\n return function(t) {\n this.style.setProperty(name, i.call(this, t), priority);\n };\n}\n\nfunction styleTween(name, value, priority) {\n var t, i0;\n function tween() {\n var i = value.apply(this, arguments);\n if (i !== i0) t = (i0 = i) && styleInterpolate(name, i, priority);\n return t;\n }\n tween._value = value;\n return tween;\n}\n\nexport default function(name, value, priority) {\n var key = \"style.\" + (name += \"\");\n if (arguments.length < 2) return (key = this.tween(key)) && key._value;\n if (value == null) return this.tween(key, null);\n if (typeof value !== \"function\") throw new Error;\n return this.tween(key, styleTween(name, value, priority == null ? \"\" : priority));\n}\n","function textInterpolate(i) {\n return function(t) {\n this.textContent = i.call(this, t);\n };\n}\n\nfunction textTween(value) {\n var t0, i0;\n function tween() {\n var i = value.apply(this, arguments);\n if (i !== i0) t0 = (i0 = i) && textInterpolate(i);\n return t0;\n }\n tween._value = value;\n return tween;\n}\n\nexport default function(value) {\n var key = \"text\";\n if (arguments.length < 1) return (key = this.tween(key)) && key._value;\n if (value == null) return this.tween(key, null);\n if (typeof value !== \"function\") throw new Error;\n return this.tween(key, textTween(value));\n}\n","import {selection} from \"d3-selection\";\nimport transition_attr from \"./attr.js\";\nimport transition_attrTween from \"./attrTween.js\";\nimport transition_delay from \"./delay.js\";\nimport transition_duration from \"./duration.js\";\nimport transition_ease from \"./ease.js\";\nimport transition_easeVarying from \"./easeVarying.js\";\nimport transition_filter from \"./filter.js\";\nimport transition_merge from \"./merge.js\";\nimport transition_on from \"./on.js\";\nimport transition_remove from \"./remove.js\";\nimport transition_select from \"./select.js\";\nimport transition_selectAll from \"./selectAll.js\";\nimport transition_selection from \"./selection.js\";\nimport transition_style from \"./style.js\";\nimport transition_styleTween from \"./styleTween.js\";\nimport transition_text from \"./text.js\";\nimport transition_textTween from \"./textTween.js\";\nimport transition_transition from \"./transition.js\";\nimport transition_tween from \"./tween.js\";\nimport transition_end from \"./end.js\";\n\nvar id = 0;\n\nexport function Transition(groups, parents, name, id) {\n this._groups = groups;\n this._parents = parents;\n this._name = name;\n this._id = id;\n}\n\nexport default function transition(name) {\n return selection().transition(name);\n}\n\nexport function newId() {\n return ++id;\n}\n\nvar selection_prototype = selection.prototype;\n\nTransition.prototype = transition.prototype = {\n constructor: Transition,\n select: transition_select,\n selectAll: transition_selectAll,\n filter: transition_filter,\n merge: transition_merge,\n selection: transition_selection,\n transition: transition_transition,\n call: selection_prototype.call,\n nodes: selection_prototype.nodes,\n node: selection_prototype.node,\n size: selection_prototype.size,\n empty: selection_prototype.empty,\n each: selection_prototype.each,\n on: transition_on,\n attr: transition_attr,\n attrTween: transition_attrTween,\n style: transition_style,\n styleTween: transition_styleTween,\n text: transition_text,\n textTween: transition_textTween,\n remove: transition_remove,\n tween: transition_tween,\n delay: transition_delay,\n duration: transition_duration,\n ease: transition_ease,\n easeVarying: transition_easeVarying,\n end: transition_end,\n [Symbol.iterator]: selection_prototype[Symbol.iterator]\n};\n","import {selector} from \"d3-selection\";\nimport {Transition} from \"./index.js\";\nimport schedule, {get} from \"./schedule.js\";\n\nexport default function(select) {\n var name = this._name,\n id = this._id;\n\n if (typeof select !== \"function\") select = selector(select);\n\n for (var groups = this._groups, m = groups.length, subgroups = new Array(m), j = 0; j < m; ++j) {\n for (var group = groups[j], n = group.length, subgroup = subgroups[j] = new Array(n), node, subnode, i = 0; i < n; ++i) {\n if ((node = group[i]) && (subnode = select.call(node, node.__data__, i, group))) {\n if (\"__data__\" in node) subnode.__data__ = node.__data__;\n subgroup[i] = subnode;\n schedule(subgroup[i], name, id, i, subgroup, get(node, id));\n }\n }\n }\n\n return new Transition(subgroups, this._parents, name, id);\n}\n","import {selectorAll} from \"d3-selection\";\nimport {Transition} from \"./index.js\";\nimport schedule, {get} from \"./schedule.js\";\n\nexport default function(select) {\n var name = this._name,\n id = this._id;\n\n if (typeof select !== \"function\") select = selectorAll(select);\n\n for (var groups = this._groups, m = groups.length, subgroups = [], parents = [], j = 0; j < m; ++j) {\n for (var group = groups[j], n = group.length, node, i = 0; i < n; ++i) {\n if (node = group[i]) {\n for (var children = select.call(node, node.__data__, i, group), child, inherit = get(node, id), k = 0, l = children.length; k < l; ++k) {\n if (child = children[k]) {\n schedule(child, name, id, k, children, inherit);\n }\n }\n subgroups.push(children);\n parents.push(node);\n }\n }\n }\n\n return new Transition(subgroups, parents, name, id);\n}\n","import {matcher} from \"d3-selection\";\nimport {Transition} from \"./index.js\";\n\nexport default function(match) {\n if (typeof match !== \"function\") match = matcher(match);\n\n for (var groups = this._groups, m = groups.length, subgroups = new Array(m), j = 0; j < m; ++j) {\n for (var group = groups[j], n = group.length, subgroup = subgroups[j] = [], node, i = 0; i < n; ++i) {\n if ((node = group[i]) && match.call(node, node.__data__, i, group)) {\n subgroup.push(node);\n }\n }\n }\n\n return new Transition(subgroups, this._parents, this._name, this._id);\n}\n","import {Transition} from \"./index.js\";\n\nexport default function(transition) {\n if (transition._id !== this._id) throw new Error;\n\n for (var groups0 = this._groups, groups1 = transition._groups, m0 = groups0.length, m1 = groups1.length, m = Math.min(m0, m1), merges = new Array(m0), j = 0; j < m; ++j) {\n for (var group0 = groups0[j], group1 = groups1[j], n = group0.length, merge = merges[j] = new Array(n), node, i = 0; i < n; ++i) {\n if (node = group0[i] || group1[i]) {\n merge[i] = node;\n }\n }\n }\n\n for (; j < m0; ++j) {\n merges[j] = groups0[j];\n }\n\n return new Transition(merges, this._parents, this._name, this._id);\n}\n","import {Transition, newId} from \"./index.js\";\nimport schedule, {get} from \"./schedule.js\";\n\nexport default function() {\n var name = this._name,\n id0 = this._id,\n id1 = newId();\n\n for (var groups = this._groups, m = groups.length, j = 0; j < m; ++j) {\n for (var group = groups[j], n = group.length, node, i = 0; i < n; ++i) {\n if (node = group[i]) {\n var inherit = get(node, id0);\n schedule(node, name, id1, i, group, {\n time: inherit.time + inherit.delay + inherit.duration,\n delay: 0,\n duration: inherit.duration,\n ease: inherit.ease\n });\n }\n }\n }\n\n return new Transition(groups, this._parents, name, id1);\n}\n","import {tweenValue} from \"./tween.js\";\n\nfunction textConstant(value) {\n return function() {\n this.textContent = value;\n };\n}\n\nfunction textFunction(value) {\n return function() {\n var value1 = value(this);\n this.textContent = value1 == null ? \"\" : value1;\n };\n}\n\nexport default function(value) {\n return this.tween(\"text\", typeof value === \"function\"\n ? textFunction(tweenValue(this, \"text\", value))\n : textConstant(value == null ? \"\" : value + \"\"));\n}\n","function removeFunction(id) {\n return function() {\n var parent = this.parentNode;\n for (var i in this.__transition) if (+i !== id) return;\n if (parent) parent.removeChild(this);\n };\n}\n\nexport default function() {\n return this.on(\"end.remove\", removeFunction(this._id));\n}\n","import {set} from \"./schedule.js\";\n\nfunction easeVarying(id, value) {\n return function() {\n var v = value.apply(this, arguments);\n if (typeof v !== \"function\") throw new Error;\n set(this, id).ease = v;\n };\n}\n\nexport default function(value) {\n if (typeof value !== \"function\") throw new Error;\n return this.each(easeVarying(this._id, value));\n}\n","import {set} from \"./schedule.js\";\n\nexport default function() {\n var on0, on1, that = this, id = that._id, size = that.size();\n return new Promise(function(resolve, reject) {\n var cancel = {value: reject},\n end = {value: function() { if (--size === 0) resolve(); }};\n\n that.each(function() {\n var schedule = set(this, id),\n on = schedule.on;\n\n // If this node shared a dispatch with the previous node,\n // just assign the updated shared dispatch and we’re done!\n // Otherwise, copy-on-write.\n if (on !== on0) {\n on1 = (on0 = on).copy();\n on1._.cancel.push(cancel);\n on1._.interrupt.push(cancel);\n on1._.end.push(end);\n }\n\n schedule.on = on1;\n });\n\n // The selection was empty, resolve end immediately\n if (size === 0) resolve();\n });\n}\n","import {Transition, newId} from \"../transition/index.js\";\nimport schedule from \"../transition/schedule.js\";\nimport {easeCubicInOut} from \"d3-ease\";\nimport {now} from \"d3-timer\";\n\nvar defaultTiming = {\n time: null, // Set on use.\n delay: 0,\n duration: 250,\n ease: easeCubicInOut\n};\n\nfunction inherit(node, id) {\n var timing;\n while (!(timing = node.__transition) || !(timing = timing[id])) {\n if (!(node = node.parentNode)) {\n throw new Error(`transition ${id} not found`);\n }\n }\n return timing;\n}\n\nexport default function(name) {\n var id,\n timing;\n\n if (name instanceof Transition) {\n id = name._id, name = name._name;\n } else {\n id = newId(), (timing = defaultTiming).time = now(), name = name == null ? null : name + \"\";\n }\n\n for (var groups = this._groups, m = groups.length, j = 0; j < m; ++j) {\n for (var group = groups[j], n = group.length, node, i = 0; i < n; ++i) {\n if (node = group[i]) {\n schedule(node, name, id, i, group, timing || inherit(node, id));\n }\n }\n }\n\n return new Transition(groups, this._parents, name, id);\n}\n","export function cubicIn(t) {\n return t * t * t;\n}\n\nexport function cubicOut(t) {\n return --t * t * t + 1;\n}\n\nexport function cubicInOut(t) {\n return ((t *= 2) <= 1 ? t * t * t : (t -= 2) * t * t + 2) / 2;\n}\n","import {selection} from \"d3-selection\";\nimport selection_interrupt from \"./interrupt.js\";\nimport selection_transition from \"./transition.js\";\n\nselection.prototype.interrupt = selection_interrupt;\nselection.prototype.transition = selection_transition;\n","import interrupt from \"../interrupt.js\";\n\nexport default function(name) {\n return this.each(function() {\n interrupt(this, name);\n });\n}\n","export default x => () => x;\n","export default function BrushEvent(type, {\n sourceEvent,\n target,\n selection,\n mode,\n dispatch\n}) {\n Object.defineProperties(this, {\n type: {value: type, enumerable: true, configurable: true},\n sourceEvent: {value: sourceEvent, enumerable: true, configurable: true},\n target: {value: target, enumerable: true, configurable: true},\n selection: {value: selection, enumerable: true, configurable: true},\n mode: {value: mode, enumerable: true, configurable: true},\n _: {value: dispatch}\n });\n}\n","export function nopropagation(event) {\n event.stopImmediatePropagation();\n}\n\nexport default function(event) {\n event.preventDefault();\n event.stopImmediatePropagation();\n}\n","import {dispatch} from \"d3-dispatch\";\nimport {dragDisable, dragEnable} from \"d3-drag\";\nimport {interpolate} from \"d3-interpolate\";\nimport {pointer, select} from \"d3-selection\";\nimport {interrupt} from \"d3-transition\";\nimport constant from \"./constant.js\";\nimport BrushEvent from \"./event.js\";\nimport noevent, {nopropagation} from \"./noevent.js\";\n\nvar MODE_DRAG = {name: \"drag\"},\n MODE_SPACE = {name: \"space\"},\n MODE_HANDLE = {name: \"handle\"},\n MODE_CENTER = {name: \"center\"};\n\nconst {abs, max, min} = Math;\n\nfunction number1(e) {\n return [+e[0], +e[1]];\n}\n\nfunction number2(e) {\n return [number1(e[0]), number1(e[1])];\n}\n\nvar X = {\n name: \"x\",\n handles: [\"w\", \"e\"].map(type),\n input: function(x, e) { return x == null ? null : [[+x[0], e[0][1]], [+x[1], e[1][1]]]; },\n output: function(xy) { return xy && [xy[0][0], xy[1][0]]; }\n};\n\nvar Y = {\n name: \"y\",\n handles: [\"n\", \"s\"].map(type),\n input: function(y, e) { return y == null ? null : [[e[0][0], +y[0]], [e[1][0], +y[1]]]; },\n output: function(xy) { return xy && [xy[0][1], xy[1][1]]; }\n};\n\nvar XY = {\n name: \"xy\",\n handles: [\"n\", \"w\", \"e\", \"s\", \"nw\", \"ne\", \"sw\", \"se\"].map(type),\n input: function(xy) { return xy == null ? null : number2(xy); },\n output: function(xy) { return xy; }\n};\n\nvar cursors = {\n overlay: \"crosshair\",\n selection: \"move\",\n n: \"ns-resize\",\n e: \"ew-resize\",\n s: \"ns-resize\",\n w: \"ew-resize\",\n nw: \"nwse-resize\",\n ne: \"nesw-resize\",\n se: \"nwse-resize\",\n sw: \"nesw-resize\"\n};\n\nvar flipX = {\n e: \"w\",\n w: \"e\",\n nw: \"ne\",\n ne: \"nw\",\n se: \"sw\",\n sw: \"se\"\n};\n\nvar flipY = {\n n: \"s\",\n s: \"n\",\n nw: \"sw\",\n ne: \"se\",\n se: \"ne\",\n sw: \"nw\"\n};\n\nvar signsX = {\n overlay: +1,\n selection: +1,\n n: null,\n e: +1,\n s: null,\n w: -1,\n nw: -1,\n ne: +1,\n se: +1,\n sw: -1\n};\n\nvar signsY = {\n overlay: +1,\n selection: +1,\n n: -1,\n e: null,\n s: +1,\n w: null,\n nw: -1,\n ne: -1,\n se: +1,\n sw: +1\n};\n\nfunction type(t) {\n return {type: t};\n}\n\n// Ignore right-click, since that should open the context menu.\nfunction defaultFilter(event) {\n return !event.ctrlKey && !event.button;\n}\n\nfunction defaultExtent() {\n var svg = this.ownerSVGElement || this;\n if (svg.hasAttribute(\"viewBox\")) {\n svg = svg.viewBox.baseVal;\n return [[svg.x, svg.y], [svg.x + svg.width, svg.y + svg.height]];\n }\n return [[0, 0], [svg.width.baseVal.value, svg.height.baseVal.value]];\n}\n\nfunction defaultTouchable() {\n return navigator.maxTouchPoints || (\"ontouchstart\" in this);\n}\n\n// Like d3.local, but with the name “__brush” rather than auto-generated.\nfunction local(node) {\n while (!node.__brush) if (!(node = node.parentNode)) return;\n return node.__brush;\n}\n\nfunction empty(extent) {\n return extent[0][0] === extent[1][0]\n || extent[0][1] === extent[1][1];\n}\n\nexport function brushSelection(node) {\n var state = node.__brush;\n return state ? state.dim.output(state.selection) : null;\n}\n\nexport function brushX() {\n return brush(X);\n}\n\nexport function brushY() {\n return brush(Y);\n}\n\nexport default function() {\n return brush(XY);\n}\n\nfunction brush(dim) {\n var extent = defaultExtent,\n filter = defaultFilter,\n touchable = defaultTouchable,\n keys = true,\n listeners = dispatch(\"start\", \"brush\", \"end\"),\n handleSize = 6,\n touchending;\n\n function brush(group) {\n var overlay = group\n .property(\"__brush\", initialize)\n .selectAll(\".overlay\")\n .data([type(\"overlay\")]);\n\n overlay.enter().append(\"rect\")\n .attr(\"class\", \"overlay\")\n .attr(\"pointer-events\", \"all\")\n .attr(\"cursor\", cursors.overlay)\n .merge(overlay)\n .each(function() {\n var extent = local(this).extent;\n select(this)\n .attr(\"x\", extent[0][0])\n .attr(\"y\", extent[0][1])\n .attr(\"width\", extent[1][0] - extent[0][0])\n .attr(\"height\", extent[1][1] - extent[0][1]);\n });\n\n group.selectAll(\".selection\")\n .data([type(\"selection\")])\n .enter().append(\"rect\")\n .attr(\"class\", \"selection\")\n .attr(\"cursor\", cursors.selection)\n .attr(\"fill\", \"#777\")\n .attr(\"fill-opacity\", 0.3)\n .attr(\"stroke\", \"#fff\")\n .attr(\"shape-rendering\", \"crispEdges\");\n\n var handle = group.selectAll(\".handle\")\n .data(dim.handles, function(d) { return d.type; });\n\n handle.exit().remove();\n\n handle.enter().append(\"rect\")\n .attr(\"class\", function(d) { return \"handle handle--\" + d.type; })\n .attr(\"cursor\", function(d) { return cursors[d.type]; });\n\n group\n .each(redraw)\n .attr(\"fill\", \"none\")\n .attr(\"pointer-events\", \"all\")\n .on(\"mousedown.brush\", started)\n .filter(touchable)\n .on(\"touchstart.brush\", started)\n .on(\"touchmove.brush\", touchmoved)\n .on(\"touchend.brush touchcancel.brush\", touchended)\n .style(\"touch-action\", \"none\")\n .style(\"-webkit-tap-highlight-color\", \"rgba(0,0,0,0)\");\n }\n\n brush.move = function(group, selection) {\n if (group.tween) {\n group\n .on(\"start.brush\", function(event) { emitter(this, arguments).beforestart().start(event); })\n .on(\"interrupt.brush end.brush\", function(event) { emitter(this, arguments).end(event); })\n .tween(\"brush\", function() {\n var that = this,\n state = that.__brush,\n emit = emitter(that, arguments),\n selection0 = state.selection,\n selection1 = dim.input(typeof selection === \"function\" ? selection.apply(this, arguments) : selection, state.extent),\n i = interpolate(selection0, selection1);\n\n function tween(t) {\n state.selection = t === 1 && selection1 === null ? null : i(t);\n redraw.call(that);\n emit.brush();\n }\n\n return selection0 !== null && selection1 !== null ? tween : tween(1);\n });\n } else {\n group\n .each(function() {\n var that = this,\n args = arguments,\n state = that.__brush,\n selection1 = dim.input(typeof selection === \"function\" ? selection.apply(that, args) : selection, state.extent),\n emit = emitter(that, args).beforestart();\n\n interrupt(that);\n state.selection = selection1 === null ? null : selection1;\n redraw.call(that);\n emit.start().brush().end();\n });\n }\n };\n\n brush.clear = function(group) {\n brush.move(group, null);\n };\n\n function redraw() {\n var group = select(this),\n selection = local(this).selection;\n\n if (selection) {\n group.selectAll(\".selection\")\n .style(\"display\", null)\n .attr(\"x\", selection[0][0])\n .attr(\"y\", selection[0][1])\n .attr(\"width\", selection[1][0] - selection[0][0])\n .attr(\"height\", selection[1][1] - selection[0][1]);\n\n group.selectAll(\".handle\")\n .style(\"display\", null)\n .attr(\"x\", function(d) { return d.type[d.type.length - 1] === \"e\" ? selection[1][0] - handleSize / 2 : selection[0][0] - handleSize / 2; })\n .attr(\"y\", function(d) { return d.type[0] === \"s\" ? selection[1][1] - handleSize / 2 : selection[0][1] - handleSize / 2; })\n .attr(\"width\", function(d) { return d.type === \"n\" || d.type === \"s\" ? selection[1][0] - selection[0][0] + handleSize : handleSize; })\n .attr(\"height\", function(d) { return d.type === \"e\" || d.type === \"w\" ? selection[1][1] - selection[0][1] + handleSize : handleSize; });\n }\n\n else {\n group.selectAll(\".selection,.handle\")\n .style(\"display\", \"none\")\n .attr(\"x\", null)\n .attr(\"y\", null)\n .attr(\"width\", null)\n .attr(\"height\", null);\n }\n }\n\n function emitter(that, args, clean) {\n var emit = that.__brush.emitter;\n return emit && (!clean || !emit.clean) ? emit : new Emitter(that, args, clean);\n }\n\n function Emitter(that, args, clean) {\n this.that = that;\n this.args = args;\n this.state = that.__brush;\n this.active = 0;\n this.clean = clean;\n }\n\n Emitter.prototype = {\n beforestart: function() {\n if (++this.active === 1) this.state.emitter = this, this.starting = true;\n return this;\n },\n start: function(event, mode) {\n if (this.starting) this.starting = false, this.emit(\"start\", event, mode);\n else this.emit(\"brush\", event);\n return this;\n },\n brush: function(event, mode) {\n this.emit(\"brush\", event, mode);\n return this;\n },\n end: function(event, mode) {\n if (--this.active === 0) delete this.state.emitter, this.emit(\"end\", event, mode);\n return this;\n },\n emit: function(type, event, mode) {\n var d = select(this.that).datum();\n listeners.call(\n type,\n this.that,\n new BrushEvent(type, {\n sourceEvent: event,\n target: brush,\n selection: dim.output(this.state.selection),\n mode,\n dispatch: listeners\n }),\n d\n );\n }\n };\n\n function started(event) {\n if (touchending && !event.touches) return;\n if (!filter.apply(this, arguments)) return;\n\n var that = this,\n type = event.target.__data__.type,\n mode = (keys && event.metaKey ? type = \"overlay\" : type) === \"selection\" ? MODE_DRAG : (keys && event.altKey ? MODE_CENTER : MODE_HANDLE),\n signX = dim === Y ? null : signsX[type],\n signY = dim === X ? null : signsY[type],\n state = local(that),\n extent = state.extent,\n selection = state.selection,\n W = extent[0][0], w0, w1,\n N = extent[0][1], n0, n1,\n E = extent[1][0], e0, e1,\n S = extent[1][1], s0, s1,\n dx = 0,\n dy = 0,\n moving,\n shifting = signX && signY && keys && event.shiftKey,\n lockX,\n lockY,\n points = Array.from(event.touches || [event], t => {\n const i = t.identifier;\n t = pointer(t, that);\n t.point0 = t.slice();\n t.identifier = i;\n return t;\n });\n\n if (type === \"overlay\") {\n if (selection) moving = true;\n const pts = [points[0], points[1] || points[0]];\n state.selection = selection = [[\n w0 = dim === Y ? W : min(pts[0][0], pts[1][0]),\n n0 = dim === X ? N : min(pts[0][1], pts[1][1])\n ], [\n e0 = dim === Y ? E : max(pts[0][0], pts[1][0]),\n s0 = dim === X ? S : max(pts[0][1], pts[1][1])\n ]];\n if (points.length > 1) move();\n } else {\n w0 = selection[0][0];\n n0 = selection[0][1];\n e0 = selection[1][0];\n s0 = selection[1][1];\n }\n\n w1 = w0;\n n1 = n0;\n e1 = e0;\n s1 = s0;\n\n var group = select(that)\n .attr(\"pointer-events\", \"none\");\n\n var overlay = group.selectAll(\".overlay\")\n .attr(\"cursor\", cursors[type]);\n\n interrupt(that);\n var emit = emitter(that, arguments, true).beforestart();\n\n if (event.touches) {\n emit.moved = moved;\n emit.ended = ended;\n } else {\n var view = select(event.view)\n .on(\"mousemove.brush\", moved, true)\n .on(\"mouseup.brush\", ended, true);\n if (keys) view\n .on(\"keydown.brush\", keydowned, true)\n .on(\"keyup.brush\", keyupped, true)\n\n dragDisable(event.view);\n }\n\n redraw.call(that);\n emit.start(event, mode.name);\n\n function moved(event) {\n for (const p of event.changedTouches || [event]) {\n for (const d of points)\n if (d.identifier === p.identifier) d.cur = pointer(p, that);\n }\n if (shifting && !lockX && !lockY && points.length === 1) {\n const point = points[0];\n if (abs(point.cur[0] - point[0]) > abs(point.cur[1] - point[1]))\n lockY = true;\n else\n lockX = true;\n }\n for (const point of points)\n if (point.cur) point[0] = point.cur[0], point[1] = point.cur[1];\n moving = true;\n noevent(event);\n move(event);\n }\n\n function move(event) {\n const point = points[0], point0 = point.point0;\n var t;\n\n dx = point[0] - point0[0];\n dy = point[1] - point0[1];\n\n switch (mode) {\n case MODE_SPACE:\n case MODE_DRAG: {\n if (signX) dx = max(W - w0, min(E - e0, dx)), w1 = w0 + dx, e1 = e0 + dx;\n if (signY) dy = max(N - n0, min(S - s0, dy)), n1 = n0 + dy, s1 = s0 + dy;\n break;\n }\n case MODE_HANDLE: {\n if (points[1]) {\n if (signX) w1 = max(W, min(E, points[0][0])), e1 = max(W, min(E, points[1][0])), signX = 1;\n if (signY) n1 = max(N, min(S, points[0][1])), s1 = max(N, min(S, points[1][1])), signY = 1;\n } else {\n if (signX < 0) dx = max(W - w0, min(E - w0, dx)), w1 = w0 + dx, e1 = e0;\n else if (signX > 0) dx = max(W - e0, min(E - e0, dx)), w1 = w0, e1 = e0 + dx;\n if (signY < 0) dy = max(N - n0, min(S - n0, dy)), n1 = n0 + dy, s1 = s0;\n else if (signY > 0) dy = max(N - s0, min(S - s0, dy)), n1 = n0, s1 = s0 + dy;\n }\n break;\n }\n case MODE_CENTER: {\n if (signX) w1 = max(W, min(E, w0 - dx * signX)), e1 = max(W, min(E, e0 + dx * signX));\n if (signY) n1 = max(N, min(S, n0 - dy * signY)), s1 = max(N, min(S, s0 + dy * signY));\n break;\n }\n }\n\n if (e1 < w1) {\n signX *= -1;\n t = w0, w0 = e0, e0 = t;\n t = w1, w1 = e1, e1 = t;\n if (type in flipX) overlay.attr(\"cursor\", cursors[type = flipX[type]]);\n }\n\n if (s1 < n1) {\n signY *= -1;\n t = n0, n0 = s0, s0 = t;\n t = n1, n1 = s1, s1 = t;\n if (type in flipY) overlay.attr(\"cursor\", cursors[type = flipY[type]]);\n }\n\n if (state.selection) selection = state.selection; // May be set by brush.move!\n if (lockX) w1 = selection[0][0], e1 = selection[1][0];\n if (lockY) n1 = selection[0][1], s1 = selection[1][1];\n\n if (selection[0][0] !== w1\n || selection[0][1] !== n1\n || selection[1][0] !== e1\n || selection[1][1] !== s1) {\n state.selection = [[w1, n1], [e1, s1]];\n redraw.call(that);\n emit.brush(event, mode.name);\n }\n }\n\n function ended(event) {\n nopropagation(event);\n if (event.touches) {\n if (event.touches.length) return;\n if (touchending) clearTimeout(touchending);\n touchending = setTimeout(function() { touchending = null; }, 500); // Ghost clicks are delayed!\n } else {\n dragEnable(event.view, moving);\n view.on(\"keydown.brush keyup.brush mousemove.brush mouseup.brush\", null);\n }\n group.attr(\"pointer-events\", \"all\");\n overlay.attr(\"cursor\", cursors.overlay);\n if (state.selection) selection = state.selection; // May be set by brush.move (on start)!\n if (empty(selection)) state.selection = null, redraw.call(that);\n emit.end(event, mode.name);\n }\n\n function keydowned(event) {\n switch (event.keyCode) {\n case 16: { // SHIFT\n shifting = signX && signY;\n break;\n }\n case 18: { // ALT\n if (mode === MODE_HANDLE) {\n if (signX) e0 = e1 - dx * signX, w0 = w1 + dx * signX;\n if (signY) s0 = s1 - dy * signY, n0 = n1 + dy * signY;\n mode = MODE_CENTER;\n move();\n }\n break;\n }\n case 32: { // SPACE; takes priority over ALT\n if (mode === MODE_HANDLE || mode === MODE_CENTER) {\n if (signX < 0) e0 = e1 - dx; else if (signX > 0) w0 = w1 - dx;\n if (signY < 0) s0 = s1 - dy; else if (signY > 0) n0 = n1 - dy;\n mode = MODE_SPACE;\n overlay.attr(\"cursor\", cursors.selection);\n move();\n }\n break;\n }\n default: return;\n }\n noevent(event);\n }\n\n function keyupped(event) {\n switch (event.keyCode) {\n case 16: { // SHIFT\n if (shifting) {\n lockX = lockY = shifting = false;\n move();\n }\n break;\n }\n case 18: { // ALT\n if (mode === MODE_CENTER) {\n if (signX < 0) e0 = e1; else if (signX > 0) w0 = w1;\n if (signY < 0) s0 = s1; else if (signY > 0) n0 = n1;\n mode = MODE_HANDLE;\n move();\n }\n break;\n }\n case 32: { // SPACE\n if (mode === MODE_SPACE) {\n if (event.altKey) {\n if (signX) e0 = e1 - dx * signX, w0 = w1 + dx * signX;\n if (signY) s0 = s1 - dy * signY, n0 = n1 + dy * signY;\n mode = MODE_CENTER;\n } else {\n if (signX < 0) e0 = e1; else if (signX > 0) w0 = w1;\n if (signY < 0) s0 = s1; else if (signY > 0) n0 = n1;\n mode = MODE_HANDLE;\n }\n overlay.attr(\"cursor\", cursors[type]);\n move();\n }\n break;\n }\n default: return;\n }\n noevent(event);\n }\n }\n\n function touchmoved(event) {\n emitter(this, arguments).moved(event);\n }\n\n function touchended(event) {\n emitter(this, arguments).ended(event);\n }\n\n function initialize() {\n var state = this.__brush || {selection: null};\n state.extent = number2(extent.apply(this, arguments));\n state.dim = dim;\n return state;\n }\n\n brush.extent = function(_) {\n return arguments.length ? (extent = typeof _ === \"function\" ? _ : constant(number2(_)), brush) : extent;\n };\n\n brush.filter = function(_) {\n return arguments.length ? (filter = typeof _ === \"function\" ? _ : constant(!!_), brush) : filter;\n };\n\n brush.touchable = function(_) {\n return arguments.length ? (touchable = typeof _ === \"function\" ? _ : constant(!!_), brush) : touchable;\n };\n\n brush.handleSize = function(_) {\n return arguments.length ? (handleSize = +_, brush) : handleSize;\n };\n\n brush.keyModifiers = function(_) {\n return arguments.length ? (keys = !!_, brush) : keys;\n };\n\n brush.on = function() {\n var value = listeners.on.apply(listeners, arguments);\n return value === listeners ? brush : value;\n };\n\n return brush;\n}\n","export default function(x) {\n return Math.abs(x = Math.round(x)) >= 1e21\n ? x.toLocaleString(\"en\").replace(/,/g, \"\")\n : x.toString(10);\n}\n\n// Computes the decimal coefficient and exponent of the specified number x with\n// significant digits p, where x is positive and p is in [1, 21] or undefined.\n// For example, formatDecimalParts(1.23) returns [\"123\", 0].\nexport function formatDecimalParts(x, p) {\n if ((i = (x = p ? x.toExponential(p - 1) : x.toExponential()).indexOf(\"e\")) < 0) return null; // NaN, ±Infinity\n var i, coefficient = x.slice(0, i);\n\n // The string returned by toExponential either has the form \\d\\.\\d+e[-+]\\d+\n // (e.g., 1.2e+3) or the form \\de[-+]\\d+ (e.g., 1e+3).\n return [\n coefficient.length > 1 ? coefficient[0] + coefficient.slice(2) : coefficient,\n +x.slice(i + 1)\n ];\n}\n","import {formatDecimalParts} from \"./formatDecimal.js\";\n\nexport default function(x) {\n return x = formatDecimalParts(Math.abs(x)), x ? x[1] : NaN;\n}\n","// [[fill]align][sign][symbol][0][width][,][.precision][~][type]\nvar re = /^(?:(.)?([<>=^]))?([+\\-( ])?([$#])?(0)?(\\d+)?(,)?(\\.\\d+)?(~)?([a-z%])?$/i;\n\nexport default function formatSpecifier(specifier) {\n if (!(match = re.exec(specifier))) throw new Error(\"invalid format: \" + specifier);\n var match;\n return new FormatSpecifier({\n fill: match[1],\n align: match[2],\n sign: match[3],\n symbol: match[4],\n zero: match[5],\n width: match[6],\n comma: match[7],\n precision: match[8] && match[8].slice(1),\n trim: match[9],\n type: match[10]\n });\n}\n\nformatSpecifier.prototype = FormatSpecifier.prototype; // instanceof\n\nexport function FormatSpecifier(specifier) {\n this.fill = specifier.fill === undefined ? \" \" : specifier.fill + \"\";\n this.align = specifier.align === undefined ? \">\" : specifier.align + \"\";\n this.sign = specifier.sign === undefined ? \"-\" : specifier.sign + \"\";\n this.symbol = specifier.symbol === undefined ? \"\" : specifier.symbol + \"\";\n this.zero = !!specifier.zero;\n this.width = specifier.width === undefined ? undefined : +specifier.width;\n this.comma = !!specifier.comma;\n this.precision = specifier.precision === undefined ? undefined : +specifier.precision;\n this.trim = !!specifier.trim;\n this.type = specifier.type === undefined ? \"\" : specifier.type + \"\";\n}\n\nFormatSpecifier.prototype.toString = function() {\n return this.fill\n + this.align\n + this.sign\n + this.symbol\n + (this.zero ? \"0\" : \"\")\n + (this.width === undefined ? \"\" : Math.max(1, this.width | 0))\n + (this.comma ? \",\" : \"\")\n + (this.precision === undefined ? \"\" : \".\" + Math.max(0, this.precision | 0))\n + (this.trim ? \"~\" : \"\")\n + this.type;\n};\n","import {formatDecimalParts} from \"./formatDecimal.js\";\n\nexport var prefixExponent;\n\nexport default function(x, p) {\n var d = formatDecimalParts(x, p);\n if (!d) return x + \"\";\n var coefficient = d[0],\n exponent = d[1],\n i = exponent - (prefixExponent = Math.max(-8, Math.min(8, Math.floor(exponent / 3))) * 3) + 1,\n n = coefficient.length;\n return i === n ? coefficient\n : i > n ? coefficient + new Array(i - n + 1).join(\"0\")\n : i > 0 ? coefficient.slice(0, i) + \".\" + coefficient.slice(i)\n : \"0.\" + new Array(1 - i).join(\"0\") + formatDecimalParts(x, Math.max(0, p + i - 1))[0]; // less than 1y!\n}\n","import {formatDecimalParts} from \"./formatDecimal.js\";\n\nexport default function(x, p) {\n var d = formatDecimalParts(x, p);\n if (!d) return x + \"\";\n var coefficient = d[0],\n exponent = d[1];\n return exponent < 0 ? \"0.\" + new Array(-exponent).join(\"0\") + coefficient\n : coefficient.length > exponent + 1 ? coefficient.slice(0, exponent + 1) + \".\" + coefficient.slice(exponent + 1)\n : coefficient + new Array(exponent - coefficient.length + 2).join(\"0\");\n}\n","import formatDecimal from \"./formatDecimal.js\";\nimport formatPrefixAuto from \"./formatPrefixAuto.js\";\nimport formatRounded from \"./formatRounded.js\";\n\nexport default {\n \"%\": (x, p) => (x * 100).toFixed(p),\n \"b\": (x) => Math.round(x).toString(2),\n \"c\": (x) => x + \"\",\n \"d\": formatDecimal,\n \"e\": (x, p) => x.toExponential(p),\n \"f\": (x, p) => x.toFixed(p),\n \"g\": (x, p) => x.toPrecision(p),\n \"o\": (x) => Math.round(x).toString(8),\n \"p\": (x, p) => formatRounded(x * 100, p),\n \"r\": formatRounded,\n \"s\": formatPrefixAuto,\n \"X\": (x) => Math.round(x).toString(16).toUpperCase(),\n \"x\": (x) => Math.round(x).toString(16)\n};\n","export default function(x) {\n return x;\n}\n","import exponent from \"./exponent.js\";\nimport formatGroup from \"./formatGroup.js\";\nimport formatNumerals from \"./formatNumerals.js\";\nimport formatSpecifier from \"./formatSpecifier.js\";\nimport formatTrim from \"./formatTrim.js\";\nimport formatTypes from \"./formatTypes.js\";\nimport {prefixExponent} from \"./formatPrefixAuto.js\";\nimport identity from \"./identity.js\";\n\nvar map = Array.prototype.map,\n prefixes = [\"y\",\"z\",\"a\",\"f\",\"p\",\"n\",\"µ\",\"m\",\"\",\"k\",\"M\",\"G\",\"T\",\"P\",\"E\",\"Z\",\"Y\"];\n\nexport default function(locale) {\n var group = locale.grouping === undefined || locale.thousands === undefined ? identity : formatGroup(map.call(locale.grouping, Number), locale.thousands + \"\"),\n currencyPrefix = locale.currency === undefined ? \"\" : locale.currency[0] + \"\",\n currencySuffix = locale.currency === undefined ? \"\" : locale.currency[1] + \"\",\n decimal = locale.decimal === undefined ? \".\" : locale.decimal + \"\",\n numerals = locale.numerals === undefined ? identity : formatNumerals(map.call(locale.numerals, String)),\n percent = locale.percent === undefined ? \"%\" : locale.percent + \"\",\n minus = locale.minus === undefined ? \"−\" : locale.minus + \"\",\n nan = locale.nan === undefined ? \"NaN\" : locale.nan + \"\";\n\n function newFormat(specifier) {\n specifier = formatSpecifier(specifier);\n\n var fill = specifier.fill,\n align = specifier.align,\n sign = specifier.sign,\n symbol = specifier.symbol,\n zero = specifier.zero,\n width = specifier.width,\n comma = specifier.comma,\n precision = specifier.precision,\n trim = specifier.trim,\n type = specifier.type;\n\n // The \"n\" type is an alias for \",g\".\n if (type === \"n\") comma = true, type = \"g\";\n\n // The \"\" type, and any invalid type, is an alias for \".12~g\".\n else if (!formatTypes[type]) precision === undefined && (precision = 12), trim = true, type = \"g\";\n\n // If zero fill is specified, padding goes after sign and before digits.\n if (zero || (fill === \"0\" && align === \"=\")) zero = true, fill = \"0\", align = \"=\";\n\n // Compute the prefix and suffix.\n // For SI-prefix, the suffix is lazily computed.\n var prefix = symbol === \"$\" ? currencyPrefix : symbol === \"#\" && /[boxX]/.test(type) ? \"0\" + type.toLowerCase() : \"\",\n suffix = symbol === \"$\" ? currencySuffix : /[%p]/.test(type) ? percent : \"\";\n\n // What format function should we use?\n // Is this an integer type?\n // Can this type generate exponential notation?\n var formatType = formatTypes[type],\n maybeSuffix = /[defgprs%]/.test(type);\n\n // Set the default precision if not specified,\n // or clamp the specified precision to the supported range.\n // For significant precision, it must be in [1, 21].\n // For fixed precision, it must be in [0, 20].\n precision = precision === undefined ? 6\n : /[gprs]/.test(type) ? Math.max(1, Math.min(21, precision))\n : Math.max(0, Math.min(20, precision));\n\n function format(value) {\n var valuePrefix = prefix,\n valueSuffix = suffix,\n i, n, c;\n\n if (type === \"c\") {\n valueSuffix = formatType(value) + valueSuffix;\n value = \"\";\n } else {\n value = +value;\n\n // Determine the sign. -0 is not less than 0, but 1 / -0 is!\n var valueNegative = value < 0 || 1 / value < 0;\n\n // Perform the initial formatting.\n value = isNaN(value) ? nan : formatType(Math.abs(value), precision);\n\n // Trim insignificant zeros.\n if (trim) value = formatTrim(value);\n\n // If a negative value rounds to zero after formatting, and no explicit positive sign is requested, hide the sign.\n if (valueNegative && +value === 0 && sign !== \"+\") valueNegative = false;\n\n // Compute the prefix and suffix.\n valuePrefix = (valueNegative ? (sign === \"(\" ? sign : minus) : sign === \"-\" || sign === \"(\" ? \"\" : sign) + valuePrefix;\n valueSuffix = (type === \"s\" ? prefixes[8 + prefixExponent / 3] : \"\") + valueSuffix + (valueNegative && sign === \"(\" ? \")\" : \"\");\n\n // Break the formatted value into the integer “value” part that can be\n // grouped, and fractional or exponential “suffix” part that is not.\n if (maybeSuffix) {\n i = -1, n = value.length;\n while (++i < n) {\n if (c = value.charCodeAt(i), 48 > c || c > 57) {\n valueSuffix = (c === 46 ? decimal + value.slice(i + 1) : value.slice(i)) + valueSuffix;\n value = value.slice(0, i);\n break;\n }\n }\n }\n }\n\n // If the fill character is not \"0\", grouping is applied before padding.\n if (comma && !zero) value = group(value, Infinity);\n\n // Compute the padding.\n var length = valuePrefix.length + value.length + valueSuffix.length,\n padding = length < width ? new Array(width - length + 1).join(fill) : \"\";\n\n // If the fill character is \"0\", grouping is applied after padding.\n if (comma && zero) value = group(padding + value, padding.length ? width - valueSuffix.length : Infinity), padding = \"\";\n\n // Reconstruct the final output based on the desired alignment.\n switch (align) {\n case \"<\": value = valuePrefix + value + valueSuffix + padding; break;\n case \"=\": value = valuePrefix + padding + value + valueSuffix; break;\n case \"^\": value = padding.slice(0, length = padding.length >> 1) + valuePrefix + value + valueSuffix + padding.slice(length); break;\n default: value = padding + valuePrefix + value + valueSuffix; break;\n }\n\n return numerals(value);\n }\n\n format.toString = function() {\n return specifier + \"\";\n };\n\n return format;\n }\n\n function formatPrefix(specifier, value) {\n var f = newFormat((specifier = formatSpecifier(specifier), specifier.type = \"f\", specifier)),\n e = Math.max(-8, Math.min(8, Math.floor(exponent(value) / 3))) * 3,\n k = Math.pow(10, -e),\n prefix = prefixes[8 + e / 3];\n return function(value) {\n return f(k * value) + prefix;\n };\n }\n\n return {\n format: newFormat,\n formatPrefix: formatPrefix\n };\n}\n","import formatLocale from \"./locale.js\";\n\nvar locale;\nexport var format;\nexport var formatPrefix;\n\ndefaultLocale({\n thousands: \",\",\n grouping: [3],\n currency: [\"$\", \"\"]\n});\n\nexport default function defaultLocale(definition) {\n locale = formatLocale(definition);\n format = locale.format;\n formatPrefix = locale.formatPrefix;\n return locale;\n}\n","export default function(grouping, thousands) {\n return function(value, width) {\n var i = value.length,\n t = [],\n j = 0,\n g = grouping[0],\n length = 0;\n\n while (i > 0 && g > 0) {\n if (length + g + 1 > width) g = Math.max(1, width - length);\n t.push(value.substring(i -= g, i + g));\n if ((length += g + 1) > width) break;\n g = grouping[j = (j + 1) % grouping.length];\n }\n\n return t.reverse().join(thousands);\n };\n}\n","export default function(numerals) {\n return function(value) {\n return value.replace(/[0-9]/g, function(i) {\n return numerals[+i];\n });\n };\n}\n","// Trims insignificant zeros, e.g., replaces 1.2000k with 1.2k.\nexport default function(s) {\n out: for (var n = s.length, i = 1, i0 = -1, i1; i < n; ++i) {\n switch (s[i]) {\n case \".\": i0 = i1 = i; break;\n case \"0\": if (i0 === 0) i0 = i; i1 = i; break;\n default: if (!+s[i]) break out; if (i0 > 0) i0 = 0; break;\n }\n }\n return i0 > 0 ? s.slice(0, i0) + s.slice(i1 + 1) : s;\n}\n","import exponent from \"./exponent.js\";\n\nexport default function(step) {\n return Math.max(0, -exponent(Math.abs(step)));\n}\n","import exponent from \"./exponent.js\";\n\nexport default function(step, value) {\n return Math.max(0, Math.max(-8, Math.min(8, Math.floor(exponent(value) / 3))) * 3 - exponent(Math.abs(step)));\n}\n","import exponent from \"./exponent.js\";\n\nexport default function(step, max) {\n step = Math.abs(step), max = Math.abs(max) - step;\n return Math.max(0, exponent(max) - exponent(step)) + 1;\n}\n","var e10 = Math.sqrt(50),\n e5 = Math.sqrt(10),\n e2 = Math.sqrt(2);\n\nexport default function(start, stop, count) {\n var reverse,\n i = -1,\n n,\n ticks,\n step;\n\n stop = +stop, start = +start, count = +count;\n if (start === stop && count > 0) return [start];\n if (reverse = stop < start) n = start, start = stop, stop = n;\n if ((step = tickIncrement(start, stop, count)) === 0 || !isFinite(step)) return [];\n\n if (step > 0) {\n start = Math.ceil(start / step);\n stop = Math.floor(stop / step);\n ticks = new Array(n = Math.ceil(stop - start + 1));\n while (++i < n) ticks[i] = (start + i) * step;\n } else {\n step = -step;\n start = Math.ceil(start * step);\n stop = Math.floor(stop * step);\n ticks = new Array(n = Math.ceil(stop - start + 1));\n while (++i < n) ticks[i] = (start + i) / step;\n }\n\n if (reverse) ticks.reverse();\n\n return ticks;\n}\n\nexport function tickIncrement(start, stop, count) {\n var step = (stop - start) / Math.max(0, count),\n power = Math.floor(Math.log(step) / Math.LN10),\n error = step / Math.pow(10, power);\n return power >= 0\n ? (error >= e10 ? 10 : error >= e5 ? 5 : error >= e2 ? 2 : 1) * Math.pow(10, power)\n : -Math.pow(10, -power) / (error >= e10 ? 10 : error >= e5 ? 5 : error >= e2 ? 2 : 1);\n}\n\nexport function tickStep(start, stop, count) {\n var step0 = Math.abs(stop - start) / Math.max(0, count),\n step1 = Math.pow(10, Math.floor(Math.log(step0) / Math.LN10)),\n error = step0 / step1;\n if (error >= e10) step1 *= 10;\n else if (error >= e5) step1 *= 5;\n else if (error >= e2) step1 *= 2;\n return stop < start ? -step1 : step1;\n}\n","export default function(a, b) {\n return a < b ? -1 : a > b ? 1 : a >= b ? 0 : NaN;\n}\n","import ascending from \"./ascending.js\";\n\nexport default function(f) {\n let delta = f;\n let compare = f;\n\n if (f.length === 1) {\n delta = (d, x) => f(d) - x;\n compare = ascendingComparator(f);\n }\n\n function left(a, x, lo, hi) {\n if (lo == null) lo = 0;\n if (hi == null) hi = a.length;\n while (lo < hi) {\n const mid = (lo + hi) >>> 1;\n if (compare(a[mid], x) < 0) lo = mid + 1;\n else hi = mid;\n }\n return lo;\n }\n\n function right(a, x, lo, hi) {\n if (lo == null) lo = 0;\n if (hi == null) hi = a.length;\n while (lo < hi) {\n const mid = (lo + hi) >>> 1;\n if (compare(a[mid], x) > 0) hi = mid;\n else lo = mid + 1;\n }\n return lo;\n }\n\n function center(a, x, lo, hi) {\n if (lo == null) lo = 0;\n if (hi == null) hi = a.length;\n const i = left(a, x, lo, hi - 1);\n return i > lo && delta(a[i - 1], x) > -delta(a[i], x) ? i - 1 : i;\n }\n\n return {left, center, right};\n}\n\nfunction ascendingComparator(f) {\n return (d, x) => ascending(f(d), x);\n}\n","import ascending from \"./ascending.js\";\nimport bisector from \"./bisector.js\";\nimport number from \"./number.js\";\n\nconst ascendingBisect = bisector(ascending);\nexport const bisectRight = ascendingBisect.right;\nexport const bisectLeft = ascendingBisect.left;\nexport const bisectCenter = bisector(number).center;\nexport default bisectRight;\n","export default function(x) {\n return x === null ? NaN : +x;\n}\n\nexport function* numbers(values, valueof) {\n if (valueof === undefined) {\n for (let value of values) {\n if (value != null && (value = +value) >= value) {\n yield value;\n }\n }\n } else {\n let index = -1;\n for (let value of values) {\n if ((value = valueof(value, ++index, values)) != null && (value = +value) >= value) {\n yield value;\n }\n }\n }\n}\n","export default function(a, b) {\n return a = +a, b = +b, function(t) {\n return Math.round(a * (1 - t) + b * t);\n };\n}\n","export default function number(x) {\n return +x;\n}\n","import {bisect} from \"d3-array\";\nimport {interpolate as interpolateValue, interpolateNumber, interpolateRound} from \"d3-interpolate\";\nimport constant from \"./constant.js\";\nimport number from \"./number.js\";\n\nvar unit = [0, 1];\n\nexport function identity(x) {\n return x;\n}\n\nfunction normalize(a, b) {\n return (b -= (a = +a))\n ? function(x) { return (x - a) / b; }\n : constant(isNaN(b) ? NaN : 0.5);\n}\n\nfunction clamper(a, b) {\n var t;\n if (a > b) t = a, a = b, b = t;\n return function(x) { return Math.max(a, Math.min(b, x)); };\n}\n\n// normalize(a, b)(x) takes a domain value x in [a,b] and returns the corresponding parameter t in [0,1].\n// interpolate(a, b)(t) takes a parameter t in [0,1] and returns the corresponding range value x in [a,b].\nfunction bimap(domain, range, interpolate) {\n var d0 = domain[0], d1 = domain[1], r0 = range[0], r1 = range[1];\n if (d1 < d0) d0 = normalize(d1, d0), r0 = interpolate(r1, r0);\n else d0 = normalize(d0, d1), r0 = interpolate(r0, r1);\n return function(x) { return r0(d0(x)); };\n}\n\nfunction polymap(domain, range, interpolate) {\n var j = Math.min(domain.length, range.length) - 1,\n d = new Array(j),\n r = new Array(j),\n i = -1;\n\n // Reverse descending domains.\n if (domain[j] < domain[0]) {\n domain = domain.slice().reverse();\n range = range.slice().reverse();\n }\n\n while (++i < j) {\n d[i] = normalize(domain[i], domain[i + 1]);\n r[i] = interpolate(range[i], range[i + 1]);\n }\n\n return function(x) {\n var i = bisect(domain, x, 1, j) - 1;\n return r[i](d[i](x));\n };\n}\n\nexport function copy(source, target) {\n return target\n .domain(source.domain())\n .range(source.range())\n .interpolate(source.interpolate())\n .clamp(source.clamp())\n .unknown(source.unknown());\n}\n\nexport function transformer() {\n var domain = unit,\n range = unit,\n interpolate = interpolateValue,\n transform,\n untransform,\n unknown,\n clamp = identity,\n piecewise,\n output,\n input;\n\n function rescale() {\n var n = Math.min(domain.length, range.length);\n if (clamp !== identity) clamp = clamper(domain[0], domain[n - 1]);\n piecewise = n > 2 ? polymap : bimap;\n output = input = null;\n return scale;\n }\n\n function scale(x) {\n return isNaN(x = +x) ? unknown : (output || (output = piecewise(domain.map(transform), range, interpolate)))(transform(clamp(x)));\n }\n\n scale.invert = function(y) {\n return clamp(untransform((input || (input = piecewise(range, domain.map(transform), interpolateNumber)))(y)));\n };\n\n scale.domain = function(_) {\n return arguments.length ? (domain = Array.from(_, number), rescale()) : domain.slice();\n };\n\n scale.range = function(_) {\n return arguments.length ? (range = Array.from(_), rescale()) : range.slice();\n };\n\n scale.rangeRound = function(_) {\n return range = Array.from(_), interpolate = interpolateRound, rescale();\n };\n\n scale.clamp = function(_) {\n return arguments.length ? (clamp = _ ? true : identity, rescale()) : clamp !== identity;\n };\n\n scale.interpolate = function(_) {\n return arguments.length ? (interpolate = _, rescale()) : interpolate;\n };\n\n scale.unknown = function(_) {\n return arguments.length ? (unknown = _, scale) : unknown;\n };\n\n return function(t, u) {\n transform = t, untransform = u;\n return rescale();\n };\n}\n\nexport default function continuous() {\n return transformer()(identity, identity);\n}\n","export default function constants(x) {\n return function() {\n return x;\n };\n}\n","export function initRange(domain, range) {\n switch (arguments.length) {\n case 0: break;\n case 1: this.range(domain); break;\n default: this.range(range).domain(domain); break;\n }\n return this;\n}\n\nexport function initInterpolator(domain, interpolator) {\n switch (arguments.length) {\n case 0: break;\n case 1: {\n if (typeof domain === \"function\") this.interpolator(domain);\n else this.range(domain);\n break;\n }\n default: {\n this.domain(domain);\n if (typeof interpolator === \"function\") this.interpolator(interpolator);\n else this.range(interpolator);\n break;\n }\n }\n return this;\n}\n","import {ticks, tickIncrement} from \"d3-array\";\nimport continuous, {copy} from \"./continuous.js\";\nimport {initRange} from \"./init.js\";\nimport tickFormat from \"./tickFormat.js\";\n\nexport function linearish(scale) {\n var domain = scale.domain;\n\n scale.ticks = function(count) {\n var d = domain();\n return ticks(d[0], d[d.length - 1], count == null ? 10 : count);\n };\n\n scale.tickFormat = function(count, specifier) {\n var d = domain();\n return tickFormat(d[0], d[d.length - 1], count == null ? 10 : count, specifier);\n };\n\n scale.nice = function(count) {\n if (count == null) count = 10;\n\n var d = domain();\n var i0 = 0;\n var i1 = d.length - 1;\n var start = d[i0];\n var stop = d[i1];\n var prestep;\n var step;\n var maxIter = 10;\n\n if (stop < start) {\n step = start, start = stop, stop = step;\n step = i0, i0 = i1, i1 = step;\n }\n \n while (maxIter-- > 0) {\n step = tickIncrement(start, stop, count);\n if (step === prestep) {\n d[i0] = start\n d[i1] = stop\n return domain(d);\n } else if (step > 0) {\n start = Math.floor(start / step) * step;\n stop = Math.ceil(stop / step) * step;\n } else if (step < 0) {\n start = Math.ceil(start * step) / step;\n stop = Math.floor(stop * step) / step;\n } else {\n break;\n }\n prestep = step;\n }\n\n return scale;\n };\n\n return scale;\n}\n\nexport default function linear() {\n var scale = continuous();\n\n scale.copy = function() {\n return copy(scale, linear());\n };\n\n initRange.apply(scale, arguments);\n\n return linearish(scale);\n}\n","import {tickStep} from \"d3-array\";\nimport {format, formatPrefix, formatSpecifier, precisionFixed, precisionPrefix, precisionRound} from \"d3-format\";\n\nexport default function tickFormat(start, stop, count, specifier) {\n var step = tickStep(start, stop, count),\n precision;\n specifier = formatSpecifier(specifier == null ? \",f\" : specifier);\n switch (specifier.type) {\n case \"s\": {\n var value = Math.max(Math.abs(start), Math.abs(stop));\n if (specifier.precision == null && !isNaN(precision = precisionPrefix(step, value))) specifier.precision = precision;\n return formatPrefix(specifier, value);\n }\n case \"\":\n case \"e\":\n case \"g\":\n case \"p\":\n case \"r\": {\n if (specifier.precision == null && !isNaN(precision = precisionRound(step, Math.max(Math.abs(start), Math.abs(stop))))) specifier.precision = precision - (specifier.type === \"e\");\n break;\n }\n case \"f\":\n case \"%\": {\n if (specifier.precision == null && !isNaN(precision = precisionFixed(step))) specifier.precision = precision - (specifier.type === \"%\") * 2;\n break;\n }\n }\n return format(specifier);\n}\n","var organismMetadata = {\n 9606: {\n commonName: 'Human',\n scientificName: 'Homo sapiens',\n assemblies: {\n default: 'GCF_000001405.26', // GRCh38\n GRCh38: 'GCF_000001405.26',\n GRCh37: 'GCF_000001405.13',\n NCBI36: 'GCF_000001405.12'\n },\n hasGeneCache: true\n },\n 10090: {\n commonName: 'Mouse',\n scientificName: 'Mus musculus',\n assemblies: {\n default: 'GCF_000001635.20', // GRCm38\n GRCm38: 'GCF_000001635.20',\n MGSCv37: 'GCF_000001635.18'\n },\n hasGeneCache: true\n },\n 9598: {\n commonName: 'Chimpanzee',\n scientificName: 'Pan troglodytes',\n assemblies: {\n 'default': 'GCF_000001515.7',\n 'Pan_tro 3.0': 'GCF_000001515.7'\n },\n hasGeneCache: true\n },\n 10116: {\n commonName: 'Rat',\n scientificName: 'Rattus norvegicus',\n assemblies: {\n 'default': 'GCF_000001895.5',\n 'Rnor_6.0': 'GCF_000001895.5'\n },\n hasGeneCache: true\n },\n 3702: {\n commonName: 'Thale cress',\n scientificName: 'Arabidopsis thaliana',\n assemblies: {\n default: 'GCF_000001735.3', // TAIR10\n TAIR10: 'GCF_000001735.3'\n }\n },\n 4530: {\n commonName: 'Rice',\n scientificName: 'Oryza sativa',\n assemblies: {\n 'default': 'GCA_001433935.1',\n 'IRGSP-1.0': 'GCA_001433935.1'\n }\n },\n 4577: {\n commonName: 'Maize',\n scientificName: 'Zea mays',\n assemblies: {\n 'default': 'GCA_000005005.5',\n 'IRGSP-1.0': 'GCA_001433935.1'\n }\n },\n 4641: {\n commonName: 'Banana',\n scientificName: 'Musa acuminata',\n assemblies: {\n default: 'mock'\n }\n },\n 7227: {\n commonName: 'Fly',\n scientificName: 'Drosophila melanogaster',\n assemblies: {\n 'default': 'GCA_000001215.4',\n 'Release 6 plus ISO1 MT': 'GCA_000001215.4'\n }\n },\n 7165: {\n commonName: 'Mosquito',\n scientificName: 'Anopheles gambiae',\n assemblies: {\n default: 'GCF_000005575.2'\n }\n },\n 746128: {\n commonName: 'Aspergillis fumigatus',\n scientificName: 'Aspergillis fumigatus',\n assemblies: {\n default: 'GCF_000002655.1'\n }\n },\n 227321: {\n scientificName: 'Aspergillus nidulans',\n assemblies: {\n default: 'GCF_000149205.2'\n }\n },\n 5061: {\n commonName: 'black mold',\n scientificName: 'Aspergillus niger',\n assemblies: {\n default: 'GCF_003184595.1'\n }\n },\n 5062: {\n commonName: 'koji',\n scientificName: 'Aspergillus oryzae',\n assemblies: {\n default: 'GCF_000184455.2'\n }\n },\n 15368: {\n commonName: 'stiff brome',\n scientificName: 'Brachypodium distachyon',\n assemblies: {\n default: 'GCF_000005505.3'\n }\n },\n 60711: {\n commonName: 'green monkey',\n scientificName: 'Chlorocebus sabaeus',\n assemblies: {\n default: 'GCF_015252025.1'\n }\n },\n 7719: {\n commonName: 'Vase tunicate',\n scientificName: 'Ciona intestinalis',\n assemblies: {\n default: 'GCF_000224145.3'\n }\n },\n 9685: {\n commonName: 'Cat',\n scientificName: 'Felis catus',\n assemblies: {\n default: 'GCF_000181335.3'\n },\n hasGeneCache: true\n },\n 9031: {\n commonName: 'Chicken',\n scientificName: 'Gallus gallus',\n assemblies: {\n default: 'GCF_000002315.6'\n },\n hasGeneCache: true\n },\n 9593: {\n commonName: 'Gorilla',\n scientificName: 'Gorilla gorilla',\n assemblies: {\n default: 'GCF_008122165.1'\n }\n },\n 4513: {\n commonName: 'Barley',\n scientificName: 'Hordeum vulgare',\n assemblies: {\n default: 'GCA_901482405.1'\n }\n },\n 9541: {\n commonName: 'Crab-eating macaque',\n scientificName: 'Macaca fascicularis',\n assemblies: {\n default: 'GCF_000364345.1'\n },\n hasGeneCache: true\n },\n 9544: {\n commonName: 'Rhesus macaque',\n scientificName: 'Macaca mulatta',\n assemblies: {\n default: 'GCF_003339765.1'\n },\n hasGeneCache: true\n },\n 9597: {\n commonName: 'Bonobo',\n scientificName: 'Pan paniscus',\n assemblies: {\n default: 'GCF_013052645.1'\n }\n },\n 9615: {\n commonName: 'Dog',\n scientificName: 'Canis lupus familiaris',\n assemblies: {\n default: 'GCF_014441545.1'\n },\n hasGeneCache: true\n },\n 4932: {\n commonName: 'Yeast',\n scientificName: 'Saccharomyces cerevisiae',\n assemblies: {\n default: 'GCA_000146045.2',\n R64: 'GCA_000146045.2'\n }\n },\n 5833: {\n commonName: 'malaria parasite',\n scientificName: 'Plasmodium falciparum',\n assemblies: {\n default: 'GCA_000002765.3',\n GCA_000002765: 'GCA_000002765.3'\n }\n },\n 6239: {\n commonName: 'worm',\n scientificName: 'Caenorhabditis elegans',\n assemblies: {\n default: 'GCF_000002985.6'\n },\n hasGeneCache: true\n },\n 4081: {\n commonName: 'tomato',\n scientificName: 'Solanum lycopersicum',\n assemblies: {\n default: 'GCF_000188115.4'\n }\n },\n 4072: {\n commonName: 'pepper',\n scientificName: 'Capsicum annuum',\n assemblies: {\n default: 'GCF_000710875.1'\n }\n }\n};\n\nexport {organismMetadata};\n","var staticColors, staticCss, staticGradients;\n\n// Gradient colors for each class, for polished rendering\nstaticColors = [\n ['gneg', '#FFF', '#FFF', '#DDD'],\n ['gpos25', '#C8C8C8', '#DDD', '#BBB'],\n ['gpos33', '#BBB', '#BBB', '#AAA'],\n ['gpos50', '#999', '#AAA', '#888'],\n ['gpos66', '#888', '#888', '#666'],\n ['gpos75', '#777', '#777', '#444'],\n ['gpos100', '#444', '#666', '#000'],\n ['acen', '#FEE', '#FEE', '#FDD'],\n ['noBands', '#BBB', '#BBB', '#AAA']\n];\n\nstaticCss =\n '#_ideogram {padding-left: 5px;} ' +\n '#_ideogram .labeled {padding-left: 15px;} ' +\n '#_ideogram.labeledLeft {padding-left: 15px; padding-top: 15px;} ' +\n // Tahoma has great readability and space utilization at small sizes\n // More: http://ux.stackexchange.com/a/3334\n '#_ideogram text {font: 9px Tahoma; fill: #000;} ' +\n '#_ideogram .italic {font-style: italic;} ' +\n '#_ideogram .chromosome {cursor: pointer; fill: #AAA;}' +\n '#_ideogram.no-rotate .chromosome {cursor: default;} ' +\n '#_ideogram .chrLabel, #_ideogram .annot {cursor: pointer;}' +\n '#_ideogram .chrSetLabel {font-weight: bolder;}' +\n '#_ideogram .ghost {opacity: 0.2;}' +\n '#_ideogram .hidden {display: none;}' +\n '#_ideogram .bandLabelStalk line {stroke: #AAA; stroke-width: 1;}' +\n '#_ideogram .syntenyBorder {stroke:#AAA;stroke-width:1;}' +\n '#_ideogram rect.cursor {' +\n ' fill: #F00;' +\n ' stroke: #F00;' +\n ' fill-opacity: .3;' +\n ' shape-rendering: crispEdges;' +\n '}' +\n '#_ideogram .brush .selection {' +\n ' fill: #F00;' +\n ' stroke: #F00;' +\n ' fill-opacity: .3;' +\n ' shape-rendering: crispEdges;' +\n '}' +\n '#_ideogram .noBands {fill: #AAA;}' +\n // NCBI stain density colors\n '#_ideogram .gneg {fill: #FFF}' +\n '#_ideogram .gpos25 {fill: #BBB}' +\n '#_ideogram .gpos33 {fill: #AAA}' +\n '#_ideogram .gpos50 {fill: #888}' +\n '#_ideogram .gpos66 {fill: #666}' +\n '#_ideogram .gpos75 {fill: #444}' +\n '#_ideogram .gpos100 {fill: #000}' +\n '#_ideogram .gpos {fill: #000}' +\n '#_ideogram .acen {fill: #FDD}' +\n '#_ideogram .stalk {fill: #CCE;}' +\n '#_ideogram .gvar {fill: #DDF}' +\n // Used when overlaid with annotations\n '#_ideogram.faint .gneg {fill: #FFF}' +\n '#_ideogram.faint .gpos25 {fill: #EEE}' +\n '#_ideogram.faint .gpos33 {fill: #EEE}' +\n '#_ideogram.faint .gpos50 {fill: #EEE}' +\n '#_ideogram.faint .gpos66 {fill: #EEE}' +\n '#_ideogram.faint .gpos75 {fill: #EEE}' +\n '#_ideogram.faint .gpos100 {fill: #DDD}' +\n '#_ideogram.faint .gpos {fill: #DDD}' +\n '#_ideogram.faint .acen {fill: #FEE}' +\n '#_ideogram.faint .stalk {fill: #EEF;}' +\n '#_ideogram.faint .gvar {fill: #EEF}' +\n // For sheen, i.e. the soft shine in chromosomes\n '#_ideogram .gneg {fill: url(\"#gneg\")} ' +\n '#_ideogram .gpos25 {fill: url(\"#gpos25\")} ' +\n '#_ideogram .gpos33 {fill: url(\"#gpos33\")} ' +\n '#_ideogram .gpos50 {fill: url(\"#gpos50\")} ' +\n '#_ideogram .gpos66 {fill: url(\"#gpos66\")} ' +\n '#_ideogram .gpos75 {fill: url(\"#gpos75\")} ' +\n '#_ideogram .gpos100 {fill: url(\"#gpos100\")} ' +\n '#_ideogram .gpos {fill: url(\"#gpos100\")} ' +\n '#_ideogram .acen {fill: url(\"#acen\")} ' +\n '#_ideogram .stalk {fill: url(\"#stalk\")} ' +\n '#_ideogram .gvar {fill: url(\"#gvar\")} ' +\n '#_ideogram .noBands {fill: url(\"#noBands\")} ' +\n '#_ideogram .chromosome {fill: url(\"#noBands\")} ';\n\nstaticGradients =\n '' +\n ' ' +\n '' +\n '' +\n '' +\n ' ' +\n '' +\n '';\n\nexport {staticColors, staticCss, staticGradients};\n","/**\n * @fileoverview A collection of Ideogram methods that don't fit elsewhere.\n */\n\nimport {select, selectAll} from 'd3-selection';\nimport * as d3fetch from 'd3-fetch';\nimport * as d3brush from 'd3-brush';\nimport * as d3dispatch from 'd3-dispatch';\nimport * as d3format from 'd3-format';\nimport {scaleLinear} from 'd3-scale';\nimport {max} from 'd3-array';\n\nimport {organismMetadata} from './init/organism-metadata';\n\nvar d3 = Object.assign(\n {}, d3fetch, d3brush, d3dispatch, d3format\n);\n\nd3.select = select;\nd3.selectAll = selectAll;\nd3.scaleLinear = scaleLinear;\nd3.max = max;\n\n/**\n * Is the assembly in this.config an NCBI Assembly accession?\n *\n * @returns {boolean}\n */\nfunction assemblyIsAccession() {\n return (\n 'assembly' in this.config &&\n /(GCF_|GCA_)/.test(this.config.assembly)\n );\n}\n\n/**\n * Is the assembly in this.config not from GenBank?\n *\n * @returns {boolean}\n */\nfunction hasNonGenBankAssembly(ideo) {\n return (\n 'assembly' in ideo.config &&\n /(GCA_)/.test(ideo.config.assembly) === false\n );\n}\n\n/**\n * Is the assembly in this.config from GenBank?\n *\n * @returns {boolean}\n */\nfunction hasGenBankAssembly(ideo) {\n return (\n 'assembly' in ideo.config &&\n /(GCA_)/.test(ideo.config.assembly)\n );\n}\n\nfunction getDir(dir) {\n var script, tmp, protocol, dataDir, ideogramInLeaf,\n scripts = document.scripts,\n version = Ideogram.version;\n\n if (location.pathname.includes('/examples/vanilla/') === false) {\n return (\n `https://cdn.jsdelivr.net/npm/ideogram@${version}/dist/data/${dir}`\n );\n }\n\n for (var i = 0; i < scripts.length; i++) {\n script = scripts[i];\n ideogramInLeaf = /ideogram/.test(script.src.split('/').slice(-1));\n if ('src' in script && ideogramInLeaf) {\n tmp = script.src.split('//');\n protocol = tmp[0];\n tmp = '/' + tmp[1].split('/').slice(0, -2).join('/');\n dataDir = protocol + '//' + tmp + '/data/' + dir;\n return dataDir;\n }\n }\n\n return '../data/' + dir;\n}\n\n/** Try request, and if failed then retry with URL lacking extension */\nfunction fetchWithRetry(url, isRetry=false) {\n return fetch(url)\n .then((response) => {\n if (response.ok) {\n return response;\n } else {\n if (isRetry === false) {\n var urlWithoutExtension = url.replace('.json', '');\n return fetchWithRetry(urlWithoutExtension, true);\n } else {\n throw Error('Fetch failed for ' + url);\n }\n }\n });\n}\n\n/**\n * Returns directory used to fetch data for bands and annotations\n *\n * This simplifies ideogram configuration. By default, the dataDir is\n * set to an external CDN unless we're serving from the local Ideogram\n * working directory\n *\n * @returns {String}\n */\nfunction getDataDir() {\n return getDir('bands/native/');\n}\n\n/**\n * Rounds a float (e.g. SVG coordinate) to two decimal places\n *\n * @param coord Floating-point number, e.g. 42.1234567890\n * @returns {number} Rounded value, e.g. 42.12\n */\nfunction round(coord) {\n // Per http://stackoverflow.com/a/9453447, below method is fastest\n return Math.round(coord * 100) / 100;\n}\n\nfunction onDidRotate(chrModel) {\n call(this.onDidRotateCallback, chrModel);\n}\n\n/**\n * Get ideogram SVG container\n */\nfunction getSvg() {\n return d3.select(this.selector).node();\n}\n\n/** Request data with Ideogram's authorization bearer token */\nfunction fetchWithAuth(url, contentType) {\n var ideo = this,\n config = ideo.config,\n headers = new Headers();\n\n if (config.accessToken) {\n headers = new Headers({Authorization: 'Bearer ' + config.accessToken});\n }\n\n if (contentType === 'text') {\n return d3.text(url, {headers: headers});\n } else {\n return d3.json(url, {headers: headers});\n }\n}\n\n/** getTaxid(), but without need to initialize ideogram */\nfunction getEarlyTaxid(name) {\n name = slug(name);\n for (const taxid in organismMetadata) {\n const organism = organismMetadata[taxid];\n const commonName = slug(organism.commonName);\n const scientificName = slug(organism.scientificName);\n if (commonName === name || scientificName === name) {\n return taxid;\n }\n }\n\n return null;\n}\n\n/**\n * Get organism's taxid (NCBI Taxonomy ID) given its common or scientific name\n */\nfunction getTaxid(name) {\n var organism, taxid, commonName, scientificName,\n ideo = this,\n organisms = ideo.organisms;\n\n name = slug(name);\n\n for (taxid in organisms) {\n organism = organisms[taxid];\n commonName = slug(organism.commonName);\n scientificName = slug(organism.scientificName);\n if (commonName === name || scientificName === name) {\n return taxid;\n }\n }\n\n return null;\n}\n\n/**\n * Get organism's common name given its taxid\n */\nfunction getCommonName(taxid) {\n var ideo = this;\n if (taxid in ideo.organisms) {\n return ideo.organisms[taxid].commonName;\n }\n return null;\n}\n\n/**\n * Get organism's scientific name given its taxid\n */\nfunction getScientificName(taxid) {\n var ideo = this;\n if (taxid in ideo.organisms) {\n return ideo.organisms[taxid].scientificName;\n }\n return null;\n}\n\n/**\n* Examples:\n* \"Homo sapiens\" -> \"homo-sapiens\"\n* \"Canis lupus familiaris\" -> \"canis-lupus-familiaris\"\n*/\nfunction slug(value) {\n if (typeof value === 'undefined') return '';\n return value.toLowerCase().replace(/ /g, '-');\n}\n\n// Determine if a string is a Roman numeral\n// From https://stackoverflow.com/a/48601418\nfunction isRoman(s) {\n // http://stackoverflow.com/a/267405/1447675\n return /^M{0,4}(CM|CD|D?C{0,3})(XC|XL|L?X{0,3})(IX|IV|V?I{0,3})$/i.test(s);\n}\n\n// Convert Roman numeral to integer\n// From https://stackoverflow.com/a/48601418\nfunction parseRoman(s) {\n var val = {M: 1000, D: 500, C: 100, L: 50, X: 10, V: 5, I: 1};\n return s.toUpperCase().split('').reduce(function(r, a, i, aa) {\n return val[a] < val[aa[i + 1]] ? r - val[a] : r + val[a];\n }, 0);\n}\n\n/**\n* Download a PNG image of the ideogram\n*\n* Includes any annotations, but not legend.\n*/\nfunction downloadPng(ideo) {\n var ideoSvg = document.querySelector(ideo.selector);\n\n // Create a hidden canvas. This will contain the raster image to download.\n var canvas = document.createElement('canvas');\n var canvasId = '_ideo-undisplayed-dl-canvas';\n canvas.setAttribute('style', 'display: none');\n canvas.setAttribute('id', canvasId);\n var width = ideoSvg.width.baseVal.value + 30;\n var ideoSvgClone = ideoSvg.cloneNode(true);\n ideoSvgClone.style.left = '';\n canvas.setAttribute('width', width);\n document.body.appendChild(canvas);\n\n // Called after PNG image is created from data URL\n function triggerDownload(imgUrl) {\n var evt = new MouseEvent('click', {\n view: window,\n bubbles: false,\n cancelable: true\n });\n\n var a = document.createElement('a');\n a.setAttribute('download', 'ideogram.png');\n a.setAttribute('href', imgUrl);\n a.setAttribute('target', '_blank');\n\n // Enables easy testing\n a.setAttribute('id', '_ideo-undisplayed-dl-image-link');\n a.setAttribute('style', 'display: none;');\n document.body.appendChild(a);\n\n a.dispatchEvent(evt);\n canvas.remove();\n }\n\n var canvas = document.getElementById(canvasId);\n\n // Enlarge canvas and disable smoothing, for higher resolution PNG\n canvas.width *= 2;\n canvas.height *= 2;\n var ctx = canvas.getContext('2d');\n ctx.setTransform(2, 0, 0, 2, 0, 0);\n ctx.imageSmoothingEnabled = false;\n\n var data = (new XMLSerializer()).serializeToString(ideoSvgClone);\n var domUrl = window.URL || window.webkitURL || window;\n\n var img = new Image();\n var svgBlob = new Blob([data], {type: 'image/svg+xml;charset=utf-8'});\n var url = domUrl.createObjectURL(svgBlob);\n\n img.onload = function() {\n ctx.drawImage(img, 0, 0);\n domUrl.revokeObjectURL(url);\n\n var imgUrl = canvas\n .toDataURL('image/png')\n .replace('image/png', 'image/octet-stream');\n\n triggerDownload(imgUrl);\n };\n\n img.src = url;\n}\n\n\nfunction getFont(ideo) {\n const config = ideo.config;\n\n let family = 'sans-serif';\n if (config.fontFamily) {\n family = config.fontFamily;\n }\n\n const labelSize = config.annotLabelSize ? config.annotLabelSize : 13;\n const font = '600 ' + labelSize + 'px ' + family;\n\n return font;\n}\n\n/**\n * Get width and height of given text in pixels.\n *\n * Background: https://erikonarheim.com/posts/canvas-text-metrics/\n */\nfunction getTextSize(text, ideo) {\n var font = getFont(ideo);\n\n // re-use canvas object for better performance\n var canvas =\n getTextSize.canvas ||\n (getTextSize.canvas = document.createElement('canvas'));\n var context = canvas.getContext('2d');\n context.font = font;\n var metrics = context.measureText(text);\n\n // metrics.width is less precise than technique below\n var right = metrics.actualBoundingBoxRight;\n var left = metrics.actualBoundingBoxLeft;\n var width = Math.abs(left) + Math.abs(right);\n\n const height =\n Math.abs(metrics.actualBoundingBoxAscent) +\n Math.abs(metrics.actualBoundingBoxDescent);\n\n return {width, height};\n}\n\nexport {\n assemblyIsAccession, hasNonGenBankAssembly, hasGenBankAssembly, getDataDir,\n getDir, round, onDidRotate, getSvg, d3, getEarlyTaxid, getTaxid,\n getCommonName, getScientificName, slug, isRoman, parseRoman, downloadPng,\n fetchWithRetry, getTextSize, getFont,\n fetchWithAuth as fetch\n};\n","import array from \"./array.js\";\nimport {Selection, root} from \"./selection/index.js\";\n\nexport default function(selector) {\n return typeof selector === \"string\"\n ? new Selection([document.querySelectorAll(selector)], [document.documentElement])\n : new Selection([selector == null ? [] : array(selector)], root);\n}\n","export default function max(values, valueof) {\n let max;\n if (valueof === undefined) {\n for (const value of values) {\n if (value != null\n && (max < value || (max === undefined && value >= value))) {\n max = value;\n }\n }\n } else {\n let index = -1;\n for (let value of values) {\n if ((value = valueof(value, ++index, values)) != null\n && (max < value || (max === undefined && value >= value))) {\n max = value;\n }\n }\n }\n return max;\n}\n","import {organismMetadata} from './organism-metadata';\nimport {staticCss} from './../bands/styles';\n\nfunction configurePloidy(ideo) {\n if (!ideo.config.ploidy) ideo.config.ploidy = 1;\n\n if (ideo.config.ploidy > 1) {\n ideo.sexChromosomes = {};\n if (!ideo.config.sex) {\n // Default to 'male' per human, mouse reference genomes.\n // TODO: The default sex value should probably be the heterogametic sex,\n // i.e. whichever sex has allosomes that differ in morphology.\n // In mammals and most insects that is the male.\n // However, in birds and reptiles, that is female.\n ideo.config.sex = 'male';\n }\n if (ideo.config.ploidy === 2 && !ideo.config.ancestors) {\n ideo.config.ancestors = {M: '#ffb6c1', P: '#add8e6'};\n ideo.config.ploidyDesc = 'MP';\n }\n }\n}\n\nfunction configureHeight(ideo) {\n var container, rect, chrHeight;\n\n if (!ideo.config.chrHeight) {\n container = ideo.config.container;\n rect = document.querySelector(container).getBoundingClientRect();\n\n if (ideo.config.orientation === 'vertical') {\n chrHeight = rect.height;\n } else {\n chrHeight = rect.width;\n }\n\n if (container === 'body' || chrHeight === 0) chrHeight = 400;\n ideo.config.chrHeight = chrHeight;\n }\n}\n\nfunction configureWidth(ideo) {\n var chrWidth, chrHeight;\n\n if (!ideo.config.chrWidth) {\n chrWidth = 10;\n chrHeight = ideo.config.chrHeight;\n\n if (chrHeight < 900 && chrHeight > 500) {\n chrWidth = Math.round(chrHeight / 40);\n } else if (chrHeight >= 900) {\n chrWidth = Math.round(chrHeight / 45);\n }\n ideo.config.chrWidth = chrWidth;\n }\n}\n\nfunction configureMargin(ideo) {\n if (ideo.config.geometry && ideo.config.geometry === 'collinear') {\n if ('chrMargin' in ideo.config === false) {\n ideo.config.chrMargin = 0;\n }\n return;\n }\n if (!ideo.config.chrMargin) {\n if (ideo.config.ploidy === 1) {\n ideo.config.chrMargin = 10;\n } else {\n // Defaults polyploid chromosomes to relatively small interchromatid gap\n ideo.config.chrMargin = Math.round(ideo.config.chrWidth / 4);\n }\n }\n if (ideo.config.showBandLabels) ideo.config.chrMargin += 20;\n}\n\nfunction configureBump(ideo) {\n ideo.bump = Math.round(ideo.config.chrHeight / 125);\n ideo.adjustedBump = false;\n if (ideo.config.chrHeight < 200) {\n ideo.adjustedBump = true;\n ideo.bump = 4;\n }\n}\n\nfunction configureSingleChromosome(config, ideo) {\n if (config.chromosome) {\n ideo.config.chromosomes = [config.chromosome];\n if ('showBandLabels' in config === false) {\n ideo.config.showBandLabels = true;\n }\n if ('rotatable' in config === false) ideo.config.rotatable = false;\n }\n}\n\nfunction configureOrganisms(ideo) {\n ideo.organisms = Object.assign({}, organismMetadata);\n ideo.organismsWithBands = Object.assign({}, ideo.organisms);\n}\n\nfunction configureCallbacks(config, ideo) {\n if (config.onLoad) ideo.onLoadCallback = config.onLoad;\n if (config.onLoadAnnots) ideo.onLoadAnnotsCallback = config.onLoadAnnots;\n if (config.onDrawAnnots) ideo.onDrawAnnotsCallback = config.onDrawAnnots;\n if (config.onBrushMove) ideo.onBrushMoveCallback = config.onBrushMove;\n if (config.onBrushEnd) ideo.onBrushEndCallback = config.onBrushEnd;\n if (config.onCursorMove) ideo.onCursorMoveCallback = config.onCursorMove;\n if (config.onDidRotate) ideo.onDidRotateCallback = config.onDidRotate;\n if (config.onWillShowAnnotTooltip) {\n ideo.onWillShowAnnotTooltipCallback = config.onWillShowAnnotTooltip;\n }\n if (config.onClickAnnot) {\n ideo.onClickAnnotCallback = config.onClickAnnot;\n }\n}\n\nfunction configureMiscellaneous(ideo) {\n ideo.chromosomesArray = [];\n ideo.coordinateSystem = 'iscn';\n ideo.maxLength = {bp: 0, iscn: 0};\n ideo.chromosomes = {};\n ideo.numChromosomes = 0;\n if (!ideo.config.debug) ideo.config.debug = false;\n if (!ideo.config.dataDir) ideo.config.dataDir = ideo.getDataDir();\n if (!ideo.config.container) ideo.config.container = 'body';\n ideo.selector = ideo.config.container + ' #_ideogram';\n if (!ideo.config.resolution) ideo.config.resolution = '';\n if (!ideo.config.orientation) ideo.config.orientation = 'vertical';\n if (!ideo.config.brush) ideo.config.brush = null;\n if (!ideo.config.rows) ideo.config.rows = 1;\n if ('showChromosomeLabels' in ideo.config === false) {\n ideo.config.showChromosomeLabels = true;\n }\n if (!ideo.config.showNonNuclearChromosomes) {\n ideo.config.showNonNuclearChromosomes = false;\n }\n if (!ideo.config.chromosomeScale) {\n ideo.config.chromosomeScale = 'absolute';\n }\n if (!ideo.config.showTools) ideo.config.showTools = false;\n}\n\nfunction configureBands(ideo) {\n if (!ideo.config.showBandLabels) ideo.config.showBandLabels = false;\n\n if ('showFullyBanded' in ideo.config === false) {\n ideo.config.showFullyBanded = true;\n }\n\n ideo.bandsToShow = [];\n ideo.bandData = {};\n}\n\nlet configuredCss = staticCss;\nfunction configureTextStyle(ideo) {\n const config = ideo.config;\n if (!config.chrLabelSize) ideo.config.chrLabelSize = 9;\n if (!config.chrLabelColor) ideo.config.chrLabelColor = '#000';\n if (!config.fontFamily) ideo.config.fontFamily = '';\n\n const size = `font-size: ${config.chrLabelSize}px`;\n const color = `fill: ${config.chrLabelColor}`;\n const fontFamily = `font-family: ${config.fontFamily}`;\n configuredCss += `#_ideogram text {${fontFamily}; ${size}; ${color};}`;\n configuredCss += `#_ideogramLabel text {${fontFamily};}`;\n}\n\n/**\n * High-level helper method for Ideogram constructor.\n *\n * @param config Configuration object. Enables setting Ideogram properties.\n *\n * Docs: https://github.com/eweitz/ideogram/blob/master/api.md\n */\nfunction configure(config) {\n // Clone the config object, to allow multiple instantiations\n // without picking up prior ideogram's settings\n this.config = JSON.parse(JSON.stringify(config));\n\n configureMiscellaneous(this);\n configurePloidy(this);\n configureBands(this);\n configureHeight(this);\n configureWidth(this);\n configureMargin(this);\n configureCallbacks(config, this);\n configureOrganisms(this);\n configureBump(this);\n configureSingleChromosome(config, this);\n configureTextStyle(this);\n this.initAnnotSettings();\n if (!this.config.geometry || this.config.geometry === 'parallel') {\n this.config.chrMargin += this.config.chrWidth;\n if (this.config.annotationsLayout === 'heatmap') {\n this.config.chrMargin += this.config.annotTracksHeight;\n } else {\n this.config.chrMargin += this.config.annotTracksHeight * 2;\n }\n }\n this.init();\n}\n\nexport {configure, configuredCss};\n","/**\n * @fileoverview Functions for collinear chromosomes.\n * Collinear chromosomes form a line together, unlike the default parallel\n * geometry.\n */\n\nimport {d3} from './lib';\n\nfunction labelGenomes(ideo) {\n\n ideo.config.taxids.forEach((taxid, i) => {\n var org = ideo.organisms[taxid];\n // var commonName = slug(org.commonName);\n var scientificName = org.scientificName;\n d3.select(ideo.selector)\n .append('text')\n .attr('class', 'genomeLabel italic')\n .attr('x', 55 + 200 * i)\n .attr('y', 10)\n .text(scientificName)\n .attr('text-anchor', 'middle');\n });\n}\n\n/**\n* Rearrange chromosomes from parallel vertical to collinear vertical\n*\n* Parallel vertical (as in https://eweitz.github.io/ideogram/human)\n* | | |\n*\n* Collinear vertical (as in https://eweitz.github.io/ideogram/orthologs?loci=2:150000000,5:20000000;3:100000000,10:80000000&org=homo-sapiens&org2=mus-musculus)\n* |\n* |\n* |\n*/\nfunction rearrangeChromosomes(chrSets, yOffsets, x, ideo) {\n var i, chrSet, y, chrLabelX, adjustedX, chr, taxid, orgIndex,\n config = ideo.config,\n chrLabelSize = config.chrLabelSize;\n\n for (i = 0; i < chrSets.length; i++) {\n chrSet = chrSets[i];\n y = yOffsets[i] + 23 - chrLabelSize;\n\n chr = ideo.chromosomesArray[i];\n taxid = chr.id.split('-')[1];\n orgIndex = ideo.config.taxids.indexOf(taxid);\n adjustedX = x - orgIndex * 200 - 30 - 5;\n if (orgIndex === 0) {\n chrLabelX = -34;\n adjustedX += ideo.config.chrWidth * 2 - 16;\n } else {\n chrLabelX = ideo.config.chrWidth * 2 - 24;\n }\n\n if (config.showChromosomeLabels) {\n const labelSpan = chrSet.querySelector('.chrLabel > tspan');\n labelSpan.setAttribute('x', chrLabelX);\n labelSpan.setAttribute('dy', chrLabelSize - 8);\n chrSet.querySelector('.chrLabel').setAttribute('text-anchor', 'start');\n }\n chrSet.setAttribute(\n 'transform', 'rotate(90) translate(' + y + ',' + adjustedX + ')'\n );\n chrSet.querySelector('.chromosome').setAttribute(\n 'transform', 'translate(-13, 10)'\n );\n }\n\n labelGenomes(ideo);\n}\n\n/**\n* Get pixel coordinates to use for rearrangement\n*/\nfunction getYOffsets(chrSets, ideo) {\n var yOffsets, i, index, chr, prevChr, y, prevWidth, prevY, yBump, taxid,\n seenTaxids = {};\n\n yOffsets = [];\n for (i = 0; i < chrSets.length; i++) {\n chr = ideo.chromosomesArray[i];\n taxid = chr.id.split('-')[1];\n index = (i === 0) ? i : i - 1;\n prevChr = ideo.chromosomesArray[index];\n if (i === 0 || taxid in seenTaxids === false) {\n y = 20;\n seenTaxids[taxid] = 1;\n } else {\n prevWidth = prevChr.width;\n prevY = yOffsets[index];\n yBump = (ideo.config.showChromosomeLabels ? 0 : 2);\n y = prevY + prevWidth + yBump + ideo.config.chrMargin;\n }\n yOffsets.push(y);\n }\n\n return yOffsets;\n}\n\nfunction collinearizeVerticalChromosomes(ideo) {\n var chrSets, yOffsets, x, height, width,\n config = ideo.config;\n\n ideo.config.annotLabelHeight = 12;\n // var annotLabelHeight = ideo.config.annotLabelHeight;\n\n if ('demarcateCollinearChromosomes' in ideo.config === false) {\n ideo.config.demarcateCollinearChromosomes = true;\n }\n\n chrSets = document.querySelectorAll('.chromosome-set');\n\n x = -40;\n\n yOffsets = getYOffsets(chrSets, ideo);\n rearrangeChromosomes(chrSets, yOffsets, x, ideo);\n\n width = Math.round(yOffsets.slice(-1)[0] + 70);\n\n if (config.multiorganism) {\n height *= 8;\n var maxHeight = 0;\n yOffsets.forEach(d => {\n if (d > maxHeight) maxHeight = d;\n });\n height = maxHeight + 30;\n } else {\n height = xOffsets.slice(-1)[0] + 30;\n }\n\n d3.select(ideo.selector)\n .attr('height', height)\n .attr('width', width);\n\n d3.select('#_ideogramTrackLabelContainer').remove();\n d3.select('#_ideogramInnerWrap')\n .insert('div', ':first-child')\n .attr('id', '_ideogramTrackLabelContainer')\n .style('position', 'absolute');\n}\n\nexport default collinearizeVerticalChromosomes;\n","/**\n * @fileoverview Functions for collinear chromosomes.\n * Collinear chromosomes form a line together, unlike the default parallel\n * geometry.\n */\n\nimport {d3} from './lib';\nimport collinearizeVerticalChromosomes from './collinear-vertical';\n\nfunction labelGenomes(ideo) {\n\n ideo.config.taxids.forEach((taxid, i) => {\n var org = ideo.organisms[taxid];\n var config = ideo.config;\n // var commonName = slug(org.commonName);\n var scientificName = org.scientificName;\n d3.select(ideo.selector)\n .append('text')\n .attr('class', 'genomeLabel italic')\n .attr('x', 5)\n .attr('y', config.chrLabelSize + (200 + (3 * config.chrWidth)) * i)\n .text(scientificName);\n });\n}\n\n/**\n* Rearrange chromosomes from parallel horizontal to collinear horizontal\n*\n* Parallel horizontal (as in https://eweitz.github.io/ideogram/mouse)\n* ---\n* ---\n* ---\n*\n* Collinear horizontal (as in https://eweitz.github.io/ideogram/geometry-collinear):\n* --- --- ---\n*/\nfunction rearrangeChromosomes(chrSets, xOffsets, y, ideo) {\n var i, chr, chrSet, taxid, x, adjustedY, orgIndex, chrLabelY,\n config = ideo.config,\n chrWidth = config.chrWidth,\n chrLabelSize = config.chrLabelSize;\n\n for (i = 0; i < chrSets.length; i++) {\n chrSet = chrSets[i];\n x = xOffsets[i];\n\n chr = ideo.chromosomesArray[i];\n taxid = chr.id.split('-')[1];\n orgIndex = config.taxids.indexOf(taxid);\n adjustedY = y + orgIndex * 200;\n if (orgIndex === 0 && ideo.config.multiorganism) {\n chrLabelY = chrLabelSize - 4;\n adjustedY += chrWidth * 2 + chrLabelSize;\n } else {\n chrLabelY = chrWidth * 2 + chrLabelSize + 2;\n }\n\n if (ideo.config.showChromosomeLabels) {\n chrSet.querySelector('.chrLabel').setAttribute('y', chrLabelY);\n chrSet.querySelector('.chrLabel').setAttribute('text-anchor', 'middle');\n }\n chrSet.setAttribute('transform', 'translate(' + x + ',' + adjustedY + ')');\n chrSet.querySelector('.chromosome').setAttribute(\n 'transform', 'translate(-13, 10)'\n );\n }\n\n if (config.multiorganism) {\n labelGenomes(ideo);\n }\n}\n\n/**\n* Get pixel coordinates to use for rearrangement\n*/\nfunction getXOffsets(chrSets, ideo) {\n var xOffsets, i, index, chr, prevChr, x, prevWidth, prevX, xBump, taxid,\n seenTaxids = {};\n\n xOffsets = [];\n for (i = 0; i < chrSets.length; i++) {\n chr = ideo.chromosomesArray[i];\n taxid = chr.id.split('-')[1];\n index = (i === 0) ? i : i - 1;\n prevChr = ideo.chromosomesArray[index];\n if (i === 0 || taxid in seenTaxids === false) {\n x = 20;\n seenTaxids[taxid] = 1;\n } else {\n prevWidth = prevChr.width;\n prevX = xOffsets[index];\n xBump = (ideo.config.showChromosomeLabels ? 0 : 2);\n x = prevX + prevWidth + xBump + ideo.config.chrMargin;\n }\n xOffsets.push(x);\n }\n\n return xOffsets;\n}\n\n// /**\n// * Track number of chromosomes in preceding organisms.\n// * Adds an instance variable to the ideogram object to offset\n// * chromosome indices. Needed for multiorganism collinear ideograms.\n// */\n// function setTaxidChrOffsets(ideo) {\n// var taxidChrOffsets, taxidChrOffset;\n\n// taxidChrOffsets = {};\n\n// taxidChrOffset = 0;\n// ideo.config.organism.forEach((org) => {\n// var taxid, numChrs;\n// taxid = ideo.getTaxid(org);\n// taxidChrOffsets[taxid] = taxidChrOffset;\n// numChrs = Object.keys(ideo.chromosomes[taxid]).length;\n// taxidChrOffset += numChrs;\n// });\n\n// ideo.taxidChrOffsets = taxidChrOffsets;\n// }\n\n// /**\n// * Change chromosome indices for multiorganism collinear ideograms\n// * This is needed to account for x-offsets.\n// */\n// function adjustChrIndex(ideo) {\n// setTaxidChrOffsets(ideo);\n\n// ideo.chromosomesArray.map((chr) => {\n// var taxid = chr.id.split('-')[1];\n// var taxidChrOffset = ideo.taxidChrOffsets[taxid];\n// chr.chrIndex -= taxidChrOffset;\n// ideo.chromosomes[taxid][chr.name].chrIndex = chr.chrIndex;\n// });\n// }\n\nfunction collinearizeChromosomes(ideo) {\n var chrSets, xOffsets, y, height, width,\n config = ideo.config,\n annotHeight = config.annotationHeight || 0;\n\n if (config.orientation === 'vertical') {\n collinearizeVerticalChromosomes(ideo);\n return;\n }\n\n // if (config.multiorganism) adjustChrIndex(ideo);\n\n ideo.config.annotLabelHeight = 12;\n var annotLabelHeight = ideo.config.annotLabelHeight;\n\n if ('demarcateCollinearChromosomes' in ideo.config === false) {\n ideo.config.demarcateCollinearChromosomes = true;\n }\n\n chrSets = document.querySelectorAll('.chromosome-set');\n\n y = (\n (config.numAnnotTracks * (annotHeight + annotLabelHeight + 4)) -\n config.chrWidth + 1\n );\n\n xOffsets = getXOffsets(chrSets, ideo);\n rearrangeChromosomes(chrSets, xOffsets, y, ideo);\n\n height = y + config.chrWidth * 2 + 20;\n\n if (config.multiorganism) {\n height *= 8;\n var maxWidth = 0;\n xOffsets.forEach(d => {\n if (d > maxWidth) maxWidth = d;\n });\n width = maxWidth + 20;\n } else {\n width = xOffsets.slice(-1)[0] + 20;\n }\n\n d3.select(ideo.selector)\n .attr('width', width)\n .attr('height', height);\n\n d3.select('#_ideogramTrackLabelContainer').remove();\n d3.select('#_ideogramInnerWrap')\n .insert('div', ':first-child')\n .attr('id', '_ideogramTrackLabelContainer')\n .style('position', 'absolute');\n}\n\nexport default collinearizeChromosomes;\n","import {d3} from '../lib';\nimport collinearizeChromosomes from '../collinear';\n\nfunction processLabels(config, ideo) {\n var i, chrID, t0C, t1C;\n\n if (config.showBandLabels === true) {\n t0C = new Date().getTime();\n ideo.hideUnshownBandLabels();\n t1C = new Date().getTime();\n if (config.debug) {\n console.log('Time in showing bands: ' + (t1C - t0C) + ' ms');\n }\n\n if (config.orientation === 'vertical') {\n for (i = 0; i < ideo.chromosomesArray.length; i++) {\n chrID = '#' + ideo.chromosomesArray[i].id;\n ideo.rotateChromosomeLabels(d3.select(chrID), i);\n }\n }\n }\n\n if (config.showChromosomeLabels === true) {\n ideo.drawChromosomeLabels(ideo.chromosomes);\n }\n}\n\nfunction processAnnots(ideo) {\n if (typeof ideo.timeout !== 'undefined') window.clearTimeout(ideo.timeout);\n\n ideo.rawAnnots = ideo.setOriginalTrackIndexes(ideo.rawAnnots);\n\n if (ideo.config.annotationsDisplayedTracks) {\n ideo.annots =\n ideo.updateDisplayedTracks(ideo.config.annotationsDisplayedTracks);\n } else {\n ideo.annots = ideo.processAnnotData(ideo.rawAnnots);\n if (ideo.config.filterable) ideo.initCrossFilter();\n ideo.drawProcessedAnnots(ideo.annots);\n }\n}\n\n/**\n * Load (potentially large) annotation dataset, then process it.\n */\nfunction waitForAndProcessAnnots(ideo) {\n if (ideo.rawAnnots) {\n processAnnots(ideo);\n } else {\n (function checkAnnotData() {\n ideo.timeout = setTimeout(function() {\n if (\n !ideo.rawAnnots ||\n (ideo.rawAnnots && typeof ideo.rawAnnots.then !== 'undefined')\n ) {\n // Ensure rawAnnots is defined and not a Promise (not \"then\"-able)\n checkAnnotData();\n } else {\n processAnnots(ideo);\n }\n }, 50);\n })();\n }\n}\n\nfunction reportDebugTimings(config, t0, t0A) {\n\n var t1A = new Date().getTime();\n if (config.debug) {\n console.log('Time in drawChromosome: ' + (t1A - t0A) + ' ms');\n }\n\n var t1 = new Date().getTime();\n if (config.debug) {\n console.log('Time constructing ideogram: ' + (t1 - t0) + ' ms');\n }\n}\n\n/**\n * Completes high-level initialization.\n * Draws chromosomes and band labels, rotating as needed;\n * processes and draws annotations;\n * creates brush, emits notification of load completion, etc.\n */\nfunction finishInit(t0) {\n var t0A = new Date().getTime(),\n ideo = this,\n config = ideo.config,\n confAnnots = config.annotations;\n\n ideo.initDrawChromosomes();\n\n if (config.annotationsPath) waitForAndProcessAnnots(ideo);\n\n processLabels(config, ideo);\n\n // Create a brush or a click cursor if specified\n if (config.brush) ideo.createBrush(config.brush);\n else if (config.cursorPosition) ideo.createClickCursor(config.cursorPosition);\n\n if (confAnnots) {\n if (Array.isArray(confAnnots)) {\n ideo.drawAnnots(confAnnots);\n } else {\n // Enable client-side-defined annotations to be formatted\n // like the wider variety of server-side-defined annotations.\n // Supports https://github.com/eweitz/ideogram/issues/137\n ideo.rawAnnots = confAnnots;\n ideo.afterRawAnnots();\n processAnnots(ideo);\n }\n }\n\n reportDebugTimings(config, t0, t0A);\n\n ideo.setOverflowScroll();\n\n if (config.geometry === 'collinear') collinearizeChromosomes(ideo);\n\n if (ideo.onLoadCallback) ideo.onLoadCallback();\n}\n\nexport {finishInit};\n","export class Ploidy {\n\n constructor(config) {\n this._config = config;\n this._description = this._normalize(this._config.ploidyDesc);\n }\n\n // Get number of chromosomes in a chromosome set\n getChromosomesNumber(setIndex) {\n if (this._config.ploidyDesc) {\n var chrSetCode = this._config.ploidyDesc[setIndex];\n if (chrSetCode instanceof Object) {\n return Object.keys(chrSetCode)[0].length;\n } else {\n return chrSetCode.length;\n }\n } else {\n return this._config.ploidy || 1;\n }\n }\n\n // Normalize use defined description\n _normalize(description) {\n var key, descValue,\n normalized = [];\n\n if (!description) return description;\n\n // Loop through description and normalize\n for (key in description) {\n descValue = description[key];\n if (typeof descValue === 'string') {\n if (this._config.orientation === 'vertical') {\n descValue = descValue.split('').reverse();\n }\n normalized.push({\n ancestors: descValue,\n existence: this._getexistenceArray(descValue.length)\n });\n } else {\n normalized.push({\n ancestors: Object.keys(descValue)[0],\n existence: descValue[Object.keys(descValue)[0]]\n });\n }\n }\n\n return normalized;\n }\n\n // Get array filled by '11' elements\n _getexistenceArray(length) {\n var array = [];\n\n for (var i = 0; i < length; i++) {\n array.push('11');\n }\n\n return array;\n }\n\n getSetSize(chrSetIndex) {\n if (this._description) {\n return this._description[chrSetIndex].ancestors.length;\n } else {\n return 1;\n }\n }\n\n // Get ancestor letter\n getAncestor(chrSetIndex, chrIndex) {\n if (this._description) {\n return this._description[chrSetIndex].ancestors[chrIndex];\n } else {\n return '';\n }\n }\n\n // Check if chromosome's arm should be rendered.\n // If no description was provided, method returns true and\n // something another depending on user provided description.\n exists(chrSetIndex, chrIndex, armIndex) {\n if (this._description) {\n var desc =\n this._description[chrSetIndex].existence[chrIndex][armIndex];\n return Number(desc) > 0;\n } else {\n return true;\n }\n }\n\n}\n","import {d3} from '../lib';\n\n/**\n * Chromosome's view utility class\n */\nexport class ChromosomeUtil {\n\n constructor(node) {\n this._node = node;\n }\n\n getLabel() {\n var label =\n d3\n .select(this._node.parentNode)\n .select('text.chrLabel')\n .text();\n return label;\n }\n\n /**\n * Get chromosome set label\n */\n getSetLabel() {\n var setLabel =\n d3\n .select(this._node.parentNode)\n .select('text.chrSetLabel')\n .text();\n return setLabel;\n }\n}\n","import {d3} from '../lib';\nimport {ChromosomeUtil} from './../views/chromosome-util';\n\nclass Layout {\n\n constructor(config, ideo) {\n this._config = config;\n this._ideo = ideo;\n this._ploidy = this._ideo._ploidy;\n this._translate = undefined;\n\n if ('chrSetMargin' in config) {\n this.chrSetMargin = config.chrSetMargin;\n } else {\n var chrMargin = this._config.chrMargin;\n this.chrSetMargin = (this._config.ploidy > 1 ? chrMargin : 0);\n }\n\n // Chromosome band's size.\n this._tickSize = 8;\n\n // Chromosome rotation state.\n this._isRotated = false;\n }\n\n // Get chart left margin\n _getLeftMargin() {\n return this.margin.left;\n }\n\n // Get rotated chromosome y scale\n _getYScale() {\n // 20 is width of rotated chromosome.\n return 20 / this._config.chrWidth;\n }\n\n // Get chromosome labels\n getChromosomeLabels(chrElement) {\n var util = new ChromosomeUtil(chrElement),\n labels = [];\n\n if (this._ideo.config.ploidy > 1) {\n labels.push(util.getSetLabel());\n }\n labels.push(util.getLabel());\n\n return labels.filter(function(d) {\n return d.length > 0;\n });\n }\n\n getChromosomeBandLabelTranslate(band) {\n var x, y, translate,\n ideo = this._ideo,\n tickSize = this._tickSize,\n orientation = ideo.config.orientation;\n\n if (orientation === 'vertical') {\n x = tickSize;\n y = ideo.round(2 + band.px.start + band.px.width / 2);\n translate = 'rotate(-90)translate(' + x + ',' + y + ')';\n } else if (orientation === 'horizontal') {\n x = ideo.round(-tickSize + band.px.start + band.px.width / 2);\n y = -10;\n translate = 'translate(' + x + ',' + y + ')';\n }\n\n return {\n x: x,\n y: y,\n translate: translate\n };\n }\n\n didRotate(chrIndex, chrElement) {\n var ideo, taxid, chrName, bands, chrModel, oldWidth,\n chrSetElement, transform, scale, scaleRE;\n\n ideo = this._ideo;\n taxid = ideo.config.taxid;\n chrName = chrElement.id.split('-')[0].replace('chr', '');\n chrModel = ideo.chromosomes[taxid][chrName];\n bands = chrModel.bands;\n\n chrSetElement = d3.select(chrElement.parentNode);\n transform = chrSetElement.attr('transform');\n scaleRE = /scale\\(.*\\)/;\n scale = scaleRE.exec(transform);\n transform = transform.replace(scale, '');\n chrSetElement.attr('transform', transform);\n\n oldWidth = chrModel.width;\n\n chrModel = ideo.getChromosomeModel(bands, chrName, taxid, chrIndex);\n\n chrModel.oldWidth = oldWidth;\n\n ideo.chromosomes[taxid][chrName] = chrModel;\n ideo.drawChromosome(chrModel);\n\n ideo.handleRotateOnClick();\n\n if (ideo.rawAnnots) {\n if (ideo.displayedTrackIndexes) {\n ideo.updateDisplayedTracks(ideo.displayedTrackIndexes);\n } else {\n ideo.annots = ideo.processAnnotData(ideo.rawAnnots);\n ideo.drawProcessedAnnots(ideo.annots);\n\n if (ideo.config.filterable) {\n ideo.initCrossFilter();\n }\n }\n }\n\n if (ideo.config.showBandLabels === true) {\n ideo.drawBandLabels(ideo.chromosomes);\n ideo.hideUnshownBandLabels();\n }\n\n if (ideo.onDidRotateCallback) {\n ideo.onDidRotateCallback(chrModel);\n }\n }\n\n rotate(chrSetIndex, chrIndex, chrElement) {\n var ideo, otherChrs, ideoBounds, labelSelectors;\n ideo = this._ideo;\n\n labelSelectors = (\n ideo.selector + ' .chrSetLabel, ' + ideo.selector + ' .chrLabel'\n );\n\n ideoBounds = document.querySelector(ideo.selector).getBoundingClientRect();\n\n // Find chromosomes which should be hidden\n otherChrs = d3.selectAll(ideo.selector + ' g.chromosome')\n .filter(function() {return this !== chrElement;});\n\n if (this._isRotated) {\n\n this._isRotated = false;\n\n ideo.config.chrHeight = ideo.config.chrHeightOriginal;\n ideo.config.chrWidth = ideo.config.chrWidthOriginal;\n ideo.config.annotationHeight = ideo.config.annotationHeightOriginal;\n\n // Rotate chromosome back\n this.rotateBack(chrSetIndex, chrIndex, chrElement, function() {\n // Show all other chromosomes and chromosome labels\n otherChrs.style('display', null);\n d3.selectAll(labelSelectors).style('display', null);\n ideo._layout.didRotate(chrIndex, chrElement);\n });\n\n } else {\n\n this._isRotated = true;\n\n // Hide all other chromosomes and chromosome labels\n otherChrs.style('display', 'none');\n d3.selectAll(labelSelectors).style('display', 'none');\n\n // Rotate chromosome\n this.rotateForward(chrSetIndex, chrIndex, chrElement, function() {\n\n var chrHeight, elementLength, windowLength;\n\n ideo.config.chrHeightOriginal = ideo.config.chrHeight;\n ideo.config.chrWidthOriginal = ideo.config.chrWidth;\n ideo.config.annotationHeightOriginal = ideo.config.annotationHeight;\n\n const settingsGearWidth = 20;\n\n if (ideo._layout._class === 'VerticalLayout') {\n elementLength = ideoBounds.width - settingsGearWidth;\n windowLength = window.innerWidth - settingsGearWidth;\n } else {\n elementLength = ideoBounds.height - 10;\n windowLength = window.innerHeight - 10;\n }\n\n // Set chromosome height to window length or ideogram element length,\n // whichever is smaller. This keeps whole chromosome viewable, while\n // also ensuring the height doesn't exceed what the user specified.\n if (windowLength < elementLength) {\n chrHeight = windowLength;\n } else {\n chrHeight = elementLength;\n }\n chrHeight -= ideo.config.chrMargin * 2;\n ideo.config.chrHeight = chrHeight;\n\n // Account for chromosome label\n // TODO: Make this dynamic, not hard-coded\n ideo.config.chrWidth *= 2.3;\n\n ideo.config.annotationHeight *= 1.7;\n\n ideo._layout.didRotate(chrIndex, chrElement);\n });\n }\n }\n\n getChromosomeLabelClass() {\n if (this._config.ploidy === 1) {\n return 'chrLabel';\n } else {\n return 'chrSetLabel';\n }\n }\n\n _getAdditionalOffset() {\n var config = this._config;\n var numTracks = config.annotationsNumTracks || config.numAnnotTracks || 1;\n return (config.annotationHeight || 0) * numTracks;\n }\n\n _getChromosomeSetSize(chrSetIndex) {\n // Get last chromosome set size.\n var setSize = this._ploidy.getSetSize(chrSetIndex);\n\n // Increase offset by last chromosome set size\n return (\n setSize * this._config.chrWidth * 2 + (this.chrSetMargin)\n );\n }\n\n // Get chromosome set label anchor property\n getChromosomeSetLabelAnchor() {\n return 'middle';\n }\n\n // Get chromosome label y position.\n getChromosomeLabelYPosition() {\n return -5.5;\n }\n\n getChromosomeSetLabelYPosition(chrIndex) {\n if (this._config.ploidy === 1) {\n return this.getChromosomeLabelYPosition(chrIndex);\n } else {\n return -2 * this._config.chrWidth;\n }\n }\n\n}\n\nexport default Layout;\n","/**\n* @fileoverview Vertical layout class\n* Ideogram instances with vertical layout are oriented with each chromosome\n* starting at top and ending at bottom, and aligned as columns.\n*/\n\nimport {d3} from '../lib';\nimport Layout from './layout';\n\nclass VerticalLayout extends Layout {\n\n constructor(config, ideo) {\n super(config, ideo);\n this._class = 'VerticalLayout';\n // Layout margins\n this.margin = {\n top: 30,\n left: 15\n };\n }\n\n rotateForward(chrSetIndex, chrIndex, chrElement, callback) {\n // TODO: Integrate chrSetIndex and chrIndex to support polyploid rotation.\n\n var self = this;\n\n var xOffset = 20;\n\n var scale = this.getChromosomeScale(chrElement);\n\n var transform =\n 'translate(' + xOffset + ', 25) ' + scale;\n\n d3.select(chrElement.parentNode)\n .transition()\n .attr('transform', transform)\n .on('end', callback);\n\n // Append new chromosome labels\n var labels = this.getChromosomeLabels(chrElement);\n var y = (xOffset + self._config.chrWidth) * 1.3;\n d3.select(this._ideo.getSvg())\n .append('g')\n .attr('class', 'tmp')\n .selectAll('text')\n .data(labels)\n .enter()\n .append('text')\n .attr('class', function(d, i) {\n return i === 0 && labels.length === 2 ? 'chrSetLabel' : null;\n })\n .attr('x', 0)\n .attr('y', y).style('opacity', 0)\n .text(String)\n .transition()\n .style('opacity', 1);\n\n this._ideo.config.orientation = 'horizontal';\n }\n\n rotateBack(setIndex, chrIndex, chrElement, callback) {\n\n var scale = this.getChromosomeScaleBack(chrElement);\n var translate = this.getChromosomeSetTranslate(setIndex);\n\n d3.select(chrElement.parentNode)\n .transition()\n .attr('transform', translate + ' ' + scale)\n .on('end', callback);\n\n d3.selectAll(this._ideo.selector + ' g.tmp')\n .style('opacity', 0)\n .remove();\n\n this._ideo.config.orientation = 'vertical';\n }\n\n getHeight() {\n return this._config.chrHeight + this.margin.top * 1.5;\n }\n\n getWidth() {\n return '97%';\n }\n\n getChromosomeBandTickY1() {\n return 2;\n }\n\n getChromosomeBandTickY2() {\n return 10;\n }\n\n getChromosomeSetLabelTranslate() {\n return 'rotate(-90)';\n }\n\n getChromosomeBandLabelAnchor() {\n return null;\n }\n\n getChromosomeScale(chrElement) {\n var ideoBox, chrBox, scaleX, scaleY;\n\n ideoBox = d3.select(this._ideo.selector).node().getBoundingClientRect();\n chrBox = chrElement.getBoundingClientRect();\n\n scaleX = (ideoBox.width / chrBox.height) * 0.97;\n scaleY = this._getYScale();\n\n return 'scale(' + scaleX + ', ' + scaleY + ')';\n }\n\n getChromosomeScaleBack(chrElement) {\n var scale, scaleX, scaleY, chrName, chrModel, taxid, ideo, config;\n\n ideo = this._ideo;\n config = ideo.config;\n taxid = config.taxid;\n\n chrName = chrElement.id.split('-')[0].replace('chr', '');\n chrModel = this._ideo.chromosomes[taxid][chrName];\n scaleX = (chrModel.oldWidth / (config.chrHeight * 3)) * 0.97;\n scaleY = 1 / this._getYScale();\n scale = 'scale(' + scaleX + ', ' + scaleY + ')';\n return scale;\n }\n\n getChromosomeSetTranslate(setIndex) {\n var marginTop = this.margin.top;\n var chromosomeSetYTranslate = this.getChromosomeSetYTranslate(setIndex);\n return (\n 'rotate(90) ' +\n 'translate(' + marginTop + ', -' + chromosomeSetYTranslate + ')'\n );\n }\n\n getChromosomeSetYTranslate(setIndex) {\n // Get additional padding caused by annotation/histogram tracks\n var pad = this._getAdditionalOffset(),\n config = this._config,\n margin = config.chrMargin,\n width = config.chrWidth,\n translate;\n\n // If no detailed description provided just use one formula for all cases\n if (!config.ploidyDesc) {\n // TODO:\n // This part of code contains a lot magic numbers and if\n // statements for exactly corresponing to original ideogram examples.\n // But all this stuff should be removed. Calculation of translate\n // should be a simple formula applied for all cases listed below.\n // Now they are diffirent because of Layout:_getAdditionalOffset do\n // not meet for cases when no annotation, when annotation exists and\n // when histogram used\n\n if (config.annotationsLayout === 'histogram') {\n var barWidth = config.barWidth;\n return margin + setIndex * (margin + width + 3) + barWidth * 2;\n } else {\n const decorPad =\n 'legendPad' in config ? config.legendPad : 0;\n translate = width + setIndex * (margin + width) + pad * 2 + decorPad;\n if (pad > 0) {\n return translate;\n } else {\n return translate + 4 + (2 * setIndex);\n }\n }\n }\n\n // If detailed description provided start to calculate offsets\n // for each chromosome set separately. This should be done only once\n if (!this._translate) {\n // First offset equals to zero\n this._translate = [this._ploidy.getSetSize(0) * width * 2];\n var prevTranslate;\n // Loop through description set\n for (var i = 1; i < this._config.ploidyDesc.length; i++) {\n prevTranslate = this._translate[i - 1];\n this._translate[i] = prevTranslate + this._getChromosomeSetSize(i - 1);\n }\n }\n\n return this._translate[setIndex];\n }\n\n getChromosomeSetLabelXPosition() {\n return (this._config.chrWidth * this._config.ploidy) / -2;\n }\n\n getChromosomeLabelXPosition() {\n return this._config.chrWidth / -2;\n }\n}\n\nexport default VerticalLayout;\n","/**\n* @fileoverview Horizontal layout class\n* Ideogram instances with horizontal layout are oriented with each chromosome\n* starting at left and ending at right, and aligned as rows.\n*/\n\nimport {d3} from '../lib';\nimport Layout from './layout';\n\nclass HorizontalLayout extends Layout {\n\n constructor(config, ideo) {\n super(config, ideo);\n this._class = 'HorizontalLayout';\n this.margin = {\n left: 20,\n top: 30\n };\n }\n\n _getLeftMargin() {\n var margin = Layout.prototype._getLeftMargin.call(this);\n if (this._config.ploidy > 1) {\n margin *= 1.8;\n }\n\n return margin;\n }\n\n rotateForward(setIndex, chrIndex, chrElement, callback) {\n\n var xOffset, yOffset, transform, labels;\n\n xOffset = 30;\n\n yOffset = xOffset + 7.5;\n\n transform = (\n 'rotate(90) ' +\n 'translate(' + xOffset + ', -' + yOffset + ') '\n );\n\n d3.select(chrElement.parentNode)\n .transition()\n .attr('transform', transform)\n .on('end', callback);\n\n // Append new chromosome labels\n labels = this.getChromosomeLabels(chrElement);\n d3.select(this._ideo.getSvg())\n .append('g')\n .attr('class', 'tmp')\n .selectAll('text')\n .data(labels)\n .enter()\n .append('text')\n .attr('class', function(d, i) {\n return i === 0 && labels.length === 2 ? 'chrSetLabel' : null;\n })\n .attr('x', xOffset - 4)\n .attr('y', function(d, i) {\n return (i + 1 + labels.length % 2) * 12;\n })\n .style('text-anchor', 'middle')\n .style('opacity', 0)\n .text(String)\n .transition()\n .style('opacity', 1);\n\n this._ideo.config.orientation = 'vertical';\n }\n\n rotateBack(setIndex, chrIndex, chrElement, callback) {\n var translate = this.getChromosomeSetTranslate(setIndex);\n\n d3.select(chrElement.parentNode)\n .transition()\n .attr('transform', translate)\n .on('end', callback);\n\n d3.selectAll(this._ideo.selector + ' g.tmp')\n .style('opacity', 0)\n .remove();\n\n this._ideo.config.orientation = 'horizontal';\n }\n\n getHeight(taxid) {\n if (typeof taxid === 'undefined') taxid = this._config.taxids[0];\n // Get last chromosome set offset.\n var numChromosomes = this._config.chromosomes[taxid].length;\n var lastSetOffset = this.getChromosomeSetYTranslate(numChromosomes - 1);\n\n // Get last chromosome set size.\n var lastSetSize = this._getChromosomeSetSize(numChromosomes - 1);\n\n // Increase offset by last chromosome set size\n lastSetOffset += lastSetSize;\n\n return lastSetOffset + this._getAdditionalOffset() * 2;\n }\n\n getWidth() {\n return this._config.chrHeight + this.margin.top * 1.5;\n }\n\n getChromosomeSetLabelAnchor() {\n return 'end';\n }\n\n getChromosomeBandLabelAnchor() {\n return null;\n }\n\n getChromosomeBandTickY1() {\n return 2;\n }\n\n getChromosomeBandTickY2() {\n return 10;\n }\n\n getChromosomeSetLabelTranslate() {\n return null;\n }\n\n getChromosomeSetTranslate(setIndex) {\n var leftMargin = this._getLeftMargin();\n var yTranslate = this.getChromosomeSetYTranslate(setIndex);\n return 'translate(' + leftMargin + ', ' + yTranslate + ')';\n }\n\n getChromosomeSetYTranslate(setIndex) {\n // If no detailed description provided just use one formula for all cases.\n if (!this._config.ploidyDesc) {\n return this._config.chrMargin * (setIndex + 1);\n }\n\n // Id detailed description provided start to calculate offsets\n // for each chromosome set separately. This should be done only once.\n if (!this._translate) {\n // First offset equals to zero.\n this._translate = [1];\n\n // Loop through description set\n for (var i = 1; i < this._config.ploidyDesc.length; i++) {\n this._translate[i] =\n this._translate[i - 1] + this._getChromosomeSetSize(i - 1);\n }\n }\n\n return this._translate[setIndex];\n }\n\n getChromosomeSetLabelXPosition(i) {\n if (this._config.ploidy === 1) {\n return this.getChromosomeLabelXPosition(i);\n } else {\n return -20;\n }\n }\n\n getChromosomeSetLabelYPosition(i) {\n var setSize = this._ploidy.getSetSize(i),\n config = this._config,\n chrMargin = config.chrMargin,\n chrWidth = config.chrWidth,\n y;\n\n if (config.ploidy === 1) {\n y = chrWidth / 2 + 3;\n } else {\n y = (setSize * chrMargin) / 2;\n }\n\n return y;\n }\n\n getChromosomeLabelXPosition() {\n return -8;\n }\n\n getChromosomeLabelYPosition() {\n return this._config.chrWidth;\n }\n\n}\n\nexport default HorizontalLayout;\n","/**\n* @fileoverview Paired layout class\n* Ideograms with paired layout group each chromosome in a chromosome set.\n* This enables ploidy support beyond the default haploid; e.g. diploid genomes.\n*/\n\nimport Layout from './layout';\n\nclass PairedLayout extends Layout {\n\n constructor(config, ideo) {\n super(config, ideo);\n\n this._class = 'PairedLayout';\n\n this.margin = {\n left: 30\n };\n }\n\n getHeight() {\n return this._config.chrHeight + this.margin.left * 1.5;\n }\n\n getWidth() {\n return '97%';\n }\n\n getChromosomeBandTickY1(chrIndex) {\n return chrIndex % 2 ? this._config.chrWidth : this._config.chrWidth * 2;\n }\n\n getChromosomeBandTickY2(chrIndex) {\n var width = this._config.chrWidth;\n return chrIndex % 2 ? width - this._tickSize : width * 2 + this._tickSize;\n }\n\n getChromosomeBandLabelAnchor(chrIndex) {\n return chrIndex % 2 ? null : 'end';\n }\n\n getChromosomeBandLabelTranslate(band, chrIndex) {\n var x = chrIndex % 2 ? 10 : -this._config.chrWidth - 10;\n var y = this._ideo.round(band.px.start + band.px.width / 2) + 3;\n\n return {\n x: y,\n y: y,\n translate: 'rotate(-90) translate(' + x + ', ' + y + ')'\n };\n }\n\n getChromosomeLabelXPosition() {\n return -this._tickSize;\n }\n\n getChromosomeSetLabelXPosition() {\n return this._config.chrWidth / -2;\n }\n\n getChromosomeSetLabelTranslate() {\n return 'rotate(-90)';\n }\n\n getChromosomeSetTranslate(setIndex) {\n var chromosomeSetYTranslate = this.getChromosomeSetYTranslate(setIndex);\n return (\n 'rotate(90) ' +\n 'translate(' + this.margin.left + ', -' + chromosomeSetYTranslate + ')'\n );\n }\n\n getChromosomeSetYTranslate(setIndex) {\n return 200 * (setIndex + 1);\n }\n\n}\n\nexport default PairedLayout;\n","import Layout from './layout';\n\nclass SmallLayout extends Layout {\n\n constructor(config, ideo) {\n super(config, ideo);\n\n this._class = 'SmallLayout';\n\n this.margin = {\n left: 36.5,\n top: 10\n };\n\n var taxid = this._ideo.getTaxid(this._ideo.config.organism);\n\n this.chrs = config.chromosomes[taxid];\n var numChrs = this.chrs.length;\n\n // Number of chromosomes per row\n this.chrsPerRow = Math.ceil(numChrs / config.rows);\n }\n\n // rotateForward(setIndex, chrIndex, chrElement, callback) {\n // var ideoBox =\n // d3.select(this._ideo.selector).node().getBoundingClientRect();\n // var chrBox = chrElement.getBoundingClientRect();\n //\n // var scaleX = (ideoBox.width / chrBox.height) * 0.97;\n // var scaleY = this._getYScale();\n //\n // transform = 'translate(5, 25) scale(' + scaleX + ', ' + scaleY + ')';\n //\n // d3.select(chrElement.parentNode)\n // .transition()\n // .attr('transform', transform)\n // .on('end', callback);\n // }\n //\n // rotateBack(setIndex, chrIndex, chrElement, callback) {\n // var translate = this.getChromosomeSetTranslate(setIndex);\n //\n // d3.select(chrElement.parentNode)\n // .transition()\n // .attr('transform', translate)\n // .on('end', callback);\n // }\n\n /**\n * eweitz 2020-04-13:\n * This height metric is crude because it is calculated before\n * the height (\"width\") of each chromosome is calculated.\n *\n * It calculates height by multiplying the max height of all chromosomes\n * (specified in the Ideogram configuration object) by the number of rows.\n * This ensures the ideogram height doesn't truncate in cases like dog\n * (where chrX on the second row is longer than chr1 on the first), but it\n * often leaves too much space on the second row, e.g. for human.\n *\n * Ideally, ideogram height would be cumulative height per row, plus top\n * margin. This would require calling getHeight _after_ all chromosomes\n * have had their height (technically, chr.width) assigned. See draft new\n * getHeight method below this getHeight method.\n */\n getHeight() {\n var config = this._config;\n var chrHeight = config.chrHeight * 1.25;\n return this._config.rows * (chrHeight + this.margin.top);\n }\n\n /**\n * eweitz 2020-04-13:\n * Draft refinement of getHeight. See note in classic version above.\n *\n * Total height is cumulative height per row, plus top margin\n */\n // getHeight() {\n // let height = 0;\n // const rows = this._config.rows;\n // const chrEntries = Object.entries(this.chrs);\n\n // for (let i = 0; i < rows; i++) {\n // let rowHeight = 0;\n // // Starting and ending indexes of chromosomes of this row\n // const startIndex = this.chrsPerRow * i;\n // const endIndex = this.chrsPerRow * (i + 1) - 1;\n\n // for (let j = startIndex; j < endIndex; j++) {\n // const thisChrHeight = chrEntries[j][1].width;\n // if (thisChrHeight > rowHeight) {\n // rowHeight = thisChrHeight;\n // }\n // }\n // height += rowHeight + this.margin.top;\n // }\n\n // return height;\n // }\n\n getWidth() {\n return '97%';\n }\n\n getChromosomeBandLabelTranslate() {\n\n }\n\n getChromosomeSetLabelTranslate() {\n return 'rotate(-90)';\n }\n\n getChromosomeSetTranslate(setIndex) {\n var xOffset, yOffset;\n\n if (setIndex > this.chrsPerRow - 1) {\n xOffset = this.margin.left + this._config.chrHeight * 1.3;\n yOffset = this.getChromosomeSetYTranslate(setIndex - this.chrsPerRow);\n } else {\n xOffset = this.margin.left;\n yOffset = this.getChromosomeSetYTranslate(setIndex);\n }\n\n return 'rotate(90) translate(' + xOffset + ', -' + yOffset + ')';\n }\n\n getChromosomeSetYTranslate(setIndex) {\n // Get additional padding caused by annotation tracks\n var additionalPadding = this._getAdditionalOffset() * 0.3;\n // If no detailed description provided just use one formula for all cases\n return (\n this.margin.left * (setIndex) + this._config.chrWidth +\n additionalPadding * 2 + additionalPadding * setIndex\n );\n }\n\n getChromosomeSetLabelXPosition(setIndex) {\n return (\n ((this._ploidy.getSetSize(setIndex) * this._config.chrWidth + 20) / -2) +\n (this._config.ploidy > 1 ? 0 : this._config.chrWidth)\n );\n }\n\n getChromosomeLabelXPosition() {\n return this._config.chrWidth / -2;\n }\n\n}\n\nexport default SmallLayout;\n","import {d3} from '../lib';\nimport {Ploidy} from '../ploidy';\nimport {getLayout} from '../layouts/layout-adapter';\n\n/**\n * If ploidy description is a string, then convert it to the canonical\n * array format. String ploidyDesc is used when depicting e.g. parental\n * origin each member of chromosome pair in a human genome.\n * See ploidy-basic.html for usage example.\n */\nfunction setPloidy(ideo) {\n if (\n 'ploidyDesc' in ideo.config &&\n typeof ideo.config.ploidyDesc === 'string'\n ) {\n var tmp = [];\n for (var i = 0; i < ideo.numChromosomes; i++) {\n tmp.push(ideo.config.ploidyDesc);\n }\n ideo.config.ploidyDesc = tmp;\n }\n // Organism ploidy description\n ideo._ploidy = new Ploidy(ideo.config);\n}\n\nfunction getContainerSvgClass(ideo) {\n var svgClass = '';\n if (ideo.config.showChromosomeLabels) {\n if (ideo.config.orientation === 'horizontal') {\n svgClass += 'labeledLeft ';\n } else {\n svgClass += 'labeled ';\n }\n }\n\n if (ideo.config.rotatable === false) {\n svgClass += 'no-rotate ';\n }\n\n if (\n ideo.config.annotationsLayout &&\n ideo.config.annotationsLayout === 'overlay'\n ) {\n svgClass += 'faint';\n }\n\n return svgClass;\n}\n\n/**\n * Write tooltip div setup with default styling.\n */\nfunction writeTooltipContainer(ideo) {\n d3.select(ideo.config.container + ' #_ideogramOuterWrap').append('div')\n .attr('class', '_ideogramTooltip')\n .attr('id', '_ideogramTooltip')\n .style('opacity', 0)\n .style('position', 'fixed')\n .style('text-align', 'center')\n .style('padding', '4px')\n .style('font', '12px sans-serif')\n .style('background', 'white')\n .style('border', '1px solid black')\n .style('border-radius', '5px')\n .style('z-index', '1000');\n}\n\nfunction writeContainerDom(ideo) {\n\n // Remove any previous container content\n d3.selectAll(ideo.config.container + ' #_ideogramOuterWrap').remove();\n\n d3.select(ideo.config.container)\n .append('div')\n .attr('id', '_ideogramOuterWrap')\n .append('div')\n .attr('id', '_ideogramTrackLabelContainer')\n .style('position', 'absolute');\n\n d3.select(ideo.config.container + ' #_ideogramOuterWrap').append('div')\n .attr('id', '_ideogramMiddleWrap') // needed for overflow and scrolling\n .style('position', 'relative')\n .style('overflow-x', 'auto')\n .style('transform', 'translateZ(0)') // add compositing layer for ideogram\n .append('div')\n .attr('id', '_ideogramInnerWrap') // needed for overflow and scrolling\n .append('svg')\n .attr('id', '_ideogram')\n .attr('class', getContainerSvgClass(ideo))\n .attr('width', ideo._layout.getWidth())\n .attr('height', ideo._layout.getHeight())\n .html(ideo.getBandColorGradients());\n}\n\n/**\n * Writes the HTML elements that contain this ideogram instance.\n */\nfunction writeContainer(t0) {\n var ideo = this;\n\n if (ideo.config.annotationsPath) {\n ideo.fetchAnnots(ideo.config.annotationsPath);\n }\n\n setPloidy(ideo);\n\n ideo._layout = getLayout(ideo);\n\n writeContainerDom(ideo);\n\n ideo.isOnlyIdeogram = document.querySelectorAll('#_ideogram').length === 1;\n writeTooltipContainer(ideo);\n ideo.finishInit(t0);\n}\n\nexport {writeContainer};\n","import VerticalLayout from './vertical-layout';\nimport HorizontalLayout from './horizontal-layout';\nimport PairedLayout from './paired-layout';\nimport SmallLayout from './small-layout';\n\nfunction getLayout(ideo) {\n var config = ideo.config;\n\n if ('perspective' in config && config.perspective === 'comparative') {\n return new PairedLayout(config, ideo);\n } else if ('rows' in config && config.rows > 1) {\n return new SmallLayout(config, ideo);\n } else if (config.orientation === 'vertical') {\n return new VerticalLayout(config, ideo);\n } else if (config.orientation === 'horizontal') {\n return new HorizontalLayout(config, ideo);\n } else {\n return new VerticalLayout(config, ideo);\n }\n}\n\nexport {getLayout};\n","import {hasNonGenBankAssembly, fetchWithRetry} from '../lib';\n\nvar lastBandDataUrl = '';\n\nfunction getBandUrl(bandDataFileNames, taxid, ideo) {\n return ideo.config.dataDir + bandDataFileNames[taxid];\n}\n\nfunction shouldFetchBands(bandDataFileNames, taxid, ideo) {\n var bandDataUrl = getBandUrl(bandDataFileNames, taxid, ideo);\n return (\n !(typeof window.chrBands !== 'undefined' && lastBandDataUrl === '') ||\n lastBandDataUrl !== bandDataUrl\n ) &&\n hasNonGenBankAssembly(ideo) &&\n taxid in bandDataFileNames;\n}\n\nfunction setBandData(url, fileNames, chrBands, ideo) {\n var taxid, fetchedTaxid, fileName;\n\n // Ensures correct taxid is processed in response callback;\n // using simply upstream 'taxid' variable gives the last\n // *requested* taxid, which fails when dealing with multiple taxa.\n for (taxid in fileNames) {\n fileName = fileNames[taxid];\n if (url.includes(fileName) && fileName !== '') {\n fetchedTaxid = taxid;\n }\n }\n\n ideo.bandData[fetchedTaxid] = chrBands;\n}\n\nfunction fetchBands(bandDataFileNames, taxid, t0, ideo) {\n var bandDataUrl = getBandUrl(bandDataFileNames, taxid, ideo);\n\n if (!ideo.numBandDataResponses) ideo.numBandDataResponses = 0;\n\n return fetchWithRetry(bandDataUrl)\n .then(function(response) {\n return response.json().then(function(rawBands) {\n lastBandDataUrl = bandDataUrl;\n\n delete window.chrBands; // Remove any previous chrBands variable\n window.chrBands = rawBands.chrBands;\n\n setBandData(response.url, bandDataFileNames, chrBands, ideo);\n });\n });\n}\n\nexport {shouldFetchBands, fetchBands};\n","/**\n * @fileoveriew Methods for initialization\n */\n\nimport {d3, slug} from '../lib';\nimport {configure} from './configure';\nimport {finishInit} from './finish-init';\nimport {writeContainer} from './write-container';\nimport {shouldFetchBands, fetchBands} from '../bands/fetch';\nimport {organismMetadata} from './organism-metadata';\n\nfunction isHeterogameticChromosome(chrModel, chrIndex, ideo) {\n var ploidy = ideo.config.ploidy;\n return (\n 'sex' in ideo.config &&\n (\n ploidy === 2 && ideo.sexChromosomes.index + 1 === chrIndex ||\n ideo.config.sex === 'female' && chrModel.name === 'Y'\n )\n );\n}\n\nfunction prepareChromosomes(bandsArray, chrs, taxid, ideo) {\n var j, bands, chromosome, chrModel, chrIndex;\n\n for (j = 0; j < chrs.length; j++) {\n chromosome = chrs[j];\n if (typeof bandsArray !== 'undefined') bands = bandsArray[j];\n\n chrIndex = j + ideo.config.taxids.indexOf(taxid);\n chrModel = ideo.getChromosomeModel(bands, chromosome, taxid, chrIndex);\n\n if (typeof chromosome !== 'string') {\n chromosome = chromosome.name.split(' ').slice(-1)[0].replace('chr', '');\n }\n\n ideo.chromosomes[taxid][chromosome] = chrModel;\n ideo.chromosomesArray.push(chrModel);\n\n if (isHeterogameticChromosome(chrModel, j, ideo)) continue;\n\n ideo.drawChromosome(chrModel);\n }\n}\n\nfunction setCoordinateSystem(chrs, ideo) {\n if (\n typeof chrBands !== 'undefined' &&\n chrs.length >= chrBands.length / 2\n ) {\n ideo.coordinateSystem = 'bp';\n }\n}\n\n/**\n * Configures chromosome data and calls downstream chromosome drawing functions\n */\nfunction initDrawChromosomes() {\n var taxid, i, chrs, bandsArray,\n ideo = this,\n taxids = ideo.config.taxids;\n\n for (i = 0; i < taxids.length; i++) {\n taxid = taxids[i];\n chrs = ideo.config.chromosomes[taxid];\n\n bandsArray = ideo.bandsArray[taxid];\n\n if (!ideo.config.showNonNuclearChromosomes) {\n // Remove MT\n // TODO: Handle other non-nuclear chromosomes, e.g. CP, AP\n chrs = chrs.filter(chr => chr !== 'MT');\n if (typeof bandsArray !== 'undefined') {\n bandsArray = bandsArray.filter(bands => {\n return bands[0].chr !== 'MT';\n });\n }\n }\n\n setCoordinateSystem(chrs, ideo);\n\n ideo.chromosomes[taxid] = {};\n ideo.setSexChromosomes(chrs);\n\n prepareChromosomes(bandsArray, chrs, taxid, ideo);\n\n if (ideo.config.showBandLabels) ideo.drawBandLabels(ideo.chromosomes);\n ideo.handleRotateOnClick();\n ideo._gotChrModels = true; // Prevent issue with errant rat centromeres\n }\n}\n\n/**\n * Attach any click handlers to rotate and toggle chromosomes\n */\nfunction handleRotateOnClick() {\n var ideo = this;\n\n if (!('rotatable' in ideo.config && ideo.config.rotatable === false)) {\n d3.selectAll(ideo.selector + ' .chromosome-set').on('click', function() {\n // Handles click on chromosome graphic or label.\n // Label click needed to toggle e.g. human MT\n const element = this.children[1];\n\n ideo.rotateAndToggleDisplay(element);\n });\n } else {\n d3.selectAll(ideo.selector).style('cursor', 'default');\n }\n}\n\n/**\n * Called when Ideogram has finished initializing.\n * Accounts for certain ideogram properties not being set until\n * asynchronous requests succeed, etc.\n */\nfunction onLoad() {\n call(this.onLoadCallback);\n}\n\nfunction getBandFileName(taxid, accession, ideo) {\n var organism = ideo.organisms[taxid];\n var bandFileName = [slug(organism.scientificName)];\n var assemblies = organism.assemblies;\n var resolution = ideo.config.resolution;\n\n if (accession !== assemblies.default) {\n bandFileName.push(accession);\n }\n if (\n taxid === '9606' &&\n (accession in assemblies === 'false' &&\n Object.values(assemblies).includes(config.assembly) ||\n (resolution !== '' && resolution !== 850))\n ) {\n bandFileName.push(resolution);\n }\n\n bandFileName = bandFileName.join('-');\n\n var fullyBandedTaxids = ['9606', '10090', '10116'];\n if (fullyBandedTaxids.includes(taxid) && !ideo.config.showFullyBanded) {\n bandFileName += '-no-bands';\n }\n\n bandFileName += '.json';\n\n return bandFileName;\n}\n\nfunction getBandFileNames(taxid, bandFileNames, ideo) {\n var organism, assemblies, accession, bandFileName,\n config = ideo.config;\n\n organism = ideo.organisms[taxid];\n\n if (!config.assembly) ideo.config.assembly = 'default';\n\n assemblies = organism.assemblies;\n\n if (ideo.assemblyIsAccession()) {\n accession = config.assembly;\n } else {\n accession = assemblies[config.assembly];\n }\n\n bandFileName = getBandFileName(taxid, accession, ideo);\n var isCustomOrganism = taxid === '-1';\n\n if (taxid in ideo.organismsWithBands || isCustomOrganism) {\n bandFileNames[taxid] = bandFileName;\n }\n return bandFileNames;\n}\n\nfunction prepareContainer(taxid, bandFileNames, t0, ideo) {\n\n if (shouldFetchBands(bandFileNames, taxid, ideo)) {\n return fetchBands(bandFileNames, taxid, t0, ideo).then(function() {\n return ideo.processBandData(taxid);\n });\n } else {\n return new Promise(function(resolve) {\n ideo.processBandData(taxid);\n resolve([taxid, undefined]);\n });\n }\n}\n\nfunction initializeTaxids(ideo) {\n return new Promise(function(resolve) {\n var organism = ideo.config.organism;\n if (typeof organism === 'number') {\n // 'organism' is a taxid, e.g. 9606\n ideo.getOrganismFromEutils(organism, function() {\n ideo.getTaxids(resolve);\n });\n } else {\n ideo.getTaxids(resolve);\n }\n\n });\n}\n\nfunction getBandsAndPrepareContainer(taxids, t0, ideo) {\n var bandFileNames, i, taxid,\n promises = [];\n\n bandFileNames = {};\n for (taxid in organismMetadata) {\n bandFileNames[taxid] = '';\n }\n\n for (i = 0; i < taxids.length; i++) {\n taxid = String(taxids[i]);\n bandFileNames = getBandFileNames(taxid, bandFileNames, ideo);\n promises.push(prepareContainer(taxid, bandFileNames, t0, ideo));\n }\n\n Promise.all(promises).then(function(taxidsAndBandsArrays) {\n var taxidAndBandsArray, taxid, bandsArray;\n\n for (i = 0; i < taxidsAndBandsArrays.length; i++) {\n taxidAndBandsArray = taxidsAndBandsArrays[i];\n taxid = taxidAndBandsArray[0];\n bandsArray = taxidAndBandsArray[1];\n\n if ('bandsArray' in ideo === false) {\n ideo.bandsArray = {};\n }\n\n ideo.bandsArray[taxid] = bandsArray;\n }\n ideo.writeContainer(t0);\n });\n}\n\n/**\n * Initializes an ideogram.\n * Sets some high-level properties based on instance configuration,\n * fetches band and annotation data if needed, and\n * writes an SVG element to the document to contain the ideogram\n */\n// Prevents race condition when init is called multiple times in\n// quick succession.\n// See https://github.com/eweitz/ideogram/pull/154.\nvar ideoNext = {};\nvar ideoQueued = {};\nvar ideoWait = {};\n\nfunction init(ideo) {\n ideo = ideo || this;\n var containerId = ideo.config.container;\n\n if (ideoWait[containerId]) {\n ideoQueued[containerId] = true;\n ideoNext[containerId] = ideo;\n } else {\n ideoWait[containerId] = true;\n initializeTaxids(ideo)\n .then(function(taxids) {\n\n var taxid = taxids[0];\n ideo.config.taxid = taxid;\n ideo.config.taxids = taxids;\n\n ideo.organismScientificName =\n ideo.getScientificName(ideo.config.taxid);\n\n var t0 = new Date().getTime();\n getBandsAndPrepareContainer(taxids, t0, ideo);\n\n ideoWait[containerId] = false;\n if (ideoQueued[containerId]) {\n ideoQueued[containerId] = false;\n init(ideoNext[containerId]);\n }\n });\n }\n}\n\nexport {\n configure, initDrawChromosomes, handleRotateOnClick,\n onLoad, init, finishInit, writeContainer\n};\n","/**\n * @fileoverview Parse raw Ideogram.js annotations from a BED file\n * BED documentation: https://genome.ucsc.edu/FAQ/FAQformat#format1\n */\n\nexport class BedParser {\n\n constructor(bed, ideo) {\n this.rawAnnots = this.parseBed(bed, ideo);\n }\n\n // http://stackoverflow.com/a/5624139\n static componentToHex(c) {\n var hex = parseInt(c, 10).toString(16);\n return hex.length === 1 ? '0' + hex : hex;\n }\n\n static rgbToHex(r, g, b) {\n return (\n '#' +\n BedParser.componentToHex(r) +\n BedParser.componentToHex(g) +\n BedParser.componentToHex(b)\n );\n }\n\n parseGenomicCoordinates(columns, ucscStyle) {\n var chr, start, stop, length;\n\n // These three columns (i.e. fields) are required\n chr = columns[0];\n start = parseInt(columns[1], 10);\n stop = parseInt(columns[2], 10);\n\n length = stop - start;\n\n if (ucscStyle) {\n chr = chr.slice(3);\n }\n\n return [chr, start, stop, length];\n }\n\n /**\n * Parses an annotation from a tab-separated line of a BED file\n */\n parseAnnotFromTsvLine(tsvLine, chrs, ucscStyle) {\n var annot, chrIndex, chr, start, rgb, color, label,\n columns = tsvLine.split(/\\s/g);\n\n [chr, start, stop, length] =\n this.parseGenomicCoordinates(columns, ucscStyle);\n\n chrIndex = chrs.indexOf(chr);\n if (chrIndex === -1) return [null, null];\n\n annot = ['', start, length, 0];\n\n if (columns.length >= 4) {\n label = columns[3];\n annot[0] = label;\n }\n\n if (columns.length >= 8) {\n rgb = columns[8].split(',');\n color = BedParser.rgbToHex(rgb[0], rgb[1], rgb[2]);\n annot.push(color);\n }\n\n return [chrIndex, annot];\n }\n\n parseRawAnnots(annots, bedStartIndex, tsvLines, chrs) {\n var i, line, chrIndex, annot, keys, rawAnnots, ucscStyle;\n\n ucscStyle = true;\n if (isNaN(parseInt(tsvLines[bedStartIndex], 10)) === false) {\n ucscStyle = false;\n }\n\n for (i = bedStartIndex; i < tsvLines.length; i++) {\n line = tsvLines[i];\n [chrIndex, annot] = this.parseAnnotFromTsvLine(line, chrs, ucscStyle);\n if (chrIndex !== null) annots[chrIndex].annots.push(annot);\n }\n\n keys = ['name', 'start', 'length', 'trackIndex'];\n if (tsvLines[bedStartIndex].length >= 8) keys.push('color');\n\n rawAnnots = {keys: keys, annots: annots};\n\n return rawAnnots;\n }\n\n /**\n * Parses a BED file, returns raw annotations\n */\n parseBed(bed, ideo) {\n var i, chrs, chr, bedStartIndex, rawAnnots,\n annots = [],\n tsvLines = bed.split(/\\r\\n|\\n/);\n\n chrs = Object.keys(ideo.chromosomes[ideo.config.taxid]);\n\n for (i = 0; i < chrs.length; i++) {\n chr = chrs[i];\n annots.push({chr: chr, annots: []});\n }\n\n bedStartIndex = 0; // 1 if BED has header (i.e. track line), 0 otherwise\n if (tsvLines[0].slice(0, 3) === 'chr' || isNaN(parseInt(tsvLines[0], 10))) {\n bedStartIndex = 1;\n }\n\n rawAnnots = this.parseRawAnnots(annots, bedStartIndex, tsvLines, chrs);\n return rawAnnots;\n }\n\n}\n","/**\n * @fileoverview Parse raw Ideogram.js annotations from a TSV file\n */\n\nexport class TsvParser {\n\n constructor(tsv, ideo) {\n this.rawAnnots = this.parseTsv(tsv, ideo);\n }\n\n parseGenomicCoordinates(columns) {\n var chr, start, stop, length;\n\n // These three columns (i.e. fields) are required\n chr = columns[1];\n start = parseInt(columns[2], 10);\n length = parseInt(columns[3], 10);\n\n stop = start + length;\n\n return [chr, start, stop, length];\n }\n\n /** If value has substring match in headers, return column index */\n getValueColumnIndex(value, headerLine) {\n let index;\n headerLine.split(/\\t/g).forEach((header, i) => {\n if (header.includes(value)) index = i;\n });\n return index;\n }\n\n /**\n * Parses an annotation from a tab-separated line of a TSV file\n */\n parseAnnotFromTsvLine(tsvLine, headerLine, chrs) {\n var annot, chrIndex, chr, start, color, fullName, significance, citations,\n name, index,\n columns = tsvLine.split(/\\t/g);\n\n [chr, start, stop, length] =\n this.parseGenomicCoordinates(columns);\n chrIndex = chrs.indexOf(chr);\n if (chrIndex === -1) return [null, null];\n\n name = columns[0];\n annot = [name, start, length, 0];\n\n if (headerLine.includes('color')) {\n index = this.getValueColumnIndex('color', headerLine);\n color = columns[index];\n annot.push(color);\n }\n if (headerLine.includes('full_name')) {\n index = this.getValueColumnIndex('full_name', headerLine);\n fullName = columns[index];\n annot.push(fullName);\n }\n if (headerLine.includes('citations')) {\n index = this.getValueColumnIndex('citations', headerLine);\n citations = columns[index];\n annot.push(citations);\n }\n if (headerLine.includes('significance')) {\n index = this.getValueColumnIndex('significance', headerLine);\n significance = columns[index];\n annot.push(significance);\n }\n\n return [chrIndex, annot];\n }\n\n parseRawAnnots(annots, tsvStartIndex, tsvLines, chrs) {\n var i, line, chrIndex, annot, keys, rawAnnots;\n\n const headerLine = tsvLines[0];\n\n for (i = tsvStartIndex; i < tsvLines.length; i++) {\n line = tsvLines[i];\n if (line.length === 0) continue; // Skip blank lines\n [chrIndex, annot] = this.parseAnnotFromTsvLine(line, headerLine, chrs);\n if (chrIndex !== null) annots[chrIndex].annots.push(annot);\n }\n\n keys = ['name', 'start', 'length', 'trackIndex'];\n if (headerLine.includes('color')) keys.push('color');\n if (headerLine.includes('full_name')) keys.push('fullName');\n if (headerLine.includes('citations')) keys.push('citations');\n if (headerLine.includes('significance')) keys.push('significance');\n\n rawAnnots = {keys: keys, annots: annots};\n\n return rawAnnots;\n }\n\n /**\n * Parses a TSV file, returns raw annotations\n */\n parseTsv(tsv, ideo) {\n var i, chrs, chr, tsvStartIndex, rawAnnots,\n annots = [],\n tsvLines = tsv.split(/\\r\\n|\\n/);\n\n chrs = Object.keys(ideo.chromosomes[ideo.config.taxid]);\n\n for (i = 0; i < chrs.length; i++) {\n chr = chrs[i];\n annots.push({chr: chr, annots: []});\n }\n\n tsvStartIndex = 0; // 1 if TSV has header (i.e. track line), 0 otherwise\n if (tsvLines[0].slice(0, 3) === 'chr' || isNaN(parseInt(tsvLines[0], 10))) {\n tsvStartIndex = 1;\n }\n\n rawAnnots = this.parseRawAnnots(annots, tsvStartIndex, tsvLines, chrs);\n\n if (tsvStartIndex === 1 && tsvLines[0].includes('citations')) {\n // TSV has a header, so parse citation_from__to_\n const headers = tsvLines[0].split('\\t');\n const citeIndex = 6;\n const citeHeader = headers[citeIndex];\n const fromTo = citeHeader.split('citations_')[1];\n rawAnnots.annots = rawAnnots.annots.map((annotsByChr) => {\n annotsByChr.annots = annotsByChr.annots.map((annot) => {\n annot[citeIndex] =\n annot[citeIndex] + ' citations ' + fromTo.replace(/_/g, ' ');\n return annot;\n });\n return annotsByChr;\n });\n }\n\n return rawAnnots;\n }\n\n}\n","/**\n * @fileoverview Functions used by parallel and collinear heatmaps.\n */\n\nvar reservedTrackKeys = [\n 'name', 'start', 'length', 'trackIndex', 'trackIndexOriginal', 'color'\n];\n\nvar defaultHeatmapColors = {\n 3: ['00B', 'DDD', 'F00'],\n 5: ['00D', '66D', 'DDD', 'F88', 'F00'],\n 17: [\n '00D', '00D', '00D', '00D', '00D', '44D', '44D', 'DDD', 'DDD',\n 'DDD', 'DDD', 'F88', 'F66', 'F22', 'F22', 'F00', 'F00', 'F00'\n ]\n};\n\n/**\n * Get label text for displayed tracks from annotation container metadata,\n * heatmap keys, or annotation container keys\n */\nfunction getLabels(ideo) {\n var annotKeys, labels, heatmaps, i;\n\n if (ideo.rawAnnots.metadata && ideo.rawAnnots.metadata.trackLabels) {\n labels = ideo.rawAnnots.metadata.trackLabels;\n } else if (ideo.config.heatmaps) {\n labels = [];\n heatmaps = ideo.config.heatmaps;\n for (i = 0; i < heatmaps.length; i++) {\n labels.push(heatmaps[i].key);\n }\n } else {\n annotKeys = ideo.rawAnnots.keys.slice(0);\n labels = annotKeys.filter(d => !reservedTrackKeys.includes(d));\n }\n\n if (ideo.displayedTrackIndexes) {\n labels = labels.filter(function(d, i) {\n return ideo.displayedTrackIndexes.includes(i + 1);\n });\n }\n\n return labels;\n}\n\n/**\n * Apply heatmap thresholds that are passed in as annotation metadata\n */\nfunction inflateThresholds(ideo) {\n var thresholds, colors,\n rawAnnots = ideo.rawAnnots;\n\n if (\n rawAnnots.metadata && !rawAnnots.metadata.heatmapThresholds &&\n !ideo.config.heatmapThresholds\n ) {\n return;\n }\n\n if (ideo.config.heatmapThresholds) {\n thresholds = ideo.config.heatmapThresholds;\n } else {\n thresholds = ideo.rawAnnots.metadata.heatmapThresholds;\n }\n\n colors = defaultHeatmapColors[thresholds.length + 1];\n thresholds = thresholds.map((d, i) => {\n return [d, '#' + colors[i]];\n });\n\n thresholds.push(['+', '#' + colors.slice(-1)[0]]);\n\n return thresholds;\n}\n\n/**\n * Set needed configuration options from raw annotation data.\n * Simplifies heatmap API by inferring reasonable defaults.\n */\nfunction inflateHeatmaps(ideo) {\n var i, labels, heatmaps, annotationTracks, rawAnnots, displayedTracks,\n thresholds = ideo.config.heatmapThresholds;\n\n heatmaps = [];\n rawAnnots = ideo.rawAnnots;\n labels = rawAnnots.keys.slice(3);\n\n annotationTracks = [];\n displayedTracks = [];\n if (rawAnnots.metadata || !isNaN(thresholds[0])) {\n thresholds = inflateThresholds(ideo);\n }\n\n for (i = 0; i < labels.length; i++) {\n heatmaps.push({key: labels[i], thresholds: thresholds});\n annotationTracks.push({id: labels[i]});\n displayedTracks.push(i + 1);\n }\n ideo.config.annotationsNumTracks = labels.length;\n ideo.config.annotationsDisplayedTracks = displayedTracks;\n ideo.config.heatmaps = heatmaps;\n ideo.config.annotationTracks = annotationTracks;\n}\n\n/**\n * Given annotation value (m), should it use the color in this threshold?\n */\nfunction shouldUseThresholdColor(m, numThresholds, value, prevThreshold,\n threshold) {\n\n return (\n // If this is the last threshold, and\n // its value is \"+\" and the value is above the previous threshold...\n m === numThresholds && (\n threshold === '+' && value > prevThreshold\n ) ||\n\n // ... or if the value matches the threshold...\n value === threshold ||\n\n // ... or if this isn't the first or last threshold, and\n // the value is between this threshold and the previous one...\n m !== 0 && m !== numThresholds && (\n value <= threshold &&\n value > prevThreshold\n ) ||\n\n // ... or if this is the first threshold and the value is\n // at or below the threshold\n m === 0 && value <= threshold\n );\n}\n\n/**\n * Determine the color of the heatmap annotation.\n */\nfunction getHeatmapAnnotColor(thresholds, value) {\n var m, numThresholds, thresholdList, threshold, tvNum, thresholdColor,\n prevThreshold, useThresholdColor, color;\n\n for (m = 0; m < thresholds.length; m++) {\n numThresholds = thresholds.length - 1;\n thresholdList = thresholds[m];\n threshold = thresholdList[0];\n\n // The threshold value is usually a number,\n // but can also be a \"+\" character indicating that\n // this threshold is anything greater than the previous threshold.\n tvNum = parseFloat(threshold);\n if (isNaN(tvNum) === false) threshold = tvNum;\n if (m !== 0) prevThreshold = parseFloat(thresholds[m - 1][0]);\n thresholdColor = thresholdList[1];\n\n useThresholdColor = shouldUseThresholdColor(m, numThresholds, value,\n prevThreshold, threshold);\n\n if (useThresholdColor) color = thresholdColor;\n }\n\n return color;\n}\n\nexport {\n getLabels, inflateHeatmaps, inflateThresholds, defaultHeatmapColors,\n getHeatmapAnnotColor\n};\n","/**\n * @fileoverview Functions for collinear heatmaps of genome annotations.\n * See heatmap.js for more.\n */\n\nimport {d3} from '../lib';\nimport {writeTrackLabels} from './track-labels-collinear';\nimport {inflateHeatmaps} from './heatmap-lib';\n\n/**\n * Add canvases that will contain annotations. One canvas per track.\n */\nfunction writeCanvases(chr, chrLeft, ideo) {\n var j, trackLeft, trackWidth, canvas, context, id,\n chrWidth = chr.width,\n contextArray = [],\n annotLabelHeight = ideo.config.annotLabelHeight,\n numAnnotTracks = ideo.config.numAnnotTracks;\n\n // Create a canvas for each annotation track on this chromosome\n for (j = 0; j < numAnnotTracks; j++) {\n trackWidth = ideo.config.annotationHeight + annotLabelHeight + 4;\n id = chr.id + '-canvas-' + j; // e.g. chr1-9606-canvas-0\n trackLeft = chrLeft;\n if (chr.chrIndex > 0) {\n trackLeft += (ideo.config.chrMargin * chr.chrIndex) - 1;\n }\n canvas = d3.select(ideo.config.container + ' #_ideogramInnerWrap')\n .append('canvas')\n .attr('id', id)\n .attr('width', chrWidth + 1)\n .attr('height', trackWidth)\n .style('position', 'absolute')\n .style('left', trackLeft + 'px')\n .style('top', (trackWidth * j + 1) + 'px');\n context = canvas.nodes()[0].getContext('2d');\n contextArray.push([context, chr]);\n }\n\n return contextArray;\n}\n\n/**\n * Render annotations on the canvas\n */\nfunction fillCanvasAnnots(annots, contextArray, ideo) {\n var j, annot, context, chr,\n annotLabelHeight = ideo.config.annotLabelHeight,\n annotHeight = ideo.config.annotationHeight,\n demarcateChrs = ideo.config.demarcateCollinearChromosomes;\n\n var trackWidth = annotHeight + annotLabelHeight + 4;\n\n // Fill in the canvas(es) with annotation colors to draw a heatmap\n for (j = 0; j < annots.length; j++) {\n annot = annots[j];\n context = contextArray[annot.trackIndex][0];\n chr = contextArray[annot.trackIndex][1];\n context.fillStyle = annot.color;\n if (demarcateChrs) {\n if (annot.startPx < 1 || annot.startPx > chr.width - 1) continue;\n context.fillRect(annot.startPx, 1, 0.5, trackWidth);\n } else {\n context.fillRect(annot.startPx, annotLabelHeight + 1, 0.5, annotHeight);\n }\n }\n\n if (demarcateChrs) {\n for (j = 0; j < contextArray.length; j++) {\n context = contextArray[j][0];\n chr = contextArray[j][1];\n context.fillStyle = '#555';\n if (chr.chrIndex === 0) context.fillRect(0, 0, 1, trackWidth);\n context.fillRect(chr.width - 1, 0, 1.1, trackWidth);\n context.fillRect(0, 0, chr.width + 1, 1);\n if (ideo.config.chrMargin) context.fillRect(0, 0, 1.1, trackWidth);\n }\n }\n}\n\n/**\n * Draw a 1D heatmap of annotations along each chromosome.\n * Ideal for representing very dense annotation sets in a granular manner\n * without subsampling.\n *\n * TODO:\n * - Support in 'vertical' orientation\n * - Support after rotating chromosome on click\n */\nfunction drawHeatmapsCollinear(annotContainers, ideo) {\n var annots, chrLeft, contextArray, i, chr,\n prevX = 0,\n xBump = (ideo.config.showChromosomesLabels) ? 2 : -0.1;\n\n d3.select(ideo.selector).classed('labeledLeft', false);\n d3.selectAll(ideo.config.container + ' canvas').remove();\n\n // Each \"annotationContainer\" represents annotations for a chromosome\n for (i = 0; i < annotContainers.length; i++) {\n annots = annotContainers[i].annots;\n chr = ideo.chromosomesArray[i];\n if (i === 0) {\n chrLeft = 12;\n } else {\n chrLeft = prevX + ideo.chromosomesArray[i - 1].width + 14;\n prevX += ideo.chromosomesArray[i - 1].width + xBump;\n }\n contextArray = writeCanvases(chr, chrLeft, ideo);\n fillCanvasAnnots(annots, contextArray, ideo);\n }\n\n writeTrackLabels(ideo);\n\n if (ideo.onDrawAnnotsCallback) ideo.onDrawAnnotsCallback();\n}\n\nexport {drawHeatmapsCollinear, inflateHeatmaps};\n","/**\n * @fileoverview Functions for 2D heatmaps of genome annotations.\n * 2D heatmaps enable showing many (100+) tracks of data in one dimension,\n * for features (e.g. genes) along a dimension of genomic coordinates in\n * chromosome context.\n *\n * TO DO:\n * - Horizontal orientation\n * - Multiple chromosomes\n * - Non-human organisms\n */\n\nimport {d3} from '../lib';\nimport {getHeatmapAnnotColor} from './heatmap-lib';\n\n/**\n * Add one canvas that will contain all annotations. One canvas per chromosome.\n */\nfunction writeCanvas(chr, ideoHeight, width, ideo) {\n var left, canvas, context, id;\n\n id = chr.id + '-canvas'; // e.g. chr1-9606-canvas\n left = (ideo.config.chrWidth * 2) + ideo.config.annotationHeight - 0.5;\n canvas = d3.select(ideo.config.container + ' #_ideogramInnerWrap')\n .append('canvas')\n .attr('id', id)\n .attr('width', width)\n .attr('height', ideoHeight)\n .style('position', 'absolute')\n .style('left', left + 'px')\n .style('top', '0px');\n context = canvas.nodes()[0].getContext('2d');\n\n return context;\n}\n\n/**\n * Render annotations on the canvas.\n *\n * These annotations are 2D; each annotation has many values, each on a track.\n */\nfunction fillCanvasAnnotValues(annot, context, ideo) {\n var i, x, values,\n annotHeight = ideo.config.annotationHeight,\n ideoMarginTop = ideo._layout.margin.top;\n\n values = annot.values;\n\n // Fill canvas with annotation colors to draw the heatmap\n for (i = 0; i < values.length; i++) {\n context.fillStyle = values[i];\n x = (i - 1) * annotHeight;\n context.fillRect(x, annot.startPx + ideoMarginTop, annotHeight, 2);\n }\n}\n\n/**\n * Draw a 2D heatmap of annotations along one chromosome.\n *\n * TODO:\n * - Support in 'horizontal' orientation\n * - Support after rotating chromosome on click\n */\nfunction drawHeatmaps2d(annotContainers, ideo) {\n var annot, context, i, chr,\n container = ideo.config.container,\n ideoMarginTop = ideo._layout.margin.top,\n ideoHeight = ideo.config.chrHeight + ideoMarginTop,\n width = ideo.config.annotationHeight * annotContainers[0].values.length;\n\n d3.selectAll(container + ' canvas').remove();\n\n d3.select(container + ' #_ideogramInnerWrap')\n .style('max-width', width + 'px');\n d3.select(container + ' #_ideogram').attr('width', width);\n\n chr = ideo.chromosomesArray[0];\n\n context = writeCanvas(chr, ideoHeight, width, ideo);\n\n // Each \"annotationContainer\" represents annotations for a chromosome\n for (i = 0; i < annotContainers.length; i++) {\n annot = annotContainers[i];\n fillCanvasAnnotValues(annot, context, ideo);\n }\n\n if (ideo.onDrawAnnotsCallback) {\n ideo.onDrawAnnotsCallback();\n }\n}\n\nfunction add2dAnnotsForChr(annots, omittedAnnots, annotsByChr, chrModel,\n m, keys, ideo) {\n var j, k, annot, ra, stop, stopPx, color,\n thresholds = ideo.config.heatmapThresholds;\n\n for (j = 0; j < annotsByChr.annots.length; j++) {\n ra = annotsByChr.annots[j];\n annot = {};\n\n annot.values = []; // one value per track\n\n for (k = 0; k < 3; k++) {\n annot[keys[k]] = ra[k];\n }\n\n for (k = 3; k < keys.length; k++) {\n color = getHeatmapAnnotColor(thresholds, ra[k]);\n annot.values.push(color);\n }\n\n stop = annot.start + annot.length;\n\n annot.chr = annotsByChr.chr;\n annot.chrIndex = m;\n annot.startPx = ideo.convertBpToPx(chrModel, annot.start);\n stopPx = ideo.convertBpToPx(chrModel, stop);\n annot.px = Math.round((annot.startPx + stopPx) / 2);\n\n annots.push(annot);\n }\n\n annots.shift();\n\n return [annots, omittedAnnots];\n}\n\nexport {drawHeatmaps2d, add2dAnnotsForChr};\n","/**\n * @fileoverview Functions for labeling tracks of genome annotations.\n * Tracks are columns of annotations that run beside a chromosome.\n * Labeling tracks with descriptive names makes them easier to understand.\n */\n\nimport {d3} from '../lib';\nimport {getLabels} from './heatmap-lib';\n\n/**\n * Start a timer that, upon expiring, hides the track label.\n *\n * To enable users to copy label content to their clipboard, a timer is\n * used to control when the label disappears. It starts when the user's\n * cursor leaves the track or the label. If the user moves the cursor\n * back over the annot or label after the timer starts and before it expires,\n * then the timer is cleared.\n */\nfunction startHideTrackLabelTimeout(ideo) {\n if (ideo.config.showTrackLabel === false) return;\n\n ideo.hideTrackLabelTimeout = window.setTimeout(function() {\n d3.select(ideo.config.container + ' #_ideogramTrackLabel').transition()\n .duration(500)\n .style('opacity', 0);\n }, 250);\n}\n\n/**\n * Write label div setup with default styling.\n */\nfunction writeTrackLabelContainer(ideo) {\n d3.select(ideo.config.container + ' #_ideogramTrackLabelContainer')\n .append('div')\n .attr('id', '_ideogramTrackLabel')\n .style('opacity', 0)\n .style('position', 'absolute')\n .style('text-align', 'center')\n .style('padding', '1px')\n .style('font', '11px sans-serif')\n .style('background', 'white')\n .style('line-height', '10px')\n .style('z-index', '9000');\n}\n\n/**\n * Display track labels on the page\n */\nfunction renderTrackLabels(top, left, ideo) {\n d3.select(ideo.config.container + ' #_ideogramTrackLabel')\n .style('opacity', 1) // Make label visible\n .style('left', left + 'px')\n .style('top', top + 'px')\n .style('width', 'max-content')\n .style('transform-origin', 'bottom left')\n .style('text-align', 'left')\n .on('mouseover', function() {\n clearTimeout(ideo.hideTrackLabelTimeout);\n })\n .on('mouseout', function() {\n startHideTrackLabelTimeout(ideo);\n });\n}\n\n/**\n * Get left and top (x and y) offset for track label text\n */\nfunction getTrackLabelOffsets(labels, trackCanvas, ideo) {\n var firstTrackId, firstTrack, trackBox, labelBox, ideoBox, left, top,\n marginHack = 7; // TODO: Make this dynamic\n\n firstTrackId = trackCanvas.id.split('-').slice(0, -1).join('-') + '-0';\n firstTrack = d3.select(ideo.config.container + ' #' + firstTrackId)\n .nodes()[0];\n trackBox = firstTrack.getBoundingClientRect();\n\n labelBox = d3.select(ideo.config.container + ' #_ideogramTrackLabel')\n .nodes()[0].getBoundingClientRect();\n ideoBox = d3.select(ideo.config.container).nodes()[0]\n .getBoundingClientRect();\n\n left = Math.round(trackBox.left + labelBox.width) - trackBox.width - 1;\n left -= ideoBox.left - marginHack;\n top = -(labels.split('
').length - 2) * trackBox.width + 2;\n\n return [left, top];\n}\n\n/**\n * Show the label for this track\n */\nfunction showTrackLabel(trackCanvas, ideo) {\n var labels, left, top;\n\n clearTimeout(ideo.hideTrackLabelTimeout);\n\n labels = getLabels(ideo);\n labels = labels.join('
');\n\n // Clear any previous positioning, write track label text to DOM\n d3.select(ideo.config.container + ' #_ideogramTrackLabel')\n .interrupt() // Stop any in-progress disapperance\n .style('top', '')\n .style('left', '')\n .style('transform', null)\n .style('transform', 'rotate(-90deg)')\n .html(labels);\n\n [left, top] = getTrackLabelOffsets(labels, trackCanvas, ideo);\n\n renderTrackLabels(top, left, ideo);\n}\n\nexport {\n startHideTrackLabelTimeout, writeTrackLabelContainer, showTrackLabel\n};\n","/**\n * @fileoverview Functions for 2D heatmaps of genome annotations.\n * Heatmaps provide an easy way to visualize very dense annotation data.\n * Unlike the rest of Ideogram's graphics, which use SVG, heatmaps are\n * rendered using the Canvas element.\n */\n\nimport {d3} from '../lib';\nimport {drawHeatmapsCollinear} from './heatmap-collinear';\nimport {drawHeatmaps2d} from './heatmap-2d';\nimport {getHeatmapAnnotColor} from './heatmap-lib';\n\nimport {\n startHideTrackLabelTimeout, writeTrackLabelContainer, showTrackLabel\n} from './track-labels';\n\n/**\n * Add canvases that will contain annotations. One canvas per track.\n */\nfunction writeCanvases(chr, chrLeft, ideoHeight, ideo) {\n var j, trackLeft, trackWidth, canvas, context, id,\n contextArray = [],\n numAnnotTracks = ideo.config.numAnnotTracks;\n\n var marginHack = 7; // TODO: Make this dynamic\n\n // Create a canvas for each annotation track on this chromosome\n for (j = 0; j < numAnnotTracks; j++) {\n trackWidth = ideo.config.annotationHeight;\n id = chr.id + '-canvas-' + j; // e.g. chr1-9606-canvas-0\n trackLeft = chrLeft - trackWidth * (numAnnotTracks - j) - marginHack;\n canvas = d3.select(ideo.config.container + ' #_ideogramInnerWrap')\n .append('canvas')\n .attr('id', id)\n .attr('width', trackWidth)\n .attr('height', ideoHeight)\n .style('position', 'absolute')\n .style('left', trackLeft + 'px');\n context = canvas.nodes()[0].getContext('2d');\n contextArray.push(context);\n }\n\n return contextArray;\n}\n\n/**\n * Render annotations on the canvas\n */\nfunction fillCanvasAnnots(annots, contextArray, chrWidth, ideoMarginTop) {\n var j, annot, context, x;\n\n // Fill in the canvas(es) with annotation colors to draw a heatmap\n for (j = 0; j < annots.length; j++) {\n annot = annots[j];\n context = contextArray[annot.trackIndex];\n context.fillStyle = annot.color;\n x = annot.trackIndex - 1;\n context.fillRect(x, annot.startPx + ideoMarginTop, chrWidth, 0.5);\n }\n}\n\n/**\n * Draw a 1D heatmap of annotations along each chromosome.\n * Ideal for representing very dense annotation sets in a granular manner\n * without subsampling.\n *\n * TODO:\n * - Support in 'horizontal' orientation\n * - Support after rotating chromosome on click\n */\nfunction drawHeatmaps(annotContainers) {\n var annots, chrLeft, contextArray, chrWidth, i, chr,\n ideo = this,\n config = ideo.config,\n ideoMarginTop = ideo._layout.margin.top,\n ideoHeight = config.chrHeight + ideoMarginTop;\n\n if (config.geometry === 'collinear') {\n return drawHeatmapsCollinear(annotContainers, ideo);\n } else if (config.annotationsLayout === 'heatmap-2d') {\n return drawHeatmaps2d(annotContainers, ideo);\n }\n\n d3.selectAll(ideo.config.container + ' canvas').remove();\n\n writeTrackLabelContainer(ideo);\n\n // Each \"annotationContainer\" represents annotations for a chromosome\n for (i = 0; i < annotContainers.length; i++) {\n\n annots = annotContainers[i].annots;\n chr = ideo.chromosomesArray[i];\n chrWidth = ideo.config.chrWidth;\n chrLeft = ideo._layout.getChromosomeSetYTranslate(i);\n\n contextArray = writeCanvases(chr, chrLeft, ideoHeight, ideo);\n fillCanvasAnnots(annots, contextArray, chrWidth, ideoMarginTop);\n }\n\n d3.selectAll(ideo.config.container + ' canvas')\n .on('mouseover', function() {showTrackLabel(this, ideo);})\n .on('mouseout', function() {startHideTrackLabelTimeout(ideo);});\n\n if (ideo.onDrawAnnotsCallback) {\n ideo.onDrawAnnotsCallback();\n }\n}\n\n/**\n * Set color and track index for raw annotation objects.\n */\nfunction getNewRawAnnots(heatmapKeyIndexes, rawAnnots, ideo) {\n var j, k, ra, newRa, value, thresholds, color, trackIndex,\n newRas = [];\n\n for (j = 0; j < rawAnnots.length; j++) {\n ra = rawAnnots[j];\n for (k = 0; k < heatmapKeyIndexes.length; k++) {\n newRa = ra.slice(0, 3); // name, start, length\n\n value = ra[heatmapKeyIndexes[k]];\n thresholds = ideo.config.heatmaps[k].thresholds;\n color = getHeatmapAnnotColor(thresholds, value);\n\n trackIndex = k;\n newRa.push(trackIndex, color, value);\n newRas.push(newRa);\n }\n }\n\n return newRas;\n}\n\nfunction getNewRawAnnotContainers(heatmapKeyIndexes, rawAnnotBoxes, ideo) {\n var raContainer, chr, rawAnnots, newRas, i,\n newRaContainers = [];\n\n for (i = 0; i < rawAnnotBoxes.length; i++) {\n raContainer = rawAnnotBoxes[i];\n chr = raContainer.chr;\n\n rawAnnots = raContainer.annots;\n newRas = getNewRawAnnots(heatmapKeyIndexes, rawAnnots, ideo);\n\n newRaContainers.push({chr: chr, annots: newRas});\n }\n return newRaContainers;\n}\n\nfunction reportPerformance(t0, ideo) {\n var t1 = new Date().getTime();\n if (ideo.config.debug) {\n console.log('Time in deserializeAnnotsForHeatmap: ' + (t1 - t0) + ' ms');\n }\n}\n\n/**\n * Deserialize compressed annotation data into a format suited for heatmaps.\n *\n * This enables the annotations to be downloaded from a server without the\n * requested annotations JSON needing to explicitly specify track index or\n * color. The track index and color are inferred from the \"heatmaps\" Ideogram\n * configuration option defined before ideogram initialization.\n *\n * This saves time for the user.\n *\n * @param rawAnnotsContainer {Object} Raw annotations as passed from server\n */\nfunction deserializeAnnotsForHeatmap(rawAnnotsContainer) {\n var newRaContainers, heatmapKey, heatmapKeyIndexes, i,\n t0 = new Date().getTime(),\n keys = rawAnnotsContainer.keys,\n rawAnnotBoxes = rawAnnotsContainer.annots,\n ideo = this;\n\n heatmapKeyIndexes = [];\n for (i = 0; i < ideo.config.heatmaps.length; i++) {\n heatmapKey = ideo.config.heatmaps[i].key;\n heatmapKeyIndexes.push(keys.indexOf(heatmapKey));\n }\n\n newRaContainers =\n getNewRawAnnotContainers(heatmapKeyIndexes, rawAnnotBoxes, ideo);\n\n keys.splice(3, 0, 'trackIndex');\n keys.splice(4, 0, 'color');\n\n ideo.rawAnnots.keys = keys;\n ideo.rawAnnots.annots = newRaContainers;\n\n reportPerformance(t0, ideo);\n}\n\nexport {drawHeatmaps, deserializeAnnotsForHeatmap};\n","/**\n * @fileoverview Functions for labeling collinear tracks of genome annotations.\n * See track-labels.js for more.\n */\n\nimport {d3} from '../lib';\nimport {getLabels} from './heatmap-lib';\n\nfunction renderTrackLabels(labels, ideo) {\n var i, x, y, labelContainer, markBump,\n annotLabelHeight = ideo.config.annotLabelHeight,\n demarcateChrs = ideo.config.demarcateCollinearChromosomes;\n\n x = 11; // Close to chrLeft in heatmap-collinear.js. For tabs.\n markBump = (demarcateChrs ? 2 : 0); // Make labels flush with demarcations\n\n labelContainer =\n d3.select(ideo.config.container + ' #_ideogramTrackLabelContainer');\n labelContainer.html('');\n\n y = ideo.config.annotationHeight + annotLabelHeight + 4;\n\n for (i = 0; i < labels.length; i++) {\n labelContainer\n .style('position', 'absolute')\n .append('div')\n .attr('class', '_ideogramTrackLabel')\n .style('opacity', 1)\n .style('position', 'absolute')\n .style('text-align', 'center')\n .style('padding', '1px')\n .style('font', '11px sans-serif')\n .style('background', 'white')\n .style('line-height', '10px')\n .style('z-index', '5')\n .style('left', (x + markBump) + 'px')\n .style('top', (y * i + markBump) + 'px')\n .style('width', 'max-content')\n .style('transform-origin', 'bottom left')\n .style('text-align', 'left')\n .html(labels[i]);\n }\n\n}\n\n/**\n * Show the label for this track\n */\nfunction writeTrackLabels(ideo) {\n var labels = getLabels(ideo);\n renderTrackLabels(labels, ideo);\n}\n\nexport {writeTrackLabels};\n","import {d3} from '../lib';\n// import {getShapes} from './draw';\n\n/**\n * Optional callback, invoked when annotations are drawn\n */\nfunction onLoadAnnots() {\n call(this.onLoadAnnotsCallback);\n}\n\n/**\n * Optional callback, invoked when annotations are drawn\n */\nfunction onDrawAnnots() {\n call(this.onDrawAnnotsCallback);\n}\n\n/**\n * Starts a timer that, upon expiring, hides the annotation tooltip.\n *\n * To enable users to copy tooltip content to their clipboard, a timer is\n * used to control when the tooltip disappears. It starts when the user's\n * cursor leaves the annotation or the tooltip. If the user moves the cursor\n * back over the annot or tooltip after the timer starts and before it expires,\n * then the timer is cleared.\n */\nfunction startHideAnnotTooltipTimeout() {\n\n if (this.config.showAnnotTooltip === false) {\n return;\n }\n\n this.hideAnnotTooltipTimeout = window.setTimeout(function() {\n d3.select('._ideogramTooltip').transition()\n .duration(500) // fade out for half second\n .style('opacity', 0)\n .style('pointer-events', 'none');\n }, 250);\n}\n\nfunction renderTooltip(tooltip, content, matrix, yOffset, ideo) {\n tooltip.html(content)\n .style('opacity', 1) // Make tooltip visible\n .style('left', matrix.e + 'px')\n .style('top', (matrix.f - yOffset) + 'px')\n .style('font-family', ideo.config.fontFamily)\n .style('pointer-events', null) // Prevent bug in clicking chromosome\n .on('mouseover', function() {\n clearTimeout(ideo.hideAnnotTooltipTimeout);\n })\n .on('mouseout', function() {\n ideo.startHideAnnotTooltipTimeout();\n });\n}\n\nfunction getContentAndYOffset(annot) {\n var content, yOffset, range, displayName;\n\n range = 'chr' + annot.chr + ':' + annot.start.toLocaleString();\n if (annot.length > 0) {\n // Only show range if stop differs from start\n range += '-' + annot.stop.toLocaleString();\n }\n content = range;\n yOffset = 24;\n\n if (annot.name) {\n displayName = annot.displayName ? annot.displayName : annot.name;\n content = displayName + '
' + content;\n yOffset += 8;\n }\n\n return [content, yOffset];\n}\n\n/**\n * Optional callback, invoked before showing annotation tooltip\n */\nfunction onWillShowAnnotTooltip(annot) {\n call(this.onWillShowAnnotTooltipCallback, annot);\n}\n\n/**\n * Optional callback, invoked on clicking annotation\n */\nfunction onClickAnnot(annot) {\n this.onClickAnnotCallback(annot);\n}\n\n// /** Get list of annotation objects by names, e.g. [\"BRCA1\", \"APOE\"] */\n// function getAnnotsByName(annotNames, ideo) {\n// return annotNames.map(name => getAnnotByName(name, ideo));\n// }\n\n// /** Briefly show a circle around specified annotations */\n// function pulseAnnots(annotNames, ideo, duration=2000) {\n// const annots = getAnnotsByName(annotNames, ideo);\n// const circle = getShapes(ideo.config.annotationHeight + 2).circle;\n// const ids = annots.map(annot => annot.domId);\n\n// d3.selectAll(ids).each(function() {\n// d3.select('#' + this)\n// .insert('path', ':first-child')\n// .attr('class', '_ideogramAnnotPulse')\n// .attr('d', circle)\n// .attr('fill-opacity', 0.5)\n// .attr('fill', 'yellow')\n// .attr('stroke', 'orange');\n// });\n\n// const annotPulses = d3.selectAll('._ideogramAnnotPulse');\n// annotPulses.transition()\n// .duration(duration) // fade out for `duration` milliseconds\n// .style('opacity', 0)\n// .style('pointer-events', 'none')\n// .on('end', function(d, i) {\n// if (i === annotPulses.size() - 1) {\n// annotPulses.remove();\n// }\n// });\n// }\n\n/**\n * Shows a tooltip for the given annotation.\n *\n * See notes in startHideAnnotTooltipTimeout about show/hide logic.\n *\n * @param annot {Object} Processed annotation object\n * @param context {Object} \"This\" of the caller -- an SVG path DOM object\n */\nfunction showAnnotTooltip(annot, context) {\n var matrix, content, yOffset, tooltip,\n cx = Number(context.getAttribute('cx')),\n cy = Number(context.getAttribute('cy')),\n ideo = this;\n\n if (ideo.config.showAnnotTooltip === false) return;\n\n clearTimeout(ideo.hideAnnotTooltipTimeout);\n\n if (ideo.onWillShowAnnotTooltipCallback) {\n annot = ideo.onWillShowAnnotTooltipCallback(annot);\n }\n\n tooltip = d3.select('._ideogramTooltip');\n tooltip.interrupt(); // Stop any in-progress disapperance\n\n matrix = context.getScreenCTM().translate(cx, cy);\n\n [content, yOffset] = getContentAndYOffset(annot);\n\n renderTooltip(tooltip, content, matrix, yOffset, ideo);\n}\n\nexport {\n onLoadAnnots, onDrawAnnots, startHideAnnotTooltipTimeout,\n onWillShowAnnotTooltip, showAnnotTooltip, onClickAnnot\n};\n","import {d3, getFont, getTextSize} from '../lib';\n\nconst allLabelStyle = `\n \n `;\n\n/** Return DOM ID of annotation object */\nfunction getAnnotDomLabelId(annot) {\n return 'ideogramLabel_' + annot.domId;\n}\n\nfunction changeAnnotState(state, labelId, annotId) {\n d3.selectAll('._ideoActive').classed('_ideoActive', false);\n d3.select('#' + labelId).attr('class', '_ideogramLabel ' + state);\n d3.select('#' + annotId + ' > path').attr('class', state);\n}\n\nfunction triggerAnnotEvent(event, ideo) {\n let labelId, annotId;\n const target = event.target;\n const type = event.type;\n\n const targetClasses = Array.from(target.classList);\n if (targetClasses.includes('_ideogramLabel')) {\n labelId = target.id;\n annotId = target.id.split('ideogramLabel_')[1];\n d3.select('#' + annotId + ' path').dispatch(type);\n } else {\n const annotElement = target.parentElement;\n labelId = 'ideogramLabel_' + annotElement.id;\n annotId = annotElement.id;\n }\n\n if (type === 'mouseout') {\n ideo.time.prevTooltipOff = performance.now();\n ideo.time.prevTooltipAnnotDomId = annotId;\n }\n\n // On mouseover, activate immediately\n // Otherwise, wait a moment (250 ms), then deactivate.\n // Delayed deactivation mitigates flicker when moving from\n // annot label to annot triangle.\n if (type === 'mouseover') {\n clearTimeout(window._ideoActiveTimeout);\n changeAnnotState('_ideoActive', labelId, annotId);\n } else {\n window._ideoActiveTimeout = window.setTimeout(function() {\n changeAnnotState('', labelId, annotId);\n }, 250);\n }\n}\n\nfunction renderLabel(annot, style, ideo) {\n\n if (!ideo.didSetLabelStyle) {\n document.querySelector('#_ideogramInnerWrap')\n .insertAdjacentHTML('afterbegin', allLabelStyle);\n ideo.didSetLabelStyle = true;\n }\n\n const id = getAnnotDomLabelId(annot);\n\n const font = getFont(ideo);\n\n const fill = annot.color === 'pink' ? '#CF406B' : annot.color;\n\n d3.select('#_ideogram').append('text')\n .attr('id', id)\n .attr('class', '_ideogramLabel')\n .attr('x', style.left)\n .attr('y', style.top)\n .style('font', font)\n .style('fill', fill)\n .style('pointer-events', null) // Prevent bug in clicking chromosome\n .html(annot.name);\n}\n\n/** Get annotation object by name, e.g. \"BRCA1\" */\nfunction getAnnotByName(annotName, ideo) {\n var annot;\n var found = false;\n ideo.annots.forEach((annotsByChr) => {\n if (found) return;\n annotsByChr.annots.forEach((thisAnnot) => {\n if (found) return;\n if (thisAnnot.name === annotName) {\n annot = thisAnnot;\n found = true;\n }\n });\n });\n\n return annot;\n}\n\n/** Get label's top and left offsets relative to chromosome, and width */\nfunction getAnnotLabelLayout(annot, ideo) {\n var annotDom, annotRect, ideoRect, width, height, top, bottom, left, right,\n config = ideo.config;\n\n annotDom = document.querySelector('#' + annot.domId);\n\n // Handles cases when annotation is not yet in DOM\n if (annotDom === null) return null;\n\n annotRect = annotDom.getBoundingClientRect();\n\n ideoRect =\n document.querySelector('#_ideogram').getBoundingClientRect();\n\n const textSize = getTextSize(annot.name, ideo);\n width = textSize.width;\n\n // `pad` is a heuristic that accounts for:\n // 1px left pad, 1px right pad, 1px right border, 1px left border\n // as set in renderLabel\n const pad = (config.fontFamily) ? 9 : 7;\n width += pad;\n\n const labelSize = config.annotLabelSize ? config.annotLabelSize : 13;\n // console.log('height, labelSize', height, labelSize);\n\n // Accounts for 1px top border, 1px bottom border as set in renderLabel\n height = labelSize;\n\n top = annotRect.top - ideoRect.top + height - 1;\n bottom = top + height;\n left = annotRect.left - ideoRect.left - width;\n right = left + width;\n\n return {top, bottom, right, left, width, height};\n}\n\n/**\n * Label an annotation.\n *\n * @param annotName {String} Name of annotation, e.g. \"BRCA1\"\n * @param backgroundColor {String} Background color. Default: white.\n * @param backgroundColor {String} Border color. Default: black.\n */\nfunction addAnnotLabel(annotName, backgroundColor, borderColor) {\n var annot,\n ideo = this;\n\n annot = getAnnotByName(annotName, ideo);\n\n const layout = getAnnotLabelLayout(annot, ideo);\n if (layout === null) return;\n\n const style = Object.assign(layout, {backgroundColor, borderColor});\n\n renderLabel(annot, style, ideo);\n}\n\nexport function sortAnnotsByRank(annots, ideo) {\n if ('geneCache' in ideo === false) return annots;\n\n const ranks = ideo.geneCache.interestingNames;\n\n annots = annots.map(annot => {\n annot.rank = ranks.indexOf(annot.name) || 1E10;\n return annot;\n });\n\n // Ranks annots by popularity\n const rankedAnnots = annots.sort((a, b) => {\n\n // Search gene is most important, regardless of popularity\n if (a.color === 'red') return -1;\n if (b.color === 'red') return 1;\n\n // Rank 3 is more important than rank 30\n return a.rank - b.rank;\n });\n\n return rankedAnnots;\n}\n\nexport function applyRankCutoff(annots, cutoff, ideo) {\n const rankedAnnots = sortAnnotsByRank(annots, ideo);\n\n // Take the top N ranked genes, where N is `cutoff`\n annots = rankedAnnots.slice(0, cutoff);\n\n // console.log(annots.map(annot => {return annot.name + ' ' + annot.rank }));\n\n return annots;\n}\n\n/** Label as many annotations as possible, without overlap */\nfunction fillAnnotLabels(sortedAnnots=[]) {\n const ideo = this;\n\n sortedAnnots = sortedAnnots.slice(); // copy by value\n\n // Remove any pre-existing annotation labels, to avoid duplicates\n ideo.clearAnnotLabels();\n\n let spacedAnnots = [];\n const spacedLayouts = [];\n\n if (sortedAnnots.length === 0) {\n sortedAnnots = ideo.flattenAnnots();\n }\n\n const m = 3; // padding\n\n sortedAnnots.forEach((annot, i) => {\n const layout = getAnnotLabelLayout(annot, ideo);\n\n if (layout === null) return;\n\n const hasOverlap =\n spacedLayouts.length > 1 && spacedLayouts.some((sl, j) => {\n\n const xOverlap = (\n sl.left - m <= layout.right &&\n sl.right >= layout.left - m\n );\n const yOverlap =\n (\n sl.top - m < layout.bottom && sl.bottom > layout.top - m ||\n layout.top - m < sl.bottom && layout.bottom > sl.bottom\n );\n\n // if (annot.name === 'TP73') {\n // const spacedAnnot = spacedAnnots[j].name;\n // console.log(\n // 'xOverlap, yOverlap, annot.name, layout, spacedAnnot, sl'\n // );\n // console.log(\n // xOverlap, yOverlap, annot.name, layout, spacedAnnot, sl\n // );\n // }\n\n return xOverlap && yOverlap;\n });\n\n if (hasOverlap) return;\n\n spacedAnnots.push(annot);\n spacedLayouts.push(layout);\n });\n\n let numLabels = 10;\n const config = ideo.config;\n if ('relatedGenesMode' in config && config.relatedGenesMode === 'hints') {\n numLabels = 20;\n }\n spacedAnnots = applyRankCutoff(spacedAnnots, numLabels, ideo);\n\n // Ensure highest-ranked annots are ordered last in SVG,\n // to ensure the are written before lower-ranked annots\n // (which, due to SVG z-index being tied to layering)\n spacedAnnots.reverse();\n\n spacedAnnots.forEach((annot) => {\n ideo.addAnnotLabel(annot.name);\n });\n\n d3.selectAll('._ideogramLabel, .annot')\n .on('mouseover', (event) => triggerAnnotEvent(event))\n .on('mouseout', (event) => triggerAnnotEvent(event, ideo))\n .on('click', (event) => triggerAnnotEvent(event));\n}\n\nfunction removeAnnotLabel(annotName) {\n const ideo = this;\n const annot = getAnnotByName(annotName, ideo);\n const id = getAnnotDomLabelId(annot);\n document.querySelector('#' + id).remove();\n}\n\nfunction clearAnnotLabels() {\n const labels = document.querySelectorAll('._ideogramLabel');\n labels.forEach((label) => {label.remove();});\n}\n\nexport {\n addAnnotLabel, clearAnnotLabels, fillAnnotLabels, getAnnotLabelLayout,\n removeAnnotLabel\n};\n","/**\n * Get containers to group individual annotations into higher-level \"bar\"\n * annotations.\n */\nfunction getRawBars(chrModels, ideo) {\n var chr, chrModel, lastBand, numBins, bar, h, i, px,\n barWidth = ideo.config.barWidth,\n bars = [];\n\n for (h = 0; h < ideo.chromosomesArray.length; h++) {\n chr = ideo.chromosomesArray[h].name;\n chrModel = chrModels[chr];\n lastBand = chrModel.bands[chrModel.bands.length - 1];\n numBins = Math.round(lastBand.px.stop / barWidth); // chrPxStop / barWidth\n bar = {chr: chr, annots: []};\n\n for (i = 0; i < numBins; i++) {\n px = i * barWidth - ideo.bump;\n bar.annots.push({\n bp: ideo.convertPxToBp(chrModel, px + ideo.bump),\n px: px,\n count: 0,\n chrIndex: chrModel.chrIndex,\n chrName: chr,\n color: ideo.config.annotationsColor,\n annots: []\n });\n }\n bars.push(bar);\n }\n return bars;\n}\n\n/**\n * Assign how many, and which annotations each histogram bar contains\n */\nfunction assignAnnotsToBars(annots, bars, chrModels, ideo) {\n var chrAnnots, chrModel, barAnnots, h, i, annot, px, j, barPx, nextBarPx,\n barWidth = ideo.config.barWidth;\n\n for (h = 0; h < annots.length; h++) {\n chrAnnots = annots[h].annots;\n chrModel = chrModels[annots[h].chr]; // get chr by name\n barAnnots = bars[chrModel.chrIndex].annots;\n for (i = 0; i < chrAnnots.length; i++) {\n annot = chrAnnots[i];\n px = annot.px - ideo.bump;\n for (j = 0; j < barAnnots.length; j++) {\n barPx = barAnnots[j].px;\n nextBarPx = barPx + barWidth;\n if (j === barAnnots.length - 1) nextBarPx += barWidth;\n if (px >= barPx && px < nextBarPx) {\n bars[chrModel.chrIndex].annots[j].count += 1;\n bars[chrModel.chrIndex].annots[j].annots.push(annot);\n break;\n }\n }\n }\n }\n return bars;\n}\n\nfunction setIdeoMaxAnnotsPerBar(bars, isFirstGet, ideo) {\n var maxAnnotsPerBarAllChrs, i, maxAnnotsPerBar, annots, chr, j, barCount;\n\n if (isFirstGet || ideo.config.histogramScaling === 'relative') {\n maxAnnotsPerBarAllChrs = 0;\n for (i = 0; i < bars.length; i++) {\n maxAnnotsPerBar = 0;\n annots = bars[i].annots;\n chr = bars[i].chr;\n for (j = 0; j < annots.length; j++) {\n barCount = annots[j].count;\n if (barCount > maxAnnotsPerBar) maxAnnotsPerBar = barCount;\n if (barCount > maxAnnotsPerBarAllChrs) {\n maxAnnotsPerBarAllChrs = barCount;\n }\n }\n ideo.maxAnnotsPerBar[chr] = maxAnnotsPerBar;\n }\n ideo.maxAnnotsPerBarAllChrs = maxAnnotsPerBarAllChrs;\n }\n}\n\n/**\n * Set each bar's height to be proportional to the height of the bar with the\n * most annotations\n */\nfunction setProportionalBarHeight(bars, ideo) {\n var i, annots, chr, j, barCount, barCountRatio, height,\n ideoIsRotated = ideo._layout._isRotated;\n\n for (i = 0; i < bars.length; i++) {\n annots = bars[i].annots;\n chr = bars[i].chr;\n for (j = 0; j < annots.length; j++) {\n barCount = annots[j].count;\n if (ideo.config.histogramScaling === 'relative') {\n barCountRatio = barCount / ideo.maxAnnotsPerBar[chr];\n } else {\n barCountRatio = barCount / ideo.maxAnnotsPerBarAllChrs;\n }\n if (ideoIsRotated === false) {\n height = barCountRatio * ideo.config.chrMargin;\n } else {\n height = barCountRatio * ideo.config.chrHeightOriginal * 3;\n }\n if (isNaN(height)) {\n height = 0;\n }\n bars[i].annots[j].height = height;\n }\n }\n return bars;\n}\n\nfunction reportGetHistogramBarPerformance(t0, ideo) {\n var t1 = new Date().getTime();\n if (ideo.config.debug) {\n console.log('Time spent in getHistogramBars: ' + (t1 - t0) + ' ms');\n }\n}\n\nfunction setIdeoHistogramScaling(ideo) {\n if ('histogramScaling' in ideo.config === false) {\n ideo.config.histogramScaling = 'absolute';\n }\n}\n\n/**\n * Returns and sets bars used for histogram\n */\nfunction getHistogramBars(annots) {\n var chrModels, bars,\n isFirstGet = false,\n t0 = new Date().getTime(),\n ideo = this;\n\n chrModels = ideo.chromosomes[ideo.config.taxid];\n\n setIdeoHistogramScaling(ideo);\n\n if (typeof ideo.maxAnnotsPerBar === 'undefined') {\n ideo.maxAnnotsPerBar = {};\n isFirstGet = true;\n }\n\n bars = getRawBars(chrModels, ideo);\n bars = assignAnnotsToBars(annots, bars, chrModels, ideo);\n\n setIdeoMaxAnnotsPerBar(bars, isFirstGet, ideo);\n bars = setProportionalBarHeight(bars, ideo);\n\n reportGetHistogramBarPerformance(t0, ideo);\n ideo.bars = bars;\n return bars;\n}\n\nfunction getHistogramPoints(d, chrWidth, chrWidths, ideo) {\n var x1, x2, y1, y2;\n\n x1 = d.px + ideo.bump;\n x2 = d.px + ideo.config.barWidth + ideo.bump;\n y1 = chrWidth;\n y2 = chrWidth + d.height;\n\n var thisChrWidth = chrWidths[d.chr];\n\n if (x2 > thisChrWidth) {\n x2 = thisChrWidth;\n }\n\n return (\n x1 + ',' + y1 + ' ' +\n x2 + ',' + y1 + ' ' +\n x2 + ',' + y2 + ' ' +\n x1 + ',' + y2\n );\n}\n\nfunction writeHistogramAnnots(chrAnnot, ideo) {\n var chrs, chr,\n chrWidths = {},\n chrWidth = ideo.config.chrWidth;\n\n chrs = ideo.chromosomes[ideo.config.taxid];\n for (chr in chrs) {\n chrWidths[chr] = chrs[chr];\n }\n\n chrAnnot.append('polygon')\n // .attr('id', function(d, i) { return d.id; })\n .attr('class', 'annot')\n .attr('points', function(d) {\n return getHistogramPoints(d, chrWidth, chrWidths, ideo);\n })\n .attr('fill', function(d) {return d.color;});\n}\n\nexport {getHistogramBars, writeHistogramAnnots};\n","/**\n * @fileoverview Functions for drawing a legend for genome annotations.\n * A legend consists of rows, each with a colored icon and a text label.\n * Icons may have different shapes. A legend may also have a name.\n */\n\nimport {d3, getTextSize, round} from '../lib';\n\nvar legendStyle =\n '#_ideogramLegend {font: 12px Arial; overflow: auto;} ' +\n '#_ideogramLegend svg {float: left;} ' +\n '#_ideogramLegend ul {' +\n 'position: relative; left: -14px; list-style: none; float: left; ' +\n 'padding-left: 10px; margin: 0 0 1em 0; width: auto; border: none;' +\n '} ' +\n '#_ideogramLegend li {float: none; margin: 0;}' +\n '#_ideogramLegend ul span {position: relative; left: -15px;} ';\n\nfunction getIcon(row, ideo) {\n var icon, triangleAttrs, circleAttrs, rectAttrs,\n fill = 'fill=\"' + row.color + '\" style=\"stroke: #AAA;\"',\n shape = row.shape;\n\n triangleAttrs = 'd=\"m7,3 l -5 9 l 9 0 z\"';\n circleAttrs = 'd=\"m2,9a 4.5,4.5 0 1,0 9,0a 4.5,4.5 0 1,0 -9,0\"';\n rectAttrs = 'height=\"10\" width=\"10\" y=\"3\"';\n\n if ('shape' in row && ['circle', 'triangle'].includes(shape)) {\n if (shape === 'circle') {\n icon = '';\n } else if (shape === 'triangle') {\n var transform = '';\n if (ideo.config.orientation === 'vertical') {\n // Orient arrows in legend as they are in annotations\n transform = ' transform=\"rotate(90, 7, 7)\"';\n }\n icon = '';\n }\n } else {\n icon = '';\n }\n\n return icon;\n}\n\nfunction getListItems(labels, svg, list, nameHeight, ideo) {\n var i, icon, y, row,\n lineHeight = getLineHeight(ideo);\n\n for (i = 0; i < list.rows.length; i++) {\n row = list.rows[i];\n labels += '
  • ' + row.name + '
  • ';\n y = lineHeight * (i - 1) + nameHeight + 1;\n if ('name' in list) y += lineHeight;\n icon = getIcon(row, ideo);\n const transform = 'translate(0, ' + y + ')';\n svg += '' + icon + '';\n }\n\n return [labels, svg];\n}\n\nfunction getLineHeight(ideo) {\n return round(getTextSize('A', ideo).height) * 2 + 0.5;\n}\n\n/**\n * Display a legend for genome annotations, using `legend` configuration option\n */\nfunction writeLegend(ideo) {\n var i, legend, svg, labels, list, content,\n config = ideo.config,\n lineHeight = getLineHeight(ideo);\n\n d3.select(config.container + ' #_ideogramLegend').remove();\n\n legend = config.legend;\n content = '';\n\n for (i = 0; i < legend.length; i++) {\n list = legend[i];\n let nameHeight = lineHeight;\n if (list.nameHeight) {\n nameHeight = list.nameHeight;\n }\n let nameStyle = '';\n if (nameHeight) {\n nameStyle =\n `style=\"height: ${nameHeight}px; ` +\n `position: relative; ` +\n `left: -${nameHeight - 5}px;\"`;\n }\n if ('name' in list) {\n labels = `
    ` + list.name + `
    `;\n }\n svg = '';\n [labels, svg] = getListItems(labels, svg, list, nameHeight, ideo);\n svg += '';\n content += svg + '
      ' + labels + '
    ';\n }\n\n var fontFamily = `font-family: ${config.fontFamily};`;\n var lineHeightCss = `line-height: ${getLineHeight(ideo)}px;`;\n legendStyle +=\n `#_ideogramLegend {${fontFamily} ${lineHeightCss}}`;\n\n var target = d3.select(config.container + ' #_ideogramOuterWrap');\n target.append('style').html(legendStyle);\n target.append('div').attr('id', '_ideogramLegend').html(content);\n}\n\nexport {writeLegend};\n","import {d3} from '../lib';\nimport {writeHistogramAnnots} from './histogram';\nimport {writeLegend} from './legend';\n\nfunction parseFriendlyAnnots(friendlyAnnots, rawAnnots) {\n var i, j, annot, rawAnnot;\n\n for (i = 0; i < friendlyAnnots.length; i++) {\n annot = friendlyAnnots[i];\n\n for (j = 0; j < rawAnnots.length; j++) {\n if (annot.chr === rawAnnots[j].chr) {\n rawAnnot = [\n annot.name,\n annot.start,\n annot.stop - annot.start\n ];\n if ('color' in annot) rawAnnot.push(annot.color);\n if ('shape' in annot) rawAnnot.push(annot.shape);\n rawAnnots[j].annots.push(rawAnnot);\n break;\n }\n }\n }\n\n return rawAnnots;\n}\n\nfunction parseFriendlyKeys(friendlyAnnots) {\n var keys = ['name', 'start', 'length'];\n if ('color' in friendlyAnnots[0]) {\n keys.push('color');\n }\n if ('shape' in friendlyAnnots[0]) {\n keys.push('shape');\n }\n return keys;\n}\n\n/**\n * Draws annotations defined by user\n */\nfunction drawAnnots(friendlyAnnots) {\n var keys, chr,\n rawAnnots = [],\n ideo = this,\n chrs = ideo.chromosomes[ideo.config.taxid]; // TODO: multiorganism\n\n if (\n 'annots' in friendlyAnnots[0] || // When filtering\n 'values' in friendlyAnnots[0] // When drawing cached expression matrices\n ) {\n return ideo.drawProcessedAnnots(friendlyAnnots);\n }\n\n for (chr in chrs) {\n rawAnnots.push({chr: chr, annots: []});\n }\n rawAnnots = parseFriendlyAnnots(friendlyAnnots, rawAnnots);\n\n keys = parseFriendlyKeys(friendlyAnnots);\n\n ideo.rawAnnots = {keys: keys, annots: rawAnnots};\n ideo.annots = ideo.processAnnotData(ideo.rawAnnots);\n\n ideo.drawProcessedAnnots(ideo.annots);\n}\n\nfunction getShapes(annotHeight) {\n var triangle, circle, rectangle, r;\n\n triangle =\n 'm0,0 l -' + annotHeight + ' ' + (2 * annotHeight) +\n ' l ' + (2 * annotHeight) + ' 0 z';\n\n // From http://stackoverflow.com/a/10477334, with a minor change (\"m -r, r\")\n // Circles are supported natively via , but having it as a path\n // simplifies handling triangles, circles and other shapes in the same\n // D3 call\n r = annotHeight;\n circle =\n 'm -' + r + ', ' + r +\n 'a ' + r + ',' + r + ' 0 1,0 ' + (r * 2) + ',0' +\n 'a ' + r + ',' + r + ' 0 1,0 -' + (r * 2) + ',0';\n\n rectangle =\n 'm0,0 l 0 ' + (2 * annotHeight) +\n 'l ' + annotHeight + ' 0' +\n 'l 0 -' + (2 * annotHeight) + 'z';\n\n return {triangle: triangle, circle: circle, rectangle: rectangle};\n}\n\nfunction getChrAnnotNodes(filledAnnots, ideo) {\n return d3.selectAll(ideo.selector + ' .chromosome')\n .data(filledAnnots)\n .selectAll('path.annot')\n .data(function(d) {\n return d.annots;\n })\n .enter();\n}\n\nfunction determineShape(d, shapes) {\n if (!d.shape || d.shape === 'triangle') {\n return shapes.triangle;\n } else if (d.shape === 'circle') {\n return shapes.circle;\n } else if (d.shape === 'rectangle') {\n return shapes.rectangle;\n } else {\n return d.shape;\n }\n}\n\nfunction writeTrackAnnots(chrAnnot, ideo) {\n var shapes,\n annotHeight = ideo.config.annotationHeight;\n\n shapes = getShapes(annotHeight);\n\n chrAnnot.append('g')\n .attr('id', function(d) {return d.domId;})\n .attr('class', 'annot')\n .attr('transform', function(d) {\n var y = ideo.config.chrWidth + (d.trackIndex * annotHeight * 2);\n return 'translate(' + d.px + ',' + y + ')';\n })\n .append('path')\n .attr('d', function(d) {return determineShape(d, shapes);})\n .attr('fill', function(d) {return d.color;})\n .on('mouseover', function(event, d) {ideo.showAnnotTooltip(d, this);})\n .on('mouseout', function() {ideo.startHideAnnotTooltipTimeout();})\n .on('click', function(event, d) {ideo.onClickAnnot(d);});\n}\n\n/**\n * Overlaid annotations appear directly on chromosomes\n */\nfunction writeOverlayAnnots(chrAnnot, ideo) {\n chrAnnot.append('polygon')\n .attr('id', function(d) {return d.id;})\n .attr('class', 'annot')\n .attr('points', function(d) {\n var x1, x2,\n chrWidth = ideo.config.chrWidth;\n\n if (d.stopPx - d.startPx > 1) {\n x1 = d.startPx;\n x2 = d.stopPx;\n } else {\n x1 = d.px - 0.5;\n x2 = d.px + 0.5;\n }\n\n return (\n x1 + ',' + chrWidth + ' ' + x2 + ',' + chrWidth + ' ' +\n x2 + ',0 ' + x1 + ',0'\n );\n })\n .attr('fill', function(d) {return d.color;})\n .on('mouseover', function(event, d) {ideo.showAnnotTooltip(d, this);})\n .on('mouseout', function() {ideo.startHideAnnotTooltipTimeout();});\n}\n\nfunction warnIfTooManyAnnots(layout, annots) {\n var i, numAnnots;\n\n if (!/heatmap/.test(layout) && layout !== 'histogram') {\n numAnnots = 0;\n for (i = 0; i < annots.length; i++) {\n numAnnots += annots[i].annots.length;\n }\n if (numAnnots > 2000) {\n console.warn(\n 'Rendering more than 2000 annotations in Ideogram?\\n' +\n 'Try setting \"annotationsLayout\" to \"heatmap\" or \"histogram\" in your ' +\n 'Ideogram configuration object for better layout and performance.'\n );\n }\n }\n}\n\nfunction drawAnnotsByLayoutType(layout, annots, ideo) {\n var filledAnnots, chrAnnot;\n\n warnIfTooManyAnnots(layout, annots);\n\n if (layout === 'histogram') annots = ideo.getHistogramBars(annots);\n\n filledAnnots = ideo.fillAnnots(annots);\n\n chrAnnot = getChrAnnotNodes(filledAnnots, ideo);\n\n if (layout === 'tracks') {\n writeTrackAnnots(chrAnnot, ideo);\n } else if (layout === 'overlay') {\n writeOverlayAnnots(chrAnnot, ideo);\n } else if (layout === 'histogram') {\n writeHistogramAnnots(chrAnnot, ideo);\n }\n}\n\n/**\n * Draws genome annotations on chromosomes.\n * Annotations can be rendered as either overlaid directly\n * on a chromosome, or along one or more \"tracks\"\n * running parallel to each chromosome.\n */\nfunction drawProcessedAnnots(annots) {\n var layout,\n ideo = this;\n\n d3.selectAll(ideo.selector + ' .annot').remove();\n\n layout = 'tracks';\n if (ideo.config.annotationsLayout) layout = ideo.config.annotationsLayout;\n\n if ('legend' in ideo.config) writeLegend(ideo);\n\n if (/heatmap/.test(layout)) {\n ideo.drawHeatmaps(annots);\n return;\n }\n\n drawAnnotsByLayoutType(layout, annots, ideo);\n if (ideo.onDrawAnnotsCallback) ideo.onDrawAnnotsCallback();\n}\n\nexport {drawAnnots, drawProcessedAnnots, getShapes};\n","import {d3} from '../lib';\n\nexport function writeSyntenicRegion(syntenies, regionID, ideo) {\n return syntenies.append('g')\n .attr('class', 'syntenicRegion')\n .attr('id', regionID)\n .on('click', function() {\n var activeRegion = this;\n var others = d3.selectAll(ideo.selector + ' .syntenicRegion')\n .filter(function() {return (this !== activeRegion);});\n\n others.classed('hidden', !others.classed('hidden'));\n })\n .on('mouseover', function() {\n var activeRegion = this;\n d3.selectAll(ideo.selector + ' .syntenicRegion')\n .filter(function() {return (this !== activeRegion);})\n .classed('ghost', true);\n })\n .on('mouseout', function() {\n d3.selectAll(ideo.selector + ' .syntenicRegion')\n .classed('ghost', false);\n });\n}\n\nexport function writeSyntenicRegionPolygons(\n syntenicRegion, x1, x2, r1, r2, regions\n) {\n var color, opacity;\n\n color = ('color' in regions) ? regions.color : '#CFC';\n opacity = ('opacity' in regions) ? regions.opacity : 1;\n\n syntenicRegion.append('polygon')\n .attr('points',\n x1 + ', ' + r1.startPx + ' ' +\n x1 + ', ' + r1.stopPx + ' ' +\n x2 + ', ' + r2.stopPx + ' ' +\n x2 + ', ' + r2.startPx\n )\n .style('fill', color)\n .style('fill-opacity', opacity);\n}\n\nexport function writeSyntenicRegionPolygonsHorizontal(\n syntenicRegion, y1, y2, r1, r2, regions\n) {\n var color, opacity;\n\n color = ('color' in regions) ? regions.color : '#CFC';\n opacity = ('opacity' in regions) ? regions.opacity : 1;\n\n syntenicRegion.append('polygon')\n .attr('points',\n (r1.startPx - 15) + ', ' + y1 + ' ' +\n (r1.stopPx - 15) + ', ' + y1 + ' ' +\n (r2.stopPx - 15) + ', ' + y2 + ' ' +\n (r2.startPx - 15) + ', ' + y2\n )\n .style('fill', color)\n .style('fill-opacity', opacity);\n}\n\nexport function getRegionsR1AndR2(regions, ideo, xOffset = null) {\n var r1, r2,\n r1Offset, r2Offset;\n\n r1 = regions.r1;\n r2 = regions.r2;\n\n if (typeof r1.chr === 'string') {\n const taxids = ideo.config.taxids;\n if (ideo.config.multiorganism) {\n r1.chr = ideo.chromosomes[taxids[0]][r1.chr];\n r2.chr = ideo.chromosomes[taxids[1]][r2.chr];\n } else {\n r1.chr = ideo.chromosomes[taxids[0]][r1.chr];\n r2.chr = ideo.chromosomes[taxids[0]][r2.chr];\n }\n }\n\n var r1ChrDom = document.querySelector('#' + r1.chr.id + '-chromosome-set');\n var r1GenomeHorizontalXOffset = r1ChrDom.getCTM().e;\n var r1GenomeVerticalXOffset = r1ChrDom.getCTM().f;\n var r2ChrDom = document.querySelector('#' + r2.chr.id + '-chromosome-set');\n // var r2GenomeOffset = r2ChrDom.getBoundingClientRect().top;\n var r2GenomeHorizontalXOffset = r2ChrDom.getCTM().e;\n var r2GenomeVerticalXOffset = r2ChrDom.getCTM().f;\n\n if (xOffset === null) {\n if (ideo.config.orientation === 'vertical') {\n // When vertical collinear\n // http://localhost:8080/examples/vanilla/compare-whole-genomes?chromosome-scale=absolute&orientation=vertical\n r1Offset = r1GenomeVerticalXOffset - 12;\n r2Offset = r2GenomeVerticalXOffset - 12;\n } else {\n // When horizontal collinear, e.g.\n // http://localhost:8080/examples/vanilla/compare-whole-genomes?chromosome-scale=absolute&orientation=horizontal\n r1Offset = r1GenomeHorizontalXOffset;\n r2Offset = r2GenomeHorizontalXOffset;\n }\n } else {\n // When horizontal parallel\n r1Offset = xOffset;\n r2Offset = xOffset;\n }\n\n r1.startPx = ideo.convertBpToPx(r1.chr, r1.start) + r1Offset;\n r1.stopPx = ideo.convertBpToPx(r1.chr, r1.stop) + r1Offset;\n r2.startPx = ideo.convertBpToPx(r2.chr, r2.start) + r2Offset;\n r2.stopPx = ideo.convertBpToPx(r2.chr, r2.stop) + r2Offset;\n\n return [r1, r2];\n}\n","import {d3} from '../lib';\nimport {\n getRegionsR1AndR2, writeSyntenicRegionPolygons, writeSyntenicRegion\n} from './synteny-lib';\n\nfunction writeSyntenicRegionLines(syntenicRegion, x1, x2, r1, r2) {\n syntenicRegion.append('line')\n .attr('class', 'syntenyBorder')\n .attr('x1', x1)\n .attr('x2', x2)\n .attr('y1', r1.startPx)\n .attr('y2', r2.startPx);\n\n syntenicRegion.append('line')\n .attr('class', 'syntenyBorder')\n .attr('x1', x1)\n .attr('x2', x2)\n .attr('y1', r1.stopPx)\n .attr('y2', r2.stopPx);\n}\n\nfunction writeSyntenicRegions(syntenicRegions, syntenies, ideo) {\n var i, regions, r1, r2, regionID, syntenicRegion, chrWidth, x1, x2;\n\n for (i = 0; i < syntenicRegions.length; i++) {\n regions = syntenicRegions[i];\n\n [r1, r2] = getRegionsR1AndR2(regions, ideo);\n\n regionID = (\n r1.chr.id + '_' + r1.start + '_' + r1.stop + '_' +\n '__' +\n r2.chr.id + '_' + r2.start + '_' + r2.stop\n );\n\n syntenicRegion = writeSyntenicRegion(syntenies, regionID, ideo);\n\n chrWidth = ideo.config.chrWidth;\n x1 = chrWidth + 51;\n x2 = chrWidth + 245; // Genomes are spaced ~200 pixels apart\n\n writeSyntenicRegionPolygons(syntenicRegion, x1, x2, r1, r2, regions);\n writeSyntenicRegionLines(syntenicRegion, x1, x2, r1, r2);\n }\n}\n\nfunction reportPerformance(t0, ideo) {\n var t1 = new Date().getTime();\n if (ideo.config.debug) {\n console.log('Time in drawSyntenicRegions: ' + (t1 - t0) + ' ms');\n }\n}\n\n/**\n * Draws a trapezoid connecting a genomic range on\n * one chromosome to a genomic range on another chromosome;\n * a syntenic region.\n */\nfunction drawSyntenyCollinear(syntenicRegions, ideo) {\n var syntenies,\n t0 = new Date().getTime();\n\n syntenies = d3.select(ideo.selector)\n .insert('g', ':first-child')\n .attr('class', 'synteny');\n\n writeSyntenicRegions(syntenicRegions, syntenies, ideo);\n\n reportPerformance(t0, ideo);\n}\n\nexport {drawSyntenyCollinear};\n","import {d3} from '../lib';\nimport {\n getRegionsR1AndR2, writeSyntenicRegionPolygonsHorizontal, writeSyntenicRegion\n} from './synteny-lib';\n\nfunction writeSyntenicRegionLines(syntenicRegion, y1, y2, r1, r2) {\n syntenicRegion.append('line')\n .attr('class', 'syntenyBorder')\n .attr('x1', r1.startPx - 15)\n .attr('x2', r2.startPx - 15)\n .attr('y1', y1)\n .attr('y2', y2);\n\n syntenicRegion.append('line')\n .attr('class', 'syntenyBorder')\n .attr('x1', r1.stopPx - 15)\n .attr('x2', r2.stopPx - 15)\n .attr('y1', y1)\n .attr('y2', y2);\n}\n\nfunction writeSyntenicRegions(syntenicRegions, syntenies, ideo) {\n var i, regions, r1, r2, regionID, syntenicRegion, chrWidth, y1, y2;\n\n for (i = 0; i < syntenicRegions.length; i++) {\n regions = syntenicRegions[i];\n\n [r1, r2] = getRegionsR1AndR2(regions, ideo);\n\n regionID = (\n r1.chr.id + '_' + r1.start + '_' + r1.stop + '_' +\n '__' +\n r2.chr.id + '_' + r2.start + '_' + r2.stop\n );\n\n syntenicRegion = writeSyntenicRegion(syntenies, regionID, ideo);\n\n chrWidth = ideo.config.chrWidth;\n y1 = chrWidth + 31;\n y2 = chrWidth + 191; // Genomes are spaced ~200 pixels apart\n\n writeSyntenicRegionPolygonsHorizontal(\n syntenicRegion, y1, y2, r1, r2, regions\n );\n writeSyntenicRegionLines(syntenicRegion, y1, y2, r1, r2);\n }\n}\n\nfunction reportPerformance(t0, ideo) {\n var t1 = new Date().getTime();\n if (ideo.config.debug) {\n console.log('Time in drawSyntenicRegions: ' + (t1 - t0) + ' ms');\n }\n}\n\n/**\n * Draws a trapezoid connecting a genomic range on\n * one chromosome to a genomic range on another chromosome;\n * a syntenic region.\n */\nfunction drawSyntenyCollinearHorizontal(syntenicRegions, ideo) {\n var syntenies,\n t0 = new Date().getTime();\n\n syntenies = d3.select(ideo.selector)\n .insert('g', ':first-child')\n .attr('class', 'synteny');\n\n writeSyntenicRegions(syntenicRegions, syntenies, ideo);\n\n reportPerformance(t0, ideo);\n}\n\nexport {drawSyntenyCollinearHorizontal};\n","import {d3} from '../lib';\nimport {drawSyntenyCollinear} from './synteny-collinear';\nimport {drawSyntenyCollinearHorizontal} from './synteny-collinear-horizontal';\nimport {\n getRegionsR1AndR2, writeSyntenicRegionPolygons, writeSyntenicRegion\n} from './synteny-lib';\n\nfunction writeSyntenicRegionLines(syntenicRegion, x1, x2, r1, r2, regions) {\n\n var stroke, width;\n if (\n Math.abs(r1.startPx - r1.startPx) < 2 &&\n Math.abs(r1.stopPx - r1.stopPx) < 2\n ) {\n stroke = regions.color;\n width = regions.width;\n } else {\n stroke = '';\n width = '';\n }\n\n syntenicRegion.append('line')\n .attr('class', 'syntenyBorder')\n .attr('x1', x1)\n .attr('x2', x2)\n .attr('y1', r1.startPx)\n .attr('y2', r2.startPx)\n .style('stroke', stroke)\n .style('stroke-width', width);\n\n syntenicRegion.append('line')\n .attr('class', 'syntenyBorder')\n .attr('x1', x1)\n .attr('x2', x2)\n .attr('y1', r1.stopPx)\n .attr('y2', r2.stopPx)\n .style('stroke', stroke)\n .style('stroke-width', stroke);\n}\n\nfunction writeSyntenicRegionLabels(syntenicRegion, x1, x2, r1, r2, regionId) {\n var rangeIds = regionId.split('__').map(d => 'label_' + d);\n if ('name' in r1) {\n syntenicRegion.append('text')\n .attr('id', rangeIds[0])\n .attr('y', r1.startPx + 3)\n .text(r1.name);\n var r1Width =\n document.querySelector('#' + rangeIds[0]).getBoundingClientRect().width;\n d3.select('#' + rangeIds[0]).attr('x', x1 - 15 - r1Width);\n }\n if ('name' in r2) {\n syntenicRegion.append('text')\n .attr('id', rangeIds[1])\n .text(r2.name)\n .attr('x', x2 + 15)\n .attr('y', r2.startPx + 3)\n .text(r2.name);\n }\n}\n\nfunction writeSyntenicRegions(syntenicRegions, syntenies, xOffset, ideo) {\n var i, regions, r1, r2, regionID, syntenicRegion, chrWidth, x1, x2;\n\n for (i = 0; i < syntenicRegions.length; i++) {\n regions = syntenicRegions[i];\n\n [r1, r2] = getRegionsR1AndR2(regions, ideo, xOffset);\n\n regionID = (\n r1.chr.id + '_' + r1.start + '_' + r1.stop + '_' +\n '__' +\n r2.chr.id + '_' + r2.start + '_' + r2.stop\n );\n\n syntenicRegion = writeSyntenicRegion(syntenies, regionID, ideo);\n\n chrWidth = ideo.config.chrWidth;\n x1 = ideo._layout.getChromosomeSetYTranslate(0);\n x2 = ideo._layout.getChromosomeSetYTranslate(1) - chrWidth;\n\n writeSyntenicRegionPolygons(syntenicRegion, x1, x2, r1, r2, regions);\n writeSyntenicRegionLines(syntenicRegion, x1, x2, r1, r2, regions);\n writeSyntenicRegionLabels(syntenicRegion, x1, x2, r1, r2, regionID);\n }\n}\n\nfunction reportPerformance(t0, ideo) {\n var t1 = new Date().getTime();\n if (ideo.config.debug) {\n console.log('Time in drawSyntenicRegions: ' + (t1 - t0) + ' ms');\n }\n}\n\n/**\n * Draws a trapezoid connecting a genomic range on\n * one chromosome to a genomic range on another chromosome;\n * a syntenic region.\n */\nfunction drawSynteny(syntenicRegions) {\n var syntenies, xOffset,\n t0 = new Date().getTime(),\n ideo = this,\n config = ideo.config;\n\n // Make synteny / orthologs readable from client apps\n ideo.syntenicRegions = syntenicRegions;\n\n if (\n config.multiorganism &&\n config.geometry === 'collinear'\n ) {\n if (config.orientation === 'vertical') {\n return drawSyntenyCollinear(syntenicRegions, ideo);\n } else {\n return drawSyntenyCollinearHorizontal(syntenicRegions, ideo);\n }\n }\n\n syntenies = d3.select(ideo.selector)\n .insert('g', ':first-child')\n .attr('class', 'synteny');\n\n xOffset = ideo._layout.margin.left;\n\n writeSyntenicRegions(syntenicRegions, syntenies, xOffset, ideo);\n\n reportPerformance(t0, ideo);\n}\n\nexport {drawSynteny};\n","import {d3} from '../lib';\nimport collinearizeChromosomes from '../collinear';\n\n/**\n * Reset displayed tracks to those originally displayed\n */\nfunction restoreDefaultTracks() {\n var ideo = this;\n ideo.config.numAnnotTracks = ideo.config.annotationsNumTracks;\n d3.selectAll(ideo.selector + ' .annot').remove();\n ideo.drawAnnots(ideo.processAnnotData(ideo.rawAnnots));\n}\n\nfunction getDisplayedRawAnnotsByChr(annotsByChr, trackIndexes) {\n var annot, displayedRawAnnotsByChr, annots, i, displayedAnnots, j,\n trackIndex;\n\n displayedRawAnnotsByChr = [];\n\n // Filter displayed tracks by selected track indexes\n for (i = 0; i < annotsByChr.length; i++) {\n annots = annotsByChr[i];\n displayedAnnots = [];\n for (j = 0; j < annots.annots.length; j++) {\n annot = annots.annots[j].slice(); // copy array by value\n trackIndex = annot[3] + 1;\n if (trackIndexes.includes(trackIndex)) {\n annot[3] = trackIndexes.indexOf(trackIndex);\n displayedAnnots.push(annot);\n }\n }\n displayedRawAnnotsByChr.push({chr: annots.chr, annots: displayedAnnots});\n }\n\n return displayedRawAnnotsByChr;\n}\n\n/**\n * Adds or removes tracks from the displayed list of tracks.\n * Only works when raw annotations are dense.\n *\n * @param trackIndexes Array of indexes of tracks to display\n */\nfunction updateDisplayedTracks(trackIndexes) {\n var displayedRawAnnotsByChr, displayedAnnots, rawAnnots,\n ideo = this,\n annotsByChr = ideo.rawAnnots.annots;\n\n ideo.config.numAnnotTracks = trackIndexes.length;\n\n displayedRawAnnotsByChr =\n getDisplayedRawAnnotsByChr(annotsByChr, trackIndexes);\n rawAnnots = {keys: ideo.rawAnnots.keys, annots: displayedRawAnnotsByChr};\n\n if (ideo.config.geometry === 'collinear') {\n collinearizeChromosomes(ideo);\n }\n\n displayedAnnots = ideo.processAnnotData(rawAnnots);\n\n d3.selectAll(ideo.selector + ' .annot').remove();\n ideo.displayedTrackIndexes = trackIndexes;\n ideo.drawAnnots(displayedAnnots);\n\n return displayedAnnots;\n}\n\nfunction getSetAnnotsByChr(annotsByChr, ideo) {\n var i, j, annots, annot, setAnnots, trackIndexOriginal, numAvailTracks,\n setAnnotsByChr = [];\n\n numAvailTracks = 1;\n\n for (i = 0; i < annotsByChr.length; i++) {\n annots = annotsByChr[i];\n setAnnots = [];\n for (j = 0; j < annots.annots.length; j++) {\n annot = annots.annots[j].slice();\n trackIndexOriginal = annot[3];\n if (trackIndexOriginal + 1 > numAvailTracks) {\n numAvailTracks = trackIndexOriginal + 1;\n }\n annot.splice(4, 0, trackIndexOriginal);\n setAnnots.push(annot);\n }\n setAnnotsByChr.push({chr: annots.chr, annots: setAnnots});\n }\n\n ideo.numAvailTracks = numAvailTracks;\n\n return setAnnotsByChr;\n}\n\nfunction setOriginalTrackIndexes(rawAnnots) {\n var keys, annotsByChr, setAnnotsByChr,\n ideo = this;\n\n keys = rawAnnots.keys;\n\n // If this method is unnecessary, pass through\n if (\n keys.length < 4 ||\n keys[3] !== 'trackIndex' ||\n keys[4] === 'trackIndexOriginal'\n ) {\n return rawAnnots;\n }\n\n annotsByChr = rawAnnots.annots;\n setAnnotsByChr = getSetAnnotsByChr(annotsByChr, ideo);\n\n keys.splice(4, 0, 'trackIndexOriginal');\n rawAnnots = {keys: keys, annots: setAnnotsByChr};\n if (ideo.rawAnnots.metadata) rawAnnots.metadata = ideo.rawAnnots.metadata;\n\n return rawAnnots;\n}\n\nexport {restoreDefaultTracks, setOriginalTrackIndexes, updateDisplayedTracks};\n","import {add2dAnnotsForChr} from './heatmap-2d';\n\n// Default colors for tracks of annotations\nvar colorMap = [\n ['F00'], // If there is 1 track, then color it red.\n ['F00', '88F'], // If 2 tracks, color one red and one light blue.\n ['F00', 'CCC', '88F'], // If 3, color one red, one grey, one light blue.\n ['F00', 'FA0', '0AF', '88F'], // And so on.\n ['F00', 'FA0', 'CCC', '0AF', '88F'],\n ['F00', 'FA0', '875', '578', '0AF', '88F'],\n ['F00', 'FA0', '875', 'CCC', '578', '0AF', '88F'],\n ['F00', 'FA0', '7A0', '875', '0A7', '578', '0AF', '88F'],\n ['F00', 'FA0', '7A0', '875', 'CCC', '0A7', '578', '0AF', '88F'],\n ['F00', 'FA0', '7A0', '875', '552', '255', '0A7', '578', '0AF', '88F']\n];\n\n/**\n * Ensure annotation containers are ordered by chromosome.\n */\nfunction orderAnnotContainers(annots, ideo) {\n var unorderedAnnots, i, j, annot, chr, chrs;\n\n unorderedAnnots = annots;\n annots = [];\n chrs = ideo.chromosomesArray;\n for (i = 0; i < chrs.length; i++) {\n chr = chrs[i].name;\n for (j = 0; j < unorderedAnnots.length; j++) {\n annot = unorderedAnnots[j];\n if (annot.chr === chr) {\n annots.push(annot);\n }\n }\n }\n\n return annots;\n}\n\n/**\n * Add client annotations, as in annotations-tracks.html\n */\nfunction addClientAnnot(annots, annot, ra, m, ideo) {\n var annotTrack;\n\n annot.trackIndex = ra[3];\n annotTrack = ideo.config.annotationTracks[annot.trackIndex];\n if (annotTrack.color) {\n annot.color = annotTrack.color;\n }\n if (annotTrack.shape) {\n annot.shape = annotTrack.shape;\n }\n\n annots[m].annots.push(annot);\n\n return annots;\n}\n\n/**\n * Add sparse server annotations, as in annotations-track-filters.html\n */\nfunction addSparseServerAnnot(annot, ra, omittedAnnots, annots, m, ideo) {\n var colors = colorMap[ideo.numAvailTracks - 1];\n\n annot.trackIndex = ra[3];\n annot.trackIndexOriginal = ra[4];\n annot.color = '#' + colors[annot.trackIndexOriginal];\n\n // Catch annots that will be omitted from display\n if (annot.trackIndex > ideo.config.numTracks - 1) {\n if (annot.trackIndex in omittedAnnots) {\n omittedAnnots[annot.trackIndex].push(annot);\n } else {\n omittedAnnots[annot.trackIndex] = [annot];\n }\n return [annots, omittedAnnots];\n }\n annots[m].annots.push(annot);\n\n return [annots, omittedAnnots];\n}\n\n/**\n * Basic client annotations, as in annotations-basic.html\n * and annotations-external.html\n */\nfunction addBasicClientAnnot(annots, annot, m, ideo) {\n annot.trackIndex = 0;\n if (!annot.color) {\n annot.color = ideo.config.annotationsColor;\n }\n if (!annot.shape) {\n annot.shape = 'triangle';\n }\n annots[m].annots.push(annot);\n\n return annots;\n}\n\nfunction addAnnot(annot, keys, ra, omittedAnnots, annots, m, ideo) {\n\n if (ideo.config.annotationTracks) {\n annots = addClientAnnot(annots, annot, ra, m, ideo);\n } else if (keys[3] === 'trackIndex' && ideo.numAvailTracks !== 1) {\n [annots, omittedAnnots] =\n addSparseServerAnnot(annot, ra, omittedAnnots, annots, m, ideo);\n // } else if (\n // keys.length > 3 &&\n // keys[3] in {trackIndex: 1, color: 1, shape: 1} === false &&\n // keys[4] === 'trackIndexOriginal'\n // ) {\n // annots = addDenseServerAnnot(keys, annots, annot, m);\n } else {\n annots = addBasicClientAnnot(annots, annot, m, ideo);\n }\n\n return [annots, omittedAnnots];\n}\n\nfunction getAnnotDomId(chrIndex, annotIndex) {\n return '_c' + chrIndex + '_a' + annotIndex;\n}\n\nfunction addAnnotsForChr(annots, omittedAnnots, annotsByChr, chrModel,\n m, keys, ideo) {\n var j, k, annot, ra;\n\n // Assign DOM ID if annots are rendered as individual DOM elements\n const shouldAssignDomId = (\n !ideo.config.annotationsLayout ||\n ideo.config.annotationsLayout === 'tracks'\n );\n\n if (shouldAssignDomId) {\n if (ideo.annotSortFunction) {\n annotsByChr.annots.sort((a, b) => {\n // Reverse-sort, so first annots are drawn last, and thus at top layer\n return -ideo.annotSortFunction(a, b);\n });\n } else {\n // Sort by genomic position, in ascending order\n annotsByChr.annots.sort((a, b) => a[1] - b[1]);\n }\n }\n\n for (j = 0; j < annotsByChr.annots.length; j++) {\n ra = annotsByChr.annots[j];\n annot = {};\n\n for (k = 0; k < keys.length; k++) {\n annot[keys[k]] = ra[k];\n }\n\n annot.stop = annot.start + annot.length;\n\n annot.chr = annotsByChr.chr;\n annot.chrIndex = m;\n annot.startPx = ideo.convertBpToPx(chrModel, annot.start);\n annot.stopPx = ideo.convertBpToPx(chrModel, annot.stop);\n annot.px = Math.round((annot.startPx + annot.stopPx) / 2);\n if (shouldAssignDomId) annot.domId = getAnnotDomId(m, j);\n\n [annots, omittedAnnots] =\n addAnnot(annot, keys, ra, omittedAnnots, annots, m, ideo);\n }\n\n return [annots, omittedAnnots];\n}\n\nfunction warnOfUndefinedChromosome(annotsByChr) {\n console.warn(\n 'Chromosome \"' + annotsByChr.chr + '\" undefined in ideogram; ' +\n annotsByChr.annots.length + ' annotations not shown'\n );\n}\n\nfunction addAnnots(rawAnnots, keys, ideo) {\n var m, i, annotsByChr, chrModel,\n annots = [],\n omittedAnnots = {};\n\n m = -1;\n for (i = 0; i < rawAnnots.length; i++) {\n annotsByChr = rawAnnots[i];\n chrModel = ideo.chromosomes[ideo.config.taxid][annotsByChr.chr];\n\n if (typeof chrModel === 'undefined') {\n warnOfUndefinedChromosome(annotsByChr);\n continue;\n }\n\n m++;\n annots.push({chr: annotsByChr.chr, annots: []});\n\n if (ideo.config.annotationsLayout !== 'heatmap-2d') {\n [annots, omittedAnnots] =\n addAnnotsForChr(annots, omittedAnnots, annotsByChr, chrModel, m,\n keys, ideo);\n } else {\n [annots, omittedAnnots] =\n add2dAnnotsForChr(annots, omittedAnnots, annotsByChr, chrModel, m,\n keys, ideo);\n }\n }\n return [annots, omittedAnnots];\n}\n\nfunction sendTrackAndAnnotWarnings(omittedAnnots, ideo) {\n var numOmittedTracks,\n layout = ideo.config.annotationsLayout,\n numTracks = ideo.config.numAnnotTracks;\n\n if (!/heatmap/.test(layout) && numTracks > 10) {\n console.error(\n 'Ideogram only displays up to 10 tracks at a time. ' +\n 'You specified ' + numTracks + ' tracks. ' +\n 'Perhaps consider a different way to visualize your data.'\n );\n }\n\n numOmittedTracks = Object.keys(omittedAnnots).length;\n if (numOmittedTracks) {\n console.warn(\n 'Ideogram configuration specified ' + numTracks + ' tracks, ' +\n 'but loaded annotations contain ' + numOmittedTracks + ' ' +\n 'extra tracks.'\n );\n }\n}\n\n/**\n * Proccesses genome annotation data.\n *\n * This method converts raw annotation data from server, which is structured as\n * an array of arrays, into a more verbose data structure consisting of an\n * array of objects. It also adds pixel offset information.\n */\nfunction processAnnotData(rawAnnots) {\n var keys, annots, omittedAnnots,\n ideo = this;\n\n keys = rawAnnots.keys;\n rawAnnots = rawAnnots.annots;\n\n [annots, omittedAnnots] = addAnnots(rawAnnots, keys, ideo);\n annots = orderAnnotContainers(annots, ideo);\n\n sendTrackAndAnnotWarnings(omittedAnnots, ideo);\n\n return annots;\n}\n\nexport {processAnnotData, getAnnotDomId};\n","/**\n * @fileoverview Parse raw Ideogram.js annotations from an expression matrix.\n * This module handles dense gene expression matrixes.\n * In gene expression expressions, rows are genes and columns are cells.\n */\n\nexport class ExpressionMatrixParser {\n\n /**\n * @param {String} matrix Tab-delimited gene expression matrix\n * @param {Object} coordinates Coordinates [chr, start, length] by gene name\n * @param {Object} ideo Ideogram object\n */\n constructor(matrix, ideo) {\n this.matrix = matrix;\n this.ideo = ideo;\n }\n\n /**\n * Initialize rawAnnots by fetching genomic coordinates, then merging them\n * with the gene expression matrix supplied in constructor.\n */\n setRawAnnots() {\n var parser, ideo, matrix;\n parser = this;\n ideo = this.ideo;\n matrix = this.matrix;\n\n return new Promise(function(resolve) {\n parser.rawAnnots = parser.fetchCoordinates(ideo)\n .then(function(coordinates) {\n parser.coordinates = coordinates;\n resolve(parser.parseExpressionMatrix(matrix, ideo));\n });\n });\n }\n\n /**\n * Get chromosome, start and stop coordinates from genome annotation file\n *\n * TODO: Support non-human organisms\n */\n fetchCoordinates(ideo) {\n var coordinates = {};\n\n if (ideo.config.organism === 'human') {\n var ensemblData =\n ideo.config.dataDir +\n '../../annotations/Homo_sapiens,_Ensembl_80.tsv';\n\n return new Promise(function(resolve) {\n ideo.fetch(ensemblData, 'text').then(function(data) {\n // eslint-disable-next-line no-unused-vars\n var tsvLines, i, start, stop, gene, chr, length;\n\n tsvLines = data.split(/\\r\\n|\\n/).slice(1);\n for (i = 0; i < tsvLines.length; i++) {\n [start, stop, gene, , chr] = tsvLines[i].split(/\\s/g);\n start = parseInt(start);\n stop = parseInt(stop);\n length = stop - start;\n coordinates[gene] = [chr, start, length];\n }\n resolve(coordinates);\n });\n });\n } else {\n throw Error('Expression matrix parsing is only supported for human');\n }\n }\n\n /**\n * Parses an annotation from a tab-separated line of a matrix file\n */\n parseAnnotFromTsvLine(tsvLine, chrs) {\n var annot, chrIndex, chr, start, gene, expressions,\n columns = tsvLine.split(/\\s/g);\n\n gene = columns[0];\n if (gene in this.coordinates === false) return [null, null];\n\n expressions = columns.slice(1).map(d => parseFloat(d));\n [chr, start, length] = this.coordinates[gene];\n\n chrIndex = chrs.indexOf(chr);\n if (chrIndex === -1) return [null, null];\n\n annot = [gene, start, length];\n annot = annot.concat(expressions);\n\n return [chrIndex, annot];\n }\n\n /**\n * Parses a gene expression matrix file, returns raw annotations\n */\n parseExpressionMatrix(matrix, ideo) {\n var i, chrs, rawAnnots, cells, line, chrIndex, annot, keys,\n annots = [],\n tsvLines = matrix.split(/\\r\\n|\\n/);\n\n chrs = Object.keys(ideo.chromosomes[ideo.config.taxid]);\n for (i = 0; i < chrs.length; i++) {\n annots.push({chr: chrs[i], annots: []});\n }\n\n for (i = 1; i < tsvLines.length; i++) {\n line = tsvLines[i];\n [chrIndex, annot] = this.parseAnnotFromTsvLine(line, chrs);\n if (chrIndex !== null) annots[chrIndex].annots.push(annot);\n }\n\n cells = tsvLines[0].split(/\\s/g);\n keys = ['name', 'start', 'length'].concat(cells);\n rawAnnots = {keys: keys, annots: annots};\n\n return rawAnnots;\n }\n\n}\n","function downloadAnnotations() {\n\n const ideo = this;\n const annots = {};\n\n ideo.annots.forEach(chrAnnots => {\n chrAnnots.annots.forEach(annot => {\n const desc = ideo.annotDescriptions.annots[annot.name];\n\n annots[annot.name] = [\n annot.name, desc.ensemblId,\n annot.chr, annot.start, annot.stop, annot.length,\n desc.type\n ];\n });\n });\n\n const header = [\n '# Gene name', 'Ensembl ID', 'Chromosome', 'Start', 'Stop', 'Length', 'Type'\n ];\n const rows = [header].concat(Object.values(annots));\n const annotsTsv =\n ideo.annotDescriptions.headers + '\\n#\\n' +\n rows.map(row => row.join('\\t')).join('\\n');\n\n const annotsHref =\n 'data:text/plain;charset=utf-8,' + encodeURIComponent(annotsTsv);\n\n var evt = new MouseEvent('click', {\n view: window,\n bubbles: false,\n cancelable: true\n });\n\n var a = document.createElement('a');\n a.setAttribute('download', 'ideogram.tsv');\n a.setAttribute('href', annotsHref);\n a.setAttribute('target', '_blank');\n\n // Enables easy testing\n a.setAttribute('id', '_ideo-undisplayed-dl-annots-link');\n a.setAttribute('style', 'display: none;');\n document.body.appendChild(a);\n\n a.dispatchEvent(evt);\n}\n\nexport {downloadAnnotations};\n","/**\n * @fileoverview Methods for ideogram annotations.\n * Annotations are graphical objects that represent features of interest\n * located on the chromosomes, e.g. genes or variations. They can\n * appear beside a chromosome, overlaid on top of it, or between multiple\n * chromosomes.\n */\n\nimport {BedParser} from '../parsers/bed-parser';\nimport {TsvParser} from '../parsers/tsv-parser';\nimport {drawHeatmaps, deserializeAnnotsForHeatmap} from './heatmap';\nimport {inflateThresholds} from './heatmap-lib';\nimport {inflateHeatmaps} from './heatmap-collinear';\nimport {\n onLoadAnnots, onDrawAnnots, startHideAnnotTooltipTimeout,\n onWillShowAnnotTooltip, showAnnotTooltip, onClickAnnot\n} from './events';\n\nimport {\n addAnnotLabel, removeAnnotLabel, fillAnnotLabels, clearAnnotLabels\n // fadeOutAnnotLabels\n} from './labels';\n\nimport {drawAnnots, drawProcessedAnnots} from './draw';\nimport {getHistogramBars} from './histogram';\nimport {drawSynteny} from './synteny';\nimport {\n restoreDefaultTracks, setOriginalTrackIndexes, updateDisplayedTracks\n} from './filter';\nimport {processAnnotData} from './process';\nimport {ExpressionMatrixParser} from '../parsers/expression-matrix-parser';\nimport {downloadAnnotations} from './download';\n\nfunction initNumTracksAndBarWidth(ideo, config) {\n\n if (config.annotationTracks) {\n ideo.config.numAnnotTracks = config.annotationTracks.length;\n } else if (config.annotationsNumTracks) {\n ideo.config.numAnnotTracks = config.annotationsNumTracks;\n } else {\n ideo.config.numAnnotTracks = 1;\n }\n ideo.config.annotTracksHeight =\n config.annotationHeight * config.numAnnotTracks;\n\n if (typeof config.barWidth === 'undefined') {\n ideo.config.barWidth = 3;\n }\n}\n\nfunction initTooltip(ideo, config) {\n if (config.showAnnotTooltip !== false) {\n ideo.config.showAnnotTooltip = true;\n }\n\n if (config.onWillShowAnnotTooltip) {\n ideo.onWillShowAnnotTooltipCallback = config.onWillShowAnnotTooltip;\n }\n}\n\nfunction initAnnotLabel(ideo, config) {\n if (config.addAnnotLabel !== false) {\n ideo.config.addAnnotLabel = true;\n }\n\n if (config.onWillAddAnnotLabel) {\n ideo.onWillAddAnnotLabelCallback = config.onWillAddAnnotLabel;\n }\n}\n\nfunction initAnnotHeight(ideo) {\n var config = ideo.config;\n var annotHeight;\n\n if (!config.annotationHeight) {\n if (config.annotationsLayout === 'heatmap') {\n annotHeight = config.chrWidth - 1;\n } else {\n annotHeight = Math.round(config.chrHeight / 100);\n if (annotHeight < 3) annotHeight = 3;\n }\n ideo.config.annotationHeight = annotHeight;\n }\n}\n\n/**\n * Initializes various annotation settings. Constructor help function.\n */\nfunction initAnnotSettings() {\n var ideo = this,\n config = ideo.config;\n\n initAnnotHeight(ideo);\n\n if (\n config.annotationsPath || config.localAnnotationsPath ||\n ideo.annots || config.annotations\n ) {\n initNumTracksAndBarWidth(ideo, config);\n } else {\n ideo.config.annotTracksHeight = 0;\n ideo.config.numAnnotTracks = 0;\n }\n\n if (typeof config.annotationsColor === 'undefined') {\n ideo.config.annotationsColor = '#F00';\n }\n\n if (config.onClickAnnot) {\n ideo.onClickAnnotCallback = config.onClickAnnot;\n }\n\n initTooltip(ideo, config);\n initAnnotLabel(ideo, config);\n}\n\nfunction validateAnnotsUrl(annotsUrl) {\n var tmp, extension;\n\n tmp = annotsUrl.split('?')[0].split('.');\n extension = tmp[tmp.length - 1];\n\n if (['bed', 'json', 'tsv'].includes(extension) === false) {\n extension = extension.toUpperCase();\n alert(\n 'Ideogram.js only supports BED and Ideogram JSON and TSV ' +\n 'at the moment. ' +\n 'Sorry, check back soon for ' + extension + ' support!'\n );\n return;\n }\n return extension;\n}\n\n/** Find redundant chromosomes in raw annotations */\nfunction detectDuplicateChrsInRawAnnots(ideo) {\n const seen = {};\n const duplicates = [];\n const chrs = ideo.rawAnnots.annots.map(annot => annot.chr);\n\n chrs.forEach((chr) => {\n if (chr in seen) duplicates.push(chr);\n seen[chr] = 1;\n });\n\n if (duplicates.length > 0) {\n const message =\n `Duplicate chromosomes detected.\\n` +\n `Chromosome list: ${chrs}. Duplicates: ${duplicates}.\\n` +\n `To fix this, edit your raw annotations JSON data to remove redundant ` +\n `chromosomes.`;\n throw Error(message);\n }\n}\n\nfunction afterRawAnnots() {\n var ideo = this,\n config = ideo.config;\n\n // Ensure annots are ordered by chromosome\n ideo.rawAnnots.annots = ideo.rawAnnots.annots.sort(Ideogram.sortChromosomes);\n\n if (ideo.onLoadAnnotsCallback) {\n ideo.onLoadAnnotsCallback();\n }\n\n if (\n 'heatmapThresholds' in config ||\n 'metadata' in ideo.rawAnnots &&\n 'heatmapThresholds' in ideo.rawAnnots.metadata\n ) {\n if (config.annotationsLayout === 'heatmap') {\n inflateHeatmaps(ideo);\n } else if (config.annotationsLayout === 'heatmap-2d') {\n ideo.config.heatmapThresholds = inflateThresholds(ideo);\n }\n }\n\n if (config.heatmaps) {\n ideo.deserializeAnnotsForHeatmap(ideo.rawAnnots);\n }\n\n detectDuplicateChrsInRawAnnots(ideo);\n}\n\n/**\n * Converts list of annotation-by-chromosome objects to list of annot objects\n */\nfunction flattenAnnots() {\n const ideo = this;\n return ideo.annots.reduce((accumulator, annots) => {\n return [...accumulator, ...annots.annots];\n }, []);\n}\n\n/**\n * Requests annotations URL via HTTP, sets ideo.rawAnnots for downstream\n * processing.\n *\n * @param annotsUrl Absolute or relative URL for native or BED annotations file\n */\nfunction fetchAnnots(annotsUrl) {\n var extension, is2dHeatmap,\n ideo = this,\n config = ideo.config;\n\n is2dHeatmap = config.annotationsLayout === 'heatmap-2d';\n\n var extension = validateAnnotsUrl(annotsUrl);\n\n if (annotsUrl.slice(0, 4) !== 'http' && !is2dHeatmap && extension !== 'tsv') {\n ideo.fetch(annotsUrl)\n .then(function(data) {\n ideo.rawAnnotsResponse = data; // Preserve truly raw response content\n ideo.rawAnnots = data; // Sometimes gets partially processed\n ideo.afterRawAnnots();\n });\n return;\n }\n\n extension = (is2dHeatmap ? '' : extension);\n\n ideo.fetch(annotsUrl, 'text')\n .then(function(text) {\n ideo.rawAnnotsResponse = text;\n if (is2dHeatmap) {\n var parser = new ExpressionMatrixParser(text, ideo);\n parser.setRawAnnots().then(function(d) {\n ideo.rawAnnots = d;\n ideo.afterRawAnnots();\n });\n } else {\n if (extension === 'tsv') {\n ideo.rawAnnots = new TsvParser(text, ideo).rawAnnots;\n } else if (extension === 'bed') {\n ideo.rawAnnots = new BedParser(text, ideo).rawAnnots;\n } else {\n ideo.rawAnnots = JSON.parse(text);\n }\n ideo.afterRawAnnots();\n }\n });\n}\n\n/**\n * Fills out annotations data structure such that its top-level list of arrays\n * matches that of this ideogram's chromosomes list in order and number\n * Fixes https://github.com/eweitz/ideogram/issues/66\n */\nfunction fillAnnots(annots) {\n var filledAnnots, chrs, chrArray, i, chr, annot, chrIndex;\n\n filledAnnots = [];\n chrs = [];\n chrArray = this.chromosomesArray;\n\n for (i = 0; i < chrArray.length; i++) {\n chr = chrArray[i].name;\n chrs.push(chr);\n filledAnnots.push({chr: chr, annots: []});\n }\n\n for (i = 0; i < annots.length; i++) {\n annot = annots[i];\n chrIndex = chrs.indexOf(annot.chr);\n if (chrIndex !== -1) {\n filledAnnots[chrIndex] = annot;\n }\n }\n\n return filledAnnots;\n}\n\nexport {\n onLoadAnnots, onDrawAnnots, processAnnotData, restoreDefaultTracks,\n updateDisplayedTracks, initAnnotSettings, fetchAnnots, drawAnnots,\n getHistogramBars, drawHeatmaps, deserializeAnnotsForHeatmap, fillAnnots,\n drawProcessedAnnots, drawSynteny, startHideAnnotTooltipTimeout,\n showAnnotTooltip, onWillShowAnnotTooltip, setOriginalTrackIndexes,\n afterRawAnnots, onClickAnnot, downloadAnnotations, addAnnotLabel,\n removeAnnotLabel, fillAnnotLabels, clearAnnotLabels, flattenAnnots\n // fadeOutAnnotLabels\n};\n","/** Adds boxes behind a list of chromosomes; can indicate selection, etc. */\nfunction highlight(chrNames, color='red') {\n const ideo = this;\n const taxid = ideo.config.taxid;\n\n const highlightsHtml = chrNames.map(chrName => {\n const chrId = ideo.chromosomes[taxid][chrName].id;\n const chrSet = `${ideo.selector} #${chrId}-chromosome-set`;\n const chrDom = document.querySelector(chrSet);\n const rect = chrDom.getBoundingClientRect();\n\n const style = `style=\"\n stroke-width: 1px;\n stroke: ${color};\n fill: ${color};\n fill-opacity: 0.05;\n position: absolute;\n rx: 4;\n ry: 4;\n height: ${rect.width + 15}px;\n width: ${rect.height + 15}px\"`;\n\n const left = chrDom.transform.baseVal[1].matrix.f - 7.5;\n const transform = `transform=\"rotate(90) translate(10, ${left})\"`;\n const id = `id=\"ideo-highlight-${chrId}\"`;\n\n return ``;\n }).join();\n\n const ideoDom = document.querySelector(ideo.selector);\n ideoDom.insertAdjacentHTML('afterBegin', highlightsHtml);\n}\n\n/** Removes highlight from a list of chromosomes (or all chromosomes) */\nfunction unhighlight(chrNames) {\n const ideo = this;\n\n let highlightsSelector = `${ideo.selector} .ideo-highlight`;\n if (typeof chrNames !== 'undefined') {\n const taxid = ideo.config.taxid;\n highlightsSelector = chrNames.map(chrName => {\n const chrId = ideo.chromosomes[taxid][chrName].id;\n return `${ideo.selector} #ideo-highlight-${chrId}`;\n });\n }\n\n document.querySelectorAll(highlightsSelector).forEach((element) => {\n element.remove();\n });\n\n}\n\nexport {highlight, unhighlight};\n","import {d3, slug, fetchWithRetry} from '../lib';\n\n/**\n * Returns NCBI Taxonomy identifier (taxid) for organism name\n */\nfunction getTaxidFromEutils(orgName, ideo) {\n var taxonomySearch, taxid;\n\n taxonomySearch = ideo.esearch + '&db=taxonomy&term=' + orgName;\n\n return d3.json(taxonomySearch).then(function(data) {\n var idlist = data.esearchresult.idlist;\n if (idlist.length === 0) {\n var warning =\n 'Organism \"' + orgName + '\" is generally unknown; it was not found ' +\n 'in the NCBI Taxonomy database. If you did not intend to specify a ' +\n 'novel or custom taxon, then try using the organism\\'s ' +\n 'scientific name, e.g. Homo sapiens or Arabidopsis thaliana.';\n throw warning;\n } else {\n taxid = data.esearchresult.idlist[0];\n return [orgName, taxid];\n }\n });\n}\n\n/**\n * Returns organism common name given an NCBI Taxonomy ID\n *\n * @param taxid NCBI Taxonomy ID\n * @param callback Function to call upon completing ESearch request\n */\nfunction getOrganismFromEutils(taxid, callback) {\n var organism, taxonomySearch,\n ideo = this;\n\n taxid = ideo.config.organism;\n\n taxonomySearch = ideo.esummary + '&db=taxonomy&id=' + taxid;\n\n d3.json(taxonomySearch).then(function(data) {\n organism = data.result[String(taxid)].commonname;\n ideo.config.organism = organism;\n return callback(organism);\n });\n}\n\nfunction setTaxidData(taxid, ideo) {\n\n var dataDir, urlOrg, taxids;\n\n if (ideo.assemblyIsAccession()) {\n return new Promise(function(resolve) {\n ideo.coordinateSystem = 'bp';\n ideo.getAssemblyAndChromosomesFromEutils(taxid, resolve);\n });\n }\n\n dataDir = ideo.config.dataDir;\n urlOrg = slug(ideo.organisms[taxid].scientificName);\n\n taxids = [taxid];\n\n var fullyBandedTaxids = ['9606', '10090', '10116'];\n if (fullyBandedTaxids.includes(taxid) && !ideo.config.showFullyBanded) {\n urlOrg += '-no-bands';\n }\n var chromosomesUrl = dataDir + urlOrg + '.json';\n\n var promise2 = new Promise((resolve, reject) => {\n return fetchWithRetry(chromosomesUrl)\n .then(response => {\n return response.json().then(function(json) {\n resolve(json.chrBands);\n });\n })\n .catch((errorMessage) => {\n reject(errorMessage);\n });\n });\n\n return promise2\n .then(function(chrBands) {\n // Check if chromosome data exists locally.\n // This is used for pre-processed centromere data,\n // which is not accessible via EUtils. See get_chromosomes.py.\n\n var asmAndChrTaxidsArray = [''],\n chromosomes = [],\n seenChrs = {},\n chr, maxLength, splitBand, length;\n\n ideo.bandData[taxid] = chrBands;\n\n for (var i = 0; i < chrBands.length; i++) {\n splitBand = chrBands[i].split(' ');\n chr = splitBand[0];\n length = splitBand.slice(-1)[0];\n if (chr in seenChrs) {\n continue;\n } else {\n chromosomes.push({name: chr, type: 'nuclear', length: length});\n seenChrs[chr] = 1;\n }\n }\n chromosomes = chromosomes.sort(Ideogram.sortChromosomes);\n maxLength = {bp: 0, iscn: 0};\n chromosomes.forEach(chr => {\n if (chr.length > maxLength.bp) maxLength.bp = chr.length;\n });\n ideo.maxLength[taxid] = maxLength;\n asmAndChrTaxidsArray.push(chromosomes);\n asmAndChrTaxidsArray.push(taxids);\n return asmAndChrTaxidsArray;\n },\n function() {\n // If request in `then` errs (404), fetch data from EUtils\n return new Promise(function(resolve) {\n ideo.coordinateSystem = 'bp';\n ideo.getAssemblyAndChromosomesFromEutils(taxid, resolve);\n });\n });\n}\n\nfunction setAssemblyAndChromosomes(taxid, resolve, ideo) {\n var assembly, chrs, originalChrs, orgName, filteredChrs,\n config = ideo.config;\n\n setTaxidData(taxid, ideo)\n .then(function(asmChrTaxidsArray) {\n assembly = asmChrTaxidsArray[0];\n chrs = asmChrTaxidsArray[1];\n\n if ('chromosomes' in config === false || config.chromosomes === null) {\n ideo.config.chromosomes = {};\n ideo.config.chromosomes[taxid] = chrs;\n } else {\n if (config.multiorganism) {\n if (taxid in config.chromosomes) {\n // Encountered when either organism has centromere data\n originalChrs = config.chromosomes[taxid];\n } else {\n // Encountered when neither organism has centromere data\n orgName = slug(ideo.getScientificName(taxid));\n ideo.config.chromosomes[taxid] =\n config.chromosomes[orgName].slice();\n originalChrs = ideo.config.chromosomes[taxid];\n // delete ideo.config.chromosomes[orgName];\n }\n } else {\n originalChrs = config.chromosomes;\n }\n\n filteredChrs = chrs.filter(d => originalChrs.includes(d.name));\n ideo.config.chromosomes[taxid] = filteredChrs;\n }\n ideo.chromosomes[taxid] = ideo.config.chromosomes[taxid].slice();\n ideo.organisms[taxid].assemblies = {\n default: assembly\n };\n resolve();\n });\n}\n\n/**\n * Determine if organism is natively supported, using its name.\n */\nfunction isOrganismSupported(org, ideo) {\n var taxid, ideoOrg;\n\n for (taxid in ideo.organisms) {\n ideoOrg = ideo.organisms[taxid];\n if (\n taxid === slug(org) ||\n slug(ideoOrg.commonName) === slug(org) ||\n slug(ideoOrg.scientificName) === slug(org)\n ) {\n return true;\n }\n }\n\n return false;\n}\n\n/**\n * Augment \"organisms\" metadata with for any requested organism that is\n * not natively supported (i.e., not in organism-metadata.js).\n*/\nfunction populateNonNativeOrg(orgs, ideo) {\n var org, promise, i,\n getTaxidFromEutilsPromises = [],\n augmentedOrganismMetadata = {};\n\n for (i = 0; i < orgs.length; i++) {\n org = orgs[i];\n if (isOrganismSupported(org, ideo) === false) {\n promise = getTaxidFromEutils(org, ideo)\n .then(function(orgNameAndTaxid) {\n\n var taxid = orgNameAndTaxid[1],\n orgName = orgNameAndTaxid[0],\n name, scientificName;\n\n name = orgName.replace('-', ' ');\n scientificName = name[0].toUpperCase() + name.slice(1);\n\n augmentedOrganismMetadata[taxid] = {\n scientificName: scientificName,\n commonName: '',\n assemblies: {default: ''}\n };\n\n Object.assign(ideo.organisms, augmentedOrganismMetadata);\n }, function(warning) {\n console.warn(warning);\n var customMetadata = {\n scientificName: org,\n commonName: org,\n assemblies: {default: ''}\n };\n\n // Use a negative number as unofficial taxid for custom organism.\n // Use case: https://github.com/eweitz/ideogram/issues/265\n //\n // If support for *multiple* custom specifies is ever\n // needed, we can decrement from -1.\n ideo.organisms['-1'] = customMetadata;\n augmentedOrganismMetadata['-1'] = customMetadata;\n });\n } else {\n promise = new Promise(function(resolve) {\n var taxid = ideo.getTaxid(org);\n augmentedOrganismMetadata[taxid] = ideo.organisms[taxid];\n resolve();\n });\n }\n getTaxidFromEutilsPromises.push(promise);\n }\n\n return Promise.all(getTaxidFromEutilsPromises).then(function() {\n return augmentedOrganismMetadata;\n });\n}\n\nfunction prepareTmpChrsAndTaxids(ideo) {\n var orgs, taxids, tmpChrs, org, taxid, chrsOrgSlugs,\n config = ideo.config;\n\n taxids = [];\n tmpChrs = {};\n orgs = (config.multiorganism) ? config.organism : [config.organism];\n\n return populateNonNativeOrg(orgs, ideo).then(function(orgMetadata) {\n var orgFields = orgMetadata[taxid];\n\n for (taxid in orgMetadata) {\n orgFields = orgMetadata[taxid];\n taxids.push(taxid);\n if (config.multiorganism) {\n if (typeof config.chromosomes !== 'undefined') {\n chrsOrgSlugs = Object.keys(config.chromosomes).map(org => slug(org));\n // Adjusts 'chromosomes' configuration parameter to make object\n // keys use taxid instead of common organism name\n if (chrsOrgSlugs.includes(slug(orgFields.scientificName))) {\n org = orgFields.scientificName;\n } else if (chrsOrgSlugs.includes(slug(orgFields.commonName))) {\n org = orgFields.commonName;\n }\n if (slug(org) in config.chromosomes) {\n tmpChrs[taxid] = config.chromosomes[slug(org)];\n } else {\n tmpChrs[taxid] = config.chromosomes[org.toLowerCase()];\n }\n } else {\n tmpChrs = null;\n }\n }\n }\n return [tmpChrs, taxids];\n });\n}\n\n/**\n * Sort taxids by the \"organism\" configuration option\n *\n * TODO: Handle taxid being passed as organism\n */\nfunction sortTaxidsByOriginalOrganismOption(ideo) {\n var configOrganisms, sortedTaxids, i;\n configOrganisms = ideo.config.organism;\n sortedTaxids = [];\n if (Array.isArray(configOrganisms)) {\n // Handling multi-organism ideogram\n for (i = 0; i < configOrganisms.length; i++) {\n sortedTaxids.push(ideo.getTaxid(configOrganisms[i]));\n }\n } else {\n // Handling single-organism ideogram\n sortedTaxids.push(ideo.getTaxid(configOrganisms));\n }\n return sortedTaxids;\n}\n\nfunction getTaxidsForOrganismsInConfig(callback, ideo) {\n\n prepareTmpChrsAndTaxids(ideo).then(function([tmpChrs, taxids]) {\n var i, taxid, promise, assemblies, asmAccs,\n config = ideo.config,\n asmAndChrPromises = [];\n\n for (i = 0; i < taxids.length; i++) {\n taxid = taxids[i];\n assemblies = ideo.organisms[taxid].assemblies;\n asmAccs = Object.values(assemblies);\n if (\n assemblies.default === '' ||\n ideo.assemblyIsAccession() && !asmAccs.includes(config.assembly)\n ) {\n promise = new Promise(function(resolve) {\n setAssemblyAndChromosomes(taxid, resolve, ideo);\n });\n } else {\n ideo.config.taxids = taxids;\n if (ideo.config.multiorganism) {\n ideo.config.chromosomes = tmpChrs;\n }\n promise = new Promise(function(resolve) {\n resolve();\n });\n }\n\n asmAndChrPromises.push(promise);\n }\n\n Promise.all(asmAndChrPromises).then(function() {\n taxids = sortTaxidsByOriginalOrganismOption(ideo);\n ideo.config.taxids = taxids;\n return callback(taxids);\n });\n });\n}\n\nfunction getIsMultiorganism(taxidInit, ideo) {\n return (\n ('organism' in ideo.config && ideo.config.organism instanceof Array) ||\n (taxidInit && ideo.config.taxid instanceof Array)\n );\n}\n\n/**\n * Configure Ideogram taxids when 'organism' is not in ideo.config\n */\nfunction getTaxidsForOrganismsNotInConfig(taxidInit, callback, ideo) {\n var taxids;\n\n if (ideo.config.multiorganism) {\n if (taxidInit) {\n taxids = ideo.config.taxid;\n }\n } else {\n if (taxidInit) {\n taxids = [ideo.config.taxid];\n }\n ideo.config.taxids = taxids;\n }\n callback(taxids);\n}\n\n/**\n * Returns an array of taxids for the current ideogram\n * Also sets configuration parameters related to taxid(s), whether ideogram is\n * multiorganism, and adjusts chromosomes parameters as needed\n **/\nfunction getTaxids(callback) {\n var taxidInit,\n ideo = this;\n\n taxidInit = 'taxid' in ideo.config;\n\n ideo.config.multiorganism = getIsMultiorganism(taxidInit, ideo);\n\n if (ideo.config.multiorganism) ideo.coordinateSystem = 'bp';\n\n if ('organism' in ideo.config) {\n const org = ideo.config.organism;\n if (typeof org === 'string') {\n // Canonicalize e.g. \"Homo sapiens\" to \"homo-sapiens\"\n ideo.config.organism = slug(org.toLowerCase());\n }\n\n getTaxidsForOrganismsInConfig(callback, ideo);\n } else {\n getTaxidsForOrganismsNotInConfig(taxidInit, callback, ideo);\n }\n}\n\nexport {\n getTaxids, getOrganismFromEutils\n};\n","import {d3} from '../lib';\nimport {\n esearch, esummary, elink, getAssemblySearchUrl\n} from './eutils-config.js';\nimport {\n getTaxids, getOrganismFromEutils\n} from './organisms.js';\n\n/**\n * Get a URL to ESearch the NCBI Nucleotide DB for an Assembly UID\n */\nfunction getESearchUrlForChromosomes(asmUid, ideo) {\n var qs;\n\n // Get a list of IDs for the chromosomes in this genome.\n //\n // Query chromosomes sequences in Nucleotide DB (nuccore) via\n // Assembly DB E-Utils link.\n qs = ('&db=nuccore&dbfrom=assembly&linkname=assembly_nuccore&' +\n 'cmd=neighbor_history&from_uid=' + asmUid);\n\n return d3.json(ideo.elink + qs)\n .then(function(data) {\n var webenv = data.linksets[0].webenv;\n qs =\n '&db=nuccore' +\n '&term=%231+AND+%28' +\n 'sequence_from_chromosome[Properties]+OR+' +\n 'sequence_from_plastid[Properties]+OR+' +\n 'sequence_from_mitochondrion[Properties]%29' +\n '&WebEnv=' + webenv + '&usehistory=y&retmax=1000';\n return ideo.esearch + qs;\n });\n}\n\n/**\n * Request basic data on a list of chromosome IDs from ESearch\n */\nfunction fetchNucleotideSummary(data, ideo) {\n var ids, ntSummary;\n ids = data.esearchresult.idlist.join(',');\n ntSummary = ideo.esummary + '&db=nucleotide&id=' + ids;\n return d3.json(ntSummary);\n}\n\n/**\n * Get name and type for mitochondrial chromosome\n *\n * See example of \"MT\" in yeast:\n * https://eweitz.github.io/ideogram/eukaryotes?org=saccharomyces-cerevisiae\n */\nfunction parseMitochondrion(result, ideo) {\n var type, cnIndex, chrName;\n\n if (ideo.config.showNonNuclearChromosomes) {\n type = result.genome;\n cnIndex = result.subtype.split('|').indexOf('plasmid');\n if (cnIndex === -1) {\n chrName = 'MT';\n } else {\n // Seen in e.g. rice genome IRGSP-1.0 (GCF_001433935.1),\n // From https://eutils.ncbi.nlm.nih.gov/entrez/eutils/esummary.fcgi?retmode=json&db=nucleotide&id=996703432,996703431,996703430,996703429,996703428,996703427,996703426,996703425,996703424,996703423,996703422,996703421,194033210,11466763,7524755\n // genome: 'mitochondrion',\n // subtype: 'cell_line|plasmid',\n // subname: 'A-58 CMS|B1',\n chrName = result.subname.split('|')[cnIndex];\n }\n } else {\n return [null, null];\n }\n\n return [chrName, type];\n}\n\n/**\n * Get name and type for chloroplastic chromosome.\n *\n * Plants have chloroplasts. See e.g. green algae:\n * https://eweitz.github.io/ideogram/eukaryotes?org=micromonas-commoda\n */\nfunction parseChloroplastOrPlastid(ideo) {\n // Plastid encountered with rice genome IRGSP-1.0 (GCF_001433935.1)\n if (ideo.config.showNonNuclearChromosomes) {\n return ['CP', 'chloroplast'];\n }\n return [null, null];\n}\n\n/**\n * Get name and type for apicoplast chromosome\n *\n * Plasmodium falciparum (malaria parasite) has such a chromosome, see e.g.:\n * https://eweitz.github.io/ideogram/eukaryotes?org=plasmodium-falciparum\n */\nfunction parseApicoplast(ideo) {\n if (ideo.config.showNonNuclearChromosomes) {\n return ['AP', 'apicoplast'];\n }\n return [null, null];\n}\n\n/**\n * Get name and type for nuclear chromosome\n *\n * These are typical chromosomes, like chromosome 1.\n */\nfunction parseNuclear(result) {\n var type, cnIndex, chrName;\n\n type = 'nuclear';\n cnIndex = result.subtype.split('|').indexOf('chromosome');\n chrName = result.subname.split('|')[cnIndex];\n\n if (typeof chrName !== 'undefined' && chrName.substr(0, 3) === 'chr') {\n // Convert \"chr12\" to \"12\", e.g. for banana (GCF_000313855.2)\n chrName = chrName.substr(3);\n }\n\n return [chrName, type];\n}\n\n/**\n * Get name and type of any chromosome object from NCBI Nucleotide ESummary\n */\nfunction getChrNameAndType(result, ideo) {\n var genome = result.genome;\n if (genome === 'mitochondrion') {\n return parseMitochondrion(result, ideo);\n } else if (genome === 'chloroplast' || genome === 'plastid') {\n return parseChloroplastOrPlastid(ideo);\n } else if (genome === 'apicoplast') {\n return parseApicoplast(ideo);\n } else {\n return parseNuclear(result);\n }\n}\n\nfunction parseChromosome(result, ideo) {\n var chrName, type, chromosome;\n\n [chrName, type] = getChrNameAndType(result, ideo);\n\n chromosome = {\n name: chrName,\n length: result.slen,\n type: type\n };\n\n return chromosome;\n}\n\nfunction parseChromosomes(results, taxid, ideo) {\n var x, chromosome, seenChrId, maxLength,\n seenChrs = {},\n chromosomes = [];\n\n for (x in results) {\n // omit list of result uids\n if (x === 'uids') continue;\n\n chromosome = parseChromosome(results[x], ideo);\n seenChrId = chromosome.name + '_' + chromosome.length;\n if (chromosome.type !== null && seenChrId in seenChrs === false) {\n // seenChrs accounts for duplicate chromosomes seen with\n // pig (Sus scrofa), likely GenBank and RefSeq copies.\n chromosomes.push(chromosome);\n }\n\n seenChrs[seenChrId] = 1;\n }\n\n chromosomes = chromosomes.sort(Ideogram.sortChromosomes);\n\n maxLength = {bp: 0, iscn: 0};\n chromosomes.forEach(chr => {\n if (chr.length > maxLength.bp) maxLength.bp = chr.length;\n });\n if (maxLength.bp > ideo.maxLength.bp) ideo.maxLength.bp = maxLength.bp;\n ideo.maxLength[taxid] = maxLength;\n ideo.coordinateSystem = 'bp';\n\n return chromosomes;\n}\n\n/**\n * Request ESummary data from an ESearch on a genome assembly\n */\nfunction fetchAssemblySummary(data, ideo) {\n var asmUid, asmSummaryUrl;\n\n // NCBI Assembly database's internal identifier (uid) for this assembly\n asmUid = data.esearchresult.idlist[0];\n asmSummaryUrl = ideo.esummary + '&db=assembly&id=' + asmUid;\n\n return d3.json(asmSummaryUrl);\n}\n\n/**\n * Returns assembly accession, as well as names and lengths of chromosomes for\n * an organism's best-known genome assembly, or for a specified assembly.\n *\n * Gets data from NCBI EUtils web API.\n *\n * @param callback Function to call upon completion of this async method\n */\nfunction getAssemblyAndChromosomesFromEutils(taxid, callback) {\n var assemblyAccession,\n ideo = this;\n\n // Search for assembly, then\n // get summary of that assembly, then\n // get search URL for chromosomes in that assembly, then\n // get search results containing chromosome IDs, then\n // get summaries of each of those chromosome IDs, then\n // format the chromosome summaries and pass them into callback function.\n var asmSearchUrl = getAssemblySearchUrl(taxid, ideo);\n d3.json(asmSearchUrl)\n .then(function(data) {return fetchAssemblySummary(data, ideo);})\n .then(function(data) {\n var asmUid = data.result.uids[0];\n assemblyAccession = data.result[asmUid];\n return getESearchUrlForChromosomes(asmUid, ideo);\n }).then(function(esearchUrl) {return d3.json(esearchUrl);})\n .then(function(data) {return fetchNucleotideSummary(data, ideo);})\n .then(function(data) {\n var chromosomes = parseChromosomes(data.result, taxid, ideo);\n return callback([assemblyAccession, chromosomes]);\n }, function(rejectedReason) {\n console.warn(rejectedReason);\n });\n}\n\nexport {\n esearch, esummary, elink, getOrganismFromEutils,\n getTaxids, getAssemblyAndChromosomesFromEutils\n};\n","// The E-Utilies In Depth: Parameters, Syntax and More:\n// https://www.ncbi.nlm.nih.gov/books/NBK25499/\n\nvar apiKey = '&api_key=7e33ac6a08a6955ec3b83d214d22b21a2808';\n\nvar eutils = 'https://eutils.ncbi.nlm.nih.gov/entrez/eutils/';\nvar esearch = eutils + 'esearch.fcgi?retmode=json' + apiKey;\nvar esummary = eutils + 'esummary.fcgi?retmode=json' + apiKey;\nvar elink = eutils + 'elink.fcgi?retmode=json' + apiKey;\n\nfunction getAssemblySearchUrl(taxid, ideo) {\n var termStem, asmSearchUrl;\n\n if (ideo.assemblyIsAccession()) {\n termStem = ideo.config.assembly + '%22[Assembly%20Accession]';\n } else {\n termStem = (\n taxid + '%22[taxid]' +\n 'AND%20(%22latest%20refseq%22[filter])%20'\n );\n }\n\n asmSearchUrl =\n ideo.esearch +\n '&db=assembly' +\n '&term=%22' + termStem +\n 'AND%20(%22chromosome%20level%22[filter]%20' +\n 'OR%20%22complete%20genome%22[filter])';\n\n return asmSearchUrl;\n}\n\nexport {esearch, esummary, elink, getAssemblySearchUrl};\n","/**\n * @fileoverview Methods to show (or hide) cytogenetic banding data\n */\n\nimport {d3} from '../lib';\n\nfunction hideUnshownBandLabels() {\n var ideo = this;\n var bandsToShow = ideo.bandsToShow.join(',');\n\n // Handles edge-case when ideogram consists of one chromosome\n // that lacks bands in a genome that has bands (e.g. MT in human)\n if (ideo.bandsToShow.length === 0) return;\n\n // d3.selectAll resolves to querySelectorAll (QSA).\n // QSA takes a surprisingly long time to complete,\n // and scales with the number of selectors.\n // Most bands are hidden, so we can optimize by\n // Hiding all bands, then QSA'ing and displaying the\n // relatively few bands that are shown.\n d3.selectAll(ideo.selector + ' .bandLabel, .bandLabelStalk')\n .style('display', 'none');\n d3.selectAll(bandsToShow).style('display', '');\n}\n\nfunction getPrevRight(prevLabelXRight, prevHiddenBoxIndex, i,\n textOffsets, chrModel) {\n var prevTextBoxLeft, prevTextBoxWidth;\n\n if (prevHiddenBoxIndex !== i) {\n // This getBoundingClientRect() forces Chrome's\n // 'Recalculate Style' and 'Layout', which takes 30-40 ms on Chrome.\n // TODO: This forced synchronous layout would be nice to eliminate.\n // prevTextBox = texts[i].getBoundingClientRect();\n // prevLabelXRight = prevTextBox.left + prevTextBox.width;\n\n // TODO: Account for number of characters in prevTextBoxWidth,\n // maybe also zoom.\n prevTextBoxLeft = textOffsets[chrModel.id][i];\n prevTextBoxWidth = 36;\n\n prevLabelXRight = prevTextBoxLeft + prevTextBoxWidth;\n }\n\n return prevLabelXRight;\n}\n\nfunction updateShown(indexesToShow, overlapRight, left, pad, prevRight, i,\n isBefore) {\n var hiddenIndex, doSkip,\n thisRight = isBefore ? overlapRight : prevRight;\n\n if (left < pad + thisRight) {\n overlapRight = prevRight;\n hiddenIndex = i;\n doSkip = isBefore;\n } else {\n indexesToShow.push(i);\n }\n\n return [indexesToShow, overlapRight, hiddenIndex, doSkip];\n}\n\nfunction getIndexesToShow(offsets, chrModel) {\n var i, hiddenIndex, left, prevRight, doSkip,\n indexesToShow = [],\n textsLength = offsets[chrModel.id].length,\n overlapRight = 0, // Right X coordinate of overlapping label\n pad = 5; // text padding\n\n for (i = 0; i < textsLength; i++) {\n // Ensures band labels don't overlap\n left = offsets[chrModel.id][i];\n\n [indexesToShow, overlapRight, hiddenIndex, doSkip] =\n updateShown(indexesToShow, overlapRight, left, pad, prevRight, i, true);\n if (doSkip) continue;\n\n prevRight = getPrevRight(prevRight, hiddenIndex, i, offsets, chrModel);\n\n [indexesToShow, overlapRight, hiddenIndex, doSkip] =\n updateShown(indexesToShow, overlapRight, left, pad, prevRight, i, false);\n }\n\n return indexesToShow;\n}\n\n/**\n * Sets band labels to display on each chromosome, avoiding label overlap\n */\nfunction setBandsToShow(chrs, textOffsets) {\n var index, i, j, indexesToShow, chrModel, selectorsToShow, ithLength,\n ideo = this;\n\n ideo.bandsToShow = [];\n\n for (i = 0; i < chrs.length; i++) {\n\n chrModel = chrs[i];\n\n indexesToShow = getIndexesToShow(textOffsets, chrModel);\n\n selectorsToShow = [];\n ithLength = indexesToShow.length;\n\n for (j = 0; j < ithLength; j++) {\n index = indexesToShow[j];\n selectorsToShow.push('#' + chrModel.id + ' .bsbsl-' + index);\n }\n\n ideo.bandsToShow = ideo.bandsToShow.concat(selectorsToShow);\n }\n}\n\nexport {hideUnshownBandLabels, setBandsToShow};\n","/**\n * @fileoverview Methods to draw cytogenetic bands and their labels\n *\n */\n\nimport {d3} from '../lib';\nimport {hideUnshownBandLabels, setBandsToShow} from './show';\nimport {staticColors, staticGradients} from './styles';\nimport {configuredCss} from './../init/configure';\n\n/**\n * Draws text of cytoband label\n */\nfunction drawBandLabelText(chr, bandsToLabel, chrModel, textOffsets) {\n var ideo = this,\n layout = ideo._layout,\n chrIndex = chrModel.chrIndex;\n\n chr.selectAll('text')\n .data(bandsToLabel)\n .enter()\n .append('g')\n .attr('class', function(d, i) {\n return 'bandLabel bsbsl-' + i;\n })\n .attr('transform', function(d) {\n var transform = layout.getChromosomeBandLabelTranslate(d, chrIndex);\n\n if (ideo.config.orientation === 'horizontal') {\n textOffsets[chrModel.id].push(transform.x + 13);\n } else {\n textOffsets[chrModel.id].push(transform.y + 6);\n }\n\n return transform.translate;\n })\n .append('text')\n .attr('text-anchor', layout.getChromosomeBandLabelAnchor(chrIndex))\n .text(function(d) {return d.name;});\n\n return textOffsets;\n}\n\n/**\n * Draws line between cytoband and its text label\n */\nfunction drawBandLabelStalk(chr, bandsToLabel, chrModel, textOffsets) {\n var ideo = this;\n\n chr.selectAll('line.bandLabelStalk')\n .data(bandsToLabel)\n .enter()\n .append('g')\n .attr('class', function(d, i) {\n return 'bandLabelStalk bsbsl-' + i;\n })\n .attr('transform', function(d) {\n var x, y;\n\n x = ideo.round(d.px.start + d.px.width / 2);\n y = -10;\n\n textOffsets[chrModel.id].push(x + 13);\n\n return 'translate(' + x + ',' + y + ')';\n })\n .append('line')\n .attr('x1', 0)\n .attr('y1', ideo._layout.getChromosomeBandTickY1(chrModel.chrIndex))\n .attr('x2', 0)\n .attr('y2', ideo._layout.getChromosomeBandTickY2(chrModel.chrIndex));\n}\n\nfunction getChrModels(chromosomes) {\n var taxid, chr,\n chrModels = [];\n\n for (taxid in chromosomes) {\n for (chr in chromosomes[taxid]) {\n chrModels.push(chromosomes[taxid][chr]);\n }\n }\n\n return chrModels;\n}\n\n/**\n * Draws text and stalks for cytogenetic band labels.\n *\n * Band labels are text like \"p11.11\".\n * Stalks are small lines that visually connect labels to their bands.\n */\nfunction drawBandLabels(chromosomes) {\n var i, chr, chrModel, chrModels, bandsToLabel,\n ideo = this,\n textOffsets = {};\n\n chrModels = getChrModels(chromosomes);\n\n for (i = 0; i < chrModels.length; i++) {\n chrModel = chrModels[i];\n chr = d3.select(ideo.selector + ' #' + chrModel.id);\n textOffsets[chrModel.id] = [];\n\n // Don't show \"pter\" label for telocentric chromosomes, e.g. mouse\n bandsToLabel = chrModel.bands.filter(d => d.name !== 'pter');\n\n textOffsets =\n ideo.drawBandLabelText(chr, bandsToLabel, chrModel, textOffsets);\n\n ideo.drawBandLabelStalk(chr, bandsToLabel, chrModel, textOffsets);\n }\n\n ideo.setBandsToShow(chrModels, textOffsets);\n}\n\nfunction getStainAndColors(i, colors) {\n var stain, color1, color2, color3;\n\n stain = colors[i][0];\n color1 = colors[i][1];\n color2 = colors[i][2];\n color3 = colors[i][3];\n\n return [stain, color1, color2, color3];\n}\n\nfunction getGradients(colors) {\n var i, stain, color1, color2, color3,\n gradients = '';\n\n for (i = 0; i < colors.length; i++) {\n [stain, color1, color2, color3] = getStainAndColors(i, colors);\n gradients +=\n '';\n if (stain === 'gneg') {\n gradients +=\n '' +\n '' +\n '';\n } else {\n gradients +=\n '' +\n '' +\n '';\n }\n gradients +=\n '';\n }\n\n return gradients;\n}\n\n/**\n * Returns SVG gradients that give chromosomes a polished look\n */\nfunction getBandColorGradients() {\n var css,\n gradients = '';\n\n gradients = getGradients(staticColors);\n\n css = ``;\n\n gradients += staticGradients;\n gradients = '' + gradients + '';\n gradients = css + gradients;\n\n return gradients;\n}\n\nexport {\n drawBandLabels, getBandColorGradients, hideUnshownBandLabels, setBandsToShow,\n drawBandLabelText, drawBandLabelStalk\n};\n","\nfunction getDelimiterTsvLinesAndInit(source, content) {\n var delimiter, tsvLines, init;\n\n if (typeof chrBands === 'undefined' && source !== 'native') {\n delimiter = /\\t/;\n tsvLines = content.split(/\\r\\n|\\n/);\n init = 1;\n } else {\n delimiter = / /;\n tsvLines = content;\n init = 0;\n }\n\n return [delimiter, tsvLines, init];\n}\n\nfunction updateChromosomes(chromosomes) {\n var tmp, i;\n\n if (chromosomes instanceof Array && typeof chromosomes[0] === 'object') {\n tmp = [];\n for (i = 0; i < chromosomes.length; i++) {\n tmp.push(chromosomes[i].name);\n }\n chromosomes = tmp;\n }\n return chromosomes;\n}\n\nfunction getLineObject(chr, columns, stain, taxid) {\n return {\n chr: chr,\n bp: {\n start: parseInt(columns[5], 10),\n stop: parseInt(columns[6], 10)\n },\n iscn: {\n start: parseInt(columns[3], 10),\n stop: parseInt(columns[4], 10)\n },\n px: {\n start: -1,\n stop: -1,\n width: -1\n },\n name: columns[1] + columns[2],\n stain: stain,\n taxid: taxid\n };\n}\n\nfunction getStain(columns) {\n var stain = columns[7];\n // For e.g. acen and gvar, columns[8] (density) is undefined\n if (columns[8]) stain += columns[8];\n return stain;\n}\n\nfunction updateLines(lines, columns, taxid) {\n var chr, stain, line;\n\n chr = columns[0];\n if (chr in lines === false) lines[chr] = [];\n\n stain = getStain(columns);\n\n line = getLineObject(chr, columns, stain, taxid);\n lines[chr].push(line);\n\n return lines;\n}\n\n/**\n * Reports if a cytogenetic band should be included in parse results\n *\n * TODO:\n * Normalize ideogram.chromosomes upstream.\n *\n * This function is complex because ideogram.chromosomes is (likely\n * unnecessarily) complex. The \"ideogram.chromosomes\" object can\n * take many forms depending on the use case, and this results in\n * hard-to-reason-about functions like this.\n *\n * Normalizing ideogram.chromosomes to a common format somewhere upstream\n * would likely make this specific function and Ideogram in general much\n * more maintainable.\n */\nfunction shouldSkipBand(chrs, chr, taxid, ideo) {\n\n var hasChrs, chrsAreList, chrNotInList, chrsAreObject,\n innerChrsAreStrings, matchingChrObjs, chrNotInObject,\n multiorganism = ideo.config.multiorganism;\n\n hasChrs = typeof chrs !== 'undefined' && chrs !== null;\n if (!hasChrs) return false;\n\n chrsAreList = Array.isArray(chrs);\n chrNotInList = chrsAreList && chrs.indexOf(chr) === -1;\n chrsAreObject = typeof chrs === 'object';\n\n if (chrsAreList && !chrsAreObject && chrNotInList) return true;\n\n if (taxid in chrs === false && multiorganism) return false;\n\n if (!multiorganism) {\n // Encountered in single organism when showing subset of all chromosomes,\n // e.g. only human X and Y as in https://eweitz.github.io/ideogram/homology-basic\n matchingChrObjs = chrs.filter(thisChr => thisChr === chr);\n chrNotInObject = matchingChrObjs.length === 0;\n } else {\n innerChrsAreStrings = typeof chrs[taxid][0] === 'string';\n if (innerChrsAreStrings) {\n chrNotInObject = chrs[taxid].includes(chr) === false;\n } else {\n matchingChrObjs = chrs[taxid].filter(thisChr => thisChr.name === chr);\n chrNotInObject = matchingChrObjs.length === 0;\n }\n }\n return chrNotInObject;\n\n}\n\n/**\n * Parses cytogenetic band data from a TSV file, or, if band data is\n * prefetched, from an array\n *\n * NCBI:\n * #chromosome arm band iscn_start iscn_stop bp_start bp_stop stain density\n * ftp://ftp.ncbi.nlm.nih.gov/pub/gdp/ideogram_9606_GCF_000001305.14_550_V1\n */\nfunction parseBands(taxid, chromosomes, ideo) {\n var delimiter, tsvLines, columns, chr, i, init, source, content,\n lines = {};\n\n content = ideo.bandData[taxid];\n\n if (Array.isArray(content)) source = 'native';\n\n chromosomes = updateChromosomes(chromosomes);\n\n // Destructure assignment fails oddly when transpiled. 2019-05-23\n var result = getDelimiterTsvLinesAndInit(source, content);\n delimiter = result[0];\n tsvLines = result[1];\n init = result[2];\n\n for (i = init; i < tsvLines.length; i++) {\n columns = tsvLines[i].split(delimiter);\n\n chr = columns[0];\n if (shouldSkipBand(chromosomes, chr, taxid, ideo)) {\n // If specific chromosomes are configured, then skip processing all\n // other fetched chromosomes.\n continue;\n }\n\n lines = updateLines(lines, columns, taxid);\n }\n\n return lines;\n}\n\nexport {parseBands};\n","/**\n * @fileoverview Methods for processing chromosome length and banding data.\n *\n * Ideogram.js depicts chromosomes using data on their length, name, and\n * (if dealing with a very well-studied organism) cytogenetic banding data.\n * This file processes cytoband data that comes from biological research\n * institutions.\n *\n * For background on cytogenetic bands and how they are used in genomics, see:\n * https://ghr.nlm.nih.gov/primer/howgeneswork/genelocation\n *\n */\n\nimport {\n drawBandLabels, getBandColorGradients, hideUnshownBandLabels, setBandsToShow,\n drawBandLabelText, drawBandLabelStalk\n} from './draw';\nimport {parseBands} from './parse';\nimport {organismMetadata} from '../init/organism-metadata';\n\n/**\n * Gets bands array for given chromosomes, sets ideo.maxLength\n */\nfunction getBandsArray(chromosome, bandsByChr, taxid, ideo) {\n var bands, chrLength,\n bandsArray = [];\n\n bands = bandsByChr[chromosome];\n bandsArray.push(bands);\n\n chrLength = {\n iscn: bands[bands.length - 1].iscn.stop,\n bp: bands[bands.length - 1].bp.stop\n };\n\n if (taxid in ideo.maxLength === false) {\n ideo.maxLength[taxid] = {bp: 0, iscn: 0};\n }\n\n if (chrLength.iscn > ideo.maxLength[taxid].iscn) {\n ideo.maxLength[taxid].iscn = chrLength.iscn;\n if (chrLength.iscn > ideo.maxLength.iscn) {\n ideo.maxLength.iscn = chrLength.iscn;\n }\n }\n\n if (chrLength.bp > ideo.maxLength[taxid].bp) {\n ideo.maxLength[taxid].bp = chrLength.bp;\n if (chrLength.bp > ideo.maxLength.bp) {\n ideo.maxLength.bp = chrLength.bp;\n }\n }\n\n return bandsArray;\n}\n\n/**\n * Updates bandsArray, sets ideo.config.chromosomes and ideo.numChromosomes\n */\nfunction setChrsByTaxidsWithBands(taxid, chrs, bandsArray, ideo) {\n var bandsByChr, chromosome, k, chrBandsArray;\n\n bandsByChr = parseBands(taxid, chrs, ideo);\n\n chrs = Object.keys(bandsByChr).sort(Ideogram.sortChromosomes);\n\n if (\n 'chromosomes' in ideo.config === false ||\n ideo.config.chromosomes === null\n ) {\n ideo.config.chromosomes = {};\n }\n if (chrs.length > 0) {\n ideo.config.chromosomes[taxid] = chrs.slice();\n }\n ideo.numChromosomes += ideo.config.chromosomes[taxid].length;\n\n for (k = 0; k < chrs.length; k++) {\n chromosome = chrs[k];\n chrBandsArray = getBandsArray(chromosome, bandsByChr, taxid, ideo);\n bandsArray = bandsArray.concat(chrBandsArray);\n }\n\n return bandsArray;\n}\n\nfunction setChromosomesByTaxid(taxid, chrs, bandsArray, ideo) {\n var chr, i;\n\n if (\n taxid in ideo.bandData ||\n taxid in organismMetadata &&\n ideo.assemblyIsAccession() === false\n ) {\n bandsArray = setChrsByTaxidsWithBands(taxid, chrs, bandsArray, ideo);\n } else {\n // If lacking band-level data\n ideo.numChromosomes += chrs.length;\n\n for (i = 0; i < chrs.length; i++) {\n chr = chrs[i];\n if (chr.length > ideo.maxLength.bp) ideo.maxLength.bp = chr.length;\n }\n }\n\n return bandsArray;\n}\n\nfunction reportPerformance(t0, ideo) {\n var t1 = new Date().getTime();\n if (ideo.config.debug) {\n console.log('Time in processBandData: ' + (t1 - t0) + ' ms');\n }\n}\n\n/**\n * Completes default ideogram initialization by calling downstream functions\n * to process raw band data into full JSON objects, render chromosome and\n * cytoband figures and labels, apply initial graphical transformations,\n * hide overlapping band labels, and execute callbacks defined by client code\n */\nfunction processBandData(taxid) {\n var bandsArray, chrs,\n ideo = this,\n config = ideo.config,\n t0 = new Date().getTime();\n\n bandsArray = [];\n\n if ('chromosomes' in config) {\n if (config.multiorganism) {\n // Copy object\n chrs = config.chromosomes;\n } else if (taxid in config.chromosomes) {\n // Copy array by value\n chrs = config.chromosomes[taxid].slice();\n } else {\n // Copy array by value. Needed for e.g. \"Homology, basic\"\n chrs = config.chromosomes.slice();\n }\n }\n\n bandsArray = setChromosomesByTaxid(taxid, chrs, bandsArray, ideo);\n\n reportPerformance(t0, ideo);\n return [taxid, bandsArray];\n}\n\nexport {\n drawBandLabels, getBandColorGradients, processBandData,\n setBandsToShow, hideUnshownBandLabels, drawBandLabelText, drawBandLabelStalk\n};\n","/**\n * @fileoverview Methods to create and handle a brush on a chromosome.\n *\n * Ideogram.js enables users to display a box around part of a chromosome\n * that represents a \"currently selected\" region. The user can move this\n * box like a sliding window, e.g. by clicking and dragging the mouse.\n *\n * For background, see:\n * https://github.com/d3/d3-brush\n */\n\nimport {d3} from './lib';\n\n/**\n * Custom event handler, fired upon dragging sliding window on chromosome\n */\nfunction onBrushMove() {\n call(this.onBrushMoveCallback);\n}\n\nfunction onBrushEnd() {\n call(this.onBrushEndCallback);\n}\n\nfunction setBrush(bpDomain, pxRange, xOffset, width, ideo) {\n var xScale,\n length = ideo.config.chrHeight;\n\n xScale = d3.scaleLinear().domain(bpDomain).range(pxRange);\n\n ideo.brush = d3.brushX()\n .extent([[xOffset, 0], [length + xOffset, width]])\n .on('brush', _onBrushMove)\n .on('end', _onBrushEnd);\n\n function _onBrushMove({selection}) {\n var extent = selection.map(xScale.invert),\n from = Math.floor(extent[0]),\n to = Math.ceil(extent[1]);\n\n ideo.selectedRegion = {from: from, to: to, extent: (to - from)};\n\n if (ideo.onBrushMoveCallback) {\n ideo.onBrushMoveCallback();\n }\n }\n\n function _onBrushEnd({selection}) {\n if (ideo.onBrushEndCallback) {\n ideo.onBrushEndCallback();\n }\n }\n}\n\nfunction getBasePairDomainAndPixelRange(chrModel, xOffset) {\n var band, i,\n bpDomain = [1],\n pxRange = [1],\n lastBand = chrModel.bands.slice(-1)[0];\n\n for (i = 0; i < chrModel.bands.length; i++) {\n band = chrModel.bands[i];\n bpDomain.push(band.bp.start);\n pxRange.push(band.px.start + xOffset);\n }\n\n bpDomain.push(lastBand.bp.stop - 1);\n pxRange.push(lastBand.px.stop + xOffset);\n\n return [bpDomain, pxRange];\n}\n\n/**\n * Account for calls like createBrush('chr1:104325484-119977655')\n */\nfunction refineGenomicCoordinates(chr, from, to) {\n var nameSplit, fromToSplit;\n\n // Account for calls like createBrush('chr1:104325484-119977655')\n nameSplit = chr.split(':');\n fromToSplit = chr.split('-');\n if (nameSplit.length > 1 && fromToSplit.length > 1) {\n chr = nameSplit[0].replace('chr', '');\n fromToSplit = nameSplit[1].split('-');\n from = parseInt(fromToSplit[0]);\n to = parseInt(fromToSplit[1] - 1);\n }\n\n return [chr, from, to];\n}\n\nfunction getChrModel(chr, ideo) {\n var i, cm, chrModel;\n\n for (i = 0; i < ideo.chromosomesArray.length; i++) {\n cm = ideo.chromosomesArray[i];\n if (cm.name === chr) {\n chrModel = cm;\n return chrModel;\n }\n }\n}\n\nfunction writeBrush(chrModel, from, to, xOffset, width, ideo) {\n var x0, x1, yTranslate, yOffset;\n\n x0 = ideo.convertBpToPx(chrModel, from) + xOffset;\n x1 = ideo.convertBpToPx(chrModel, to) + xOffset;\n\n yTranslate = ideo._layout.getChromosomeSetYTranslate(0);\n yOffset = yTranslate + (ideo.config.chrWidth - width) / 2;\n\n d3.select(ideo.selector).append('g')\n .attr('class', 'brush')\n .attr('transform', 'translate(0, ' + yOffset + ')')\n .call(ideo.brush)\n .call(ideo.brush.move, [x0, x1]);\n}\n\nfunction setSelectedRegion(from, to, ideo) {\n // Genomics web UIs are 1-based, fully closed.\n // I.e. If start = 20 bp and stop = 10 bp, then extent = 11 bp.\n // Details:\n // http://genome.ucsc.edu/blog/the-ucsc-genome-browser-coordinate-counting-systems/\n // https://www.biostars.org/p/84686/\n var extent = to - from + 1;\n ideo.selectedRegion = {from: from, to: to, extent: extent};\n}\n\n/**\n * Creates a sliding window along a chromosome\n *\n * @param chr Chromosome name (e.g. 1) or range, e.g. chr1:104325484-119977655\n * @param from Genomic start coordinate in base pairs, e.g. 104325484\n * @param to Genomic end coordinate in base pairs, e.g. 119977655\n */\nfunction createBrush(chr, from, to) {\n var chrModel, chrLengthBp, bpDomain, pxRange, lastBand,\n ideo = this,\n width = ideo.config.chrWidth + 6.5,\n xOffset = ideo._layout.margin.left;\n\n [chr, from, to] = refineGenomicCoordinates(chr, from, to);\n\n chrModel = getChrModel(chr, ideo);\n\n [bpDomain, pxRange] = getBasePairDomainAndPixelRange(chrModel, xOffset);\n\n lastBand = chrModel.bands.slice(-1)[0];\n chrLengthBp = lastBand.bp.stop;\n\n if (typeof from === 'undefined') from = Math.floor(chrLengthBp / 10);\n if (typeof to === 'undefined') to = Math.ceil(from * 2);\n\n setBrush(bpDomain, pxRange, xOffset, width, ideo);\n\n setSelectedRegion(from, to, ideo);\n writeBrush(chrModel, from, to, xOffset, width, ideo);\n}\n\nexport {onBrushMove, onBrushEnd, createBrush};\n","/**\n * @fileoverview Allows a click event handler to be attached to the ideogram\n *\n * This works similar to the \"brush\" which allows a region to be selected.\n * The click handler does not allow a region, but a precise location.\n *\n */\n\nimport {d3} from './lib';\n\n/**\n * Custom event handler, fired upon clicks on the chromosome (to change\n * position)\n */\nfunction onCursorMove() {\n call(this.onCursorMoveCallback);\n}\n\nfunction setCursor(position, bpDomain, pxRange, xOffset, width, ideo) {\n var xScale;\n\n xScale = d3.scaleLinear().domain(bpDomain).range(pxRange);\n\n if (!('rotatable' in ideo.config && ideo.config.rotatable === false)) {\n console.warn('Using the cursor with rotate is not supported.');\n }\n\n var yTranslate = ideo._layout.getChromosomeSetYTranslate(0);\n var yOffset = yTranslate + (ideo.config.chrWidth - width) / 2;\n\n // TODO: check if newPosition is valid value (in range)\n\n var cursorBrush = d3.select(ideo.selector).append('g')\n .attr('class', 'brush')\n .attr('transform', 'translate(0, ' + yOffset + ')')\n .append('rect')\n .attr('class', 'cursor')\n .attr('x', xScale(position))\n .attr('y', 0)\n .attr('width', 1) // this could be a configuration param\n .attr('height', 30); // MAGIC NUMBER! need help with this one\n\n // call the callback for the first time (onLoad)\n if (ideo.onCursorMove) {\n ideo.onCursorMoveCallback(position);\n }\n\n if (!ideo.setCursorPosition) {\n ideo.setCursorPosition = function(newPosition) {\n // TODO: check if newPosition is valid value (in range)\n cursorBrush.attr('x', xScale(newPosition));\n if (ideo.onCursorMove) {\n ideo.onCursorMoveCallback(newPosition);\n }\n };\n }\n\n d3.selectAll(ideo.selector + ' .chromosome').on('click', function(event) {\n var x = event.offsetX; // minimum value seems to be 25\n\n // adjust for screen (6 is a magic number that seems to work)\n x -=6;\n\n // move the cursor\n cursorBrush.attr('x', x);\n\n // calculate the new position and perform callback\n var newPosition = Math.floor(xScale.invert(x));\n if (ideo.onCursorMove) {\n ideo.onCursorMoveCallback(newPosition);\n }\n });\n}\n\nfunction getBasePairDomainAndPixelRange(chrModel, xOffset) {\n var band, i,\n bpDomain = [1],\n pxRange = [1],\n lastBand = chrModel.bands.slice(-1)[0];\n\n for (i = 0; i < chrModel.bands.length; i++) {\n band = chrModel.bands[i];\n bpDomain.push(band.bp.start);\n pxRange.push(band.px.start + xOffset);\n }\n\n bpDomain.push(lastBand.bp.stop - 1);\n pxRange.push(lastBand.px.stop + xOffset);\n\n return [bpDomain, pxRange];\n}\n\nfunction getChrModel(chr, ideo) {\n var i, cm, chrModel;\n\n for (i = 0; i < ideo.chromosomesArray.length; i++) {\n cm = ideo.chromosomesArray[i];\n if (cm.name === chr) {\n chrModel = cm;\n return chrModel;\n }\n }\n}\n\n/**\n * Creates a clickable cursor along a chromosome.\n *\n * @param position Genomic start coordinate in base pairs, e.g. 104325484\n */\nfunction createClickCursor(position) {\n var chrModel, bpDomain,\n pxRange,\n ideo = this,\n width = ideo.config.chrWidth + 6.5, // 6.5 magic number?\n xOffset = ideo._layout.margin.left;\n\n if (typeof position === 'undefined') {\n return false;\n }\n\n chrModel = getChrModel(ideo.config.chromosome, ideo);\n [bpDomain, pxRange] = getBasePairDomainAndPixelRange(chrModel, xOffset);\n\n // call setCursor to complete the job.\n setCursor(position, bpDomain, pxRange, xOffset, width, ideo);\n}\n\nexport {onCursorMove, createClickCursor};\n","/**\n * @fileoverview Instance methods for sex chromosomes (allosomes).\n *\n * This module provides methods for drawing karyotypically normal\n * male and female mammalian genomes.\n */\n\n/**\n * Appends SVG elements depicting sex chromosomes to the document.\n */\nfunction drawSexChromosomes(container, chrIndex) {\n var bandsArray, taxid, chrs,\n sexChromosomeIndexes, sciLength,\n chromosome, bands, chrModel, sci, homologIndex;\n\n bandsArray = this.bandsArray;\n taxid = this.config.taxid;\n chrs = this.config.chromosomes[taxid];\n\n if (this.config.sex === 'male') {\n sexChromosomeIndexes = [1, 0];\n } else {\n sexChromosomeIndexes = [0, 0];\n }\n\n sciLength = sexChromosomeIndexes.length;\n\n for (homologIndex = 0; homologIndex < sciLength; homologIndex++) {\n sci = sexChromosomeIndexes[homologIndex] + chrIndex;\n chromosome = chrs[sci];\n bands = bandsArray[taxid][sci];\n chrModel = this.getChromosomeModel(bands, chromosome, taxid, sci);\n this.appendHomolog(chrModel, chrIndex, homologIndex, container);\n }\n}\n\n/**\n * Sets instance properties regarding sex chromosomes.\n * Currently only supported for mammals.\n * TODO: Support all sexually reproducing taxa\n * XY sex-determination (mammals):\n * - Male: XY <- heterogametic\n * - Female: XX\n * ZW sex-determination (birds):\n * - Male: ZZ\n * - Female: ZW <- heterogametic\n * X0 sex-determination (some insects):\n * - Male: X0, i.e. only X <- heterogametic?\n * - Female: XX\n * TODO: Support sex chromosome aneuploidies in mammals\n * - Turner syndrome: X0\n * - Klinefelter syndome: XXY\n * More types:\n * https://en.wikipedia.org/wiki/Category:Sex_chromosome_aneuploidies\n */\nfunction setSexChromosomes(chrs) {\n var chr, i,\n ideo = this,\n sexChrs = {X: 1, Y: 1};\n\n if (this.config.ploidy !== 2 || !this.config.sex) return;\n\n ideo.sexChromosomes.list = [];\n\n for (i = 0; i < chrs.length; i++) {\n chr = chrs[i];\n if (ideo.config.sex === 'male' && chr in sexChrs) {\n ideo.sexChromosomes.list.push(chr);\n if (!ideo.sexChromosomes.index) {\n ideo.sexChromosomes.index = i;\n }\n } else if (chr === 'X') {\n ideo.sexChromosomes.list.push(chr, chr);\n ideo.sexChromosomes.index = i;\n }\n }\n}\n\nexport {drawSexChromosomes, setSexChromosomes};\n","/**\n * @fileoverview Methods to convert to and from different types of coordinates.\n *\n * Ideogram.js uses multiple coordinate systems, e.g. base pairs (bp) and\n * pixels (px). These methods interconvert between those coordinate systems.\n *\n * TODO:\n * - Add methods to interconvert between ISCN coordinates and base pairs,\n * pixels.\n */\n\nfunction throwBpToPxError(bp, chr, band) {\n throw new Error(\n 'Base pair out of range. ' +\n 'bp: ' + bp + '; length of chr' + chr.name + ': ' + band.bp.stop\n );\n}\n\nfunction getPx(chr, bp) {\n var i, px, band, bpToIscnScale, iscn, iscnStart, iscnStop, iscnLength,\n bpStart, bpStop, bpLength, pxStart, pxLength;\n\n for (i = 0; i < chr.bands.length; i++) {\n band = chr.bands[i];\n bpStart = band.bp.start;\n bpStop = band.bp.stop;\n bpLength = bpStop - bpStart;\n iscnStart = band.iscn.start;\n iscnStop = band.iscn.stop;\n iscnLength = iscnStop - iscnStart;\n pxStart = band.px.start;\n pxLength = band.px.width;\n\n if (bp >= bpStart && bp <= bpStop) {\n bpToIscnScale = iscnLength / bpLength;\n iscn = iscnStart + (bp - bpStart) * bpToIscnScale;\n px = pxStart + (pxLength * (iscn - iscnStart) / (iscnLength));\n\n return [px, band];\n }\n }\n return [null, band];\n}\n\n/**\n * Converts base pair coordinates to pixel offsets.\n * Bp-to-pixel scales differ among cytogenetic bands.\n *\n * For example, if we want to depict a gene on a chromosome, then we need\n * to convert the gene's location in base pairs to a location in pixels offset\n * from the start of the chromosome.\n */\nfunction convertBpToPx(chr, bp) {\n var band, px;\n\n if (chr.bands.length > 1 || chr.name === 'MT') {\n [px, band] = getPx(chr, bp);\n if (px !== null) return px;\n } else if (bp >= 1 && bp <= chr.length) {\n px = chr.scale.bp * bp;\n return px;\n }\n\n throwBpToPxError(bp, chr, band);\n}\n\nfunction throwPxToBpError(px, chr, pxStop) {\n throw new Error(\n 'Pixel out of range. ' +\n 'px: ' + px + '; length of chr' + chr.name + ': ' + pxStop\n );\n}\n\nfunction getBp(iscnStop, iscnStart, px, pxStop, pxStart, band, iscnLength) {\n var pxLength, bpLength, pxToIscnScale, iscn, bp;\n\n iscnLength = iscnStop - iscnStart;\n pxLength = pxStop - pxStart;\n bpLength = band.bp.stop - band.bp.start;\n\n pxToIscnScale = iscnLength / pxLength;\n iscn = iscnStart + (px - pxStart) * pxToIscnScale;\n\n bp = band.bp.start + (bpLength * (iscn - iscnStart) / iscnLength);\n\n return Math.round(bp);\n}\n\n/**\n * Converts pixel offsets to base pair coordinates.\n * Pixel-to-bp scales differ among cytogenetic bands.\n *\n * For example, if we want to determine the genomic location a user clicked on\n * (e.g. when creating a brush / sliding window region), then we need to\n * convert pixels to base pairs.\n */\nfunction convertPxToBp(chr, px) {\n var i, band, bp, pxStart, pxStop, iscnStart, iscnStop, iscnLength;\n\n if (px === 0) {\n px = chr.bands[0].px.start;\n }\n\n for (i = 0; i < chr.bands.length; i++) {\n band = chr.bands[i];\n\n pxStart = band.px.start;\n pxStop = band.px.stop;\n iscnStart = band.iscn.start;\n iscnStop = band.iscn.stop;\n\n if (px >= pxStart && px <= pxStop) {\n bp = getBp(iscnStop, iscnStart, px, pxStop, pxStart, band, iscnLength);\n return bp;\n }\n }\n throwPxToBpError(px, chr, pxStop);\n}\n\nexport {convertBpToPx, convertPxToBp};\n","let array8 = arrayUntyped,\n array16 = arrayUntyped,\n array32 = arrayUntyped,\n arrayLengthen = arrayLengthenUntyped,\n arrayWiden = arrayWidenUntyped;\nif (typeof Uint8Array !== \"undefined\") {\n array8 = function(n) { return new Uint8Array(n); };\n array16 = function(n) { return new Uint16Array(n); };\n array32 = function(n) { return new Uint32Array(n); };\n\n arrayLengthen = function(array, length) {\n if (array.length >= length) return array;\n var copy = new array.constructor(length);\n copy.set(array);\n return copy;\n };\n\n arrayWiden = function(array, width) {\n var copy;\n switch (width) {\n case 16: copy = array16(array.length); break;\n case 32: copy = array32(array.length); break;\n default: throw new Error(\"invalid array width!\");\n }\n copy.set(array);\n return copy;\n };\n}\n\nfunction arrayUntyped(n) {\n var array = new Array(n), i = -1;\n while (++i < n) array[i] = 0;\n return array;\n}\n\nfunction arrayLengthenUntyped(array, length) {\n var n = array.length;\n while (n < length) array[n++] = 0;\n return array;\n}\n\nfunction arrayWidenUntyped(array, width) {\n if (width > 32) throw new Error(\"invalid array width!\");\n return array;\n}\n\n// An arbitrarily-wide array of bitmasks\nfunction bitarray(n) {\n this.length = n;\n this.subarrays = 1;\n this.width = 8;\n this.masks = {\n 0: 0\n }\n\n this[0] = array8(n);\n}\n\nbitarray.prototype.lengthen = function(n) {\n var i, len;\n for (i = 0, len = this.subarrays; i < len; ++i) {\n this[i] = arrayLengthen(this[i], n);\n }\n this.length = n;\n};\n\n// Reserve a new bit index in the array, returns {offset, one}\nbitarray.prototype.add = function() {\n var m, w, one, i, len;\n\n for (i = 0, len = this.subarrays; i < len; ++i) {\n m = this.masks[i];\n w = this.width - (32 * i);\n // isolate the rightmost zero bit and return it as an unsigned int of 32 bits, if NaN or -1, return a 0 \n one = (~m & (m + 1)) >>> 0;\n\n if (w >= 32 && !one) {\n continue;\n }\n\n if (w < 32 && (one & (1 << w))) {\n // widen this subarray\n this[i] = arrayWiden(this[i], w <<= 1);\n this.width = 32 * i + w;\n }\n\n this.masks[i] |= one;\n\n return {\n offset: i,\n one: one\n };\n }\n\n // add a new subarray\n this[this.subarrays] = array8(this.length);\n this.masks[this.subarrays] = 1;\n this.width += 8;\n return {\n offset: this.subarrays++,\n one: 1\n };\n};\n\n// Copy record from index src to index dest\nbitarray.prototype.copy = function(dest, src) {\n var i, len;\n for (i = 0, len = this.subarrays; i < len; ++i) {\n this[i][dest] = this[i][src];\n }\n};\n\n// Truncate the array to the given length\nbitarray.prototype.truncate = function(n) {\n var i, len;\n for (i = 0, len = this.subarrays; i < len; ++i) {\n for (var j = this.length - 1; j >= n; j--) {\n this[i][j] = 0;\n }\n }\n this.length = n;\n};\n\n// Checks that all bits for the given index are 0\nbitarray.prototype.zero = function(n) {\n var i, len;\n for (i = 0, len = this.subarrays; i < len; ++i) {\n if (this[i][n]) {\n return false;\n }\n }\n return true;\n};\n\n// Checks that all bits for the given index are 0 except for possibly one\nbitarray.prototype.zeroExcept = function(n, offset, zero) {\n var i, len;\n for (i = 0, len = this.subarrays; i < len; ++i) {\n if (i === offset ? this[i][n] & zero : this[i][n]) {\n return false;\n }\n }\n return true;\n};\n\n// Checks that all bits for the given index are 0 except for the specified mask.\n// The mask should be an array of the same size as the filter subarrays width.\nbitarray.prototype.zeroExceptMask = function(n, mask) {\n var i, len;\n for (i = 0, len = this.subarrays; i < len; ++i) {\n if (this[i][n] & mask[i]) {\n return false;\n }\n }\n return true;\n}\n\n// Checks that only the specified bit is set for the given index\nbitarray.prototype.only = function(n, offset, one) {\n var i, len;\n for (i = 0, len = this.subarrays; i < len; ++i) {\n if (this[i][n] != (i === offset ? one : 0)) {\n return false;\n }\n }\n return true;\n};\n\n// Checks that only the specified bit is set for the given index except for possibly one other\nbitarray.prototype.onlyExcept = function(n, offset, zero, onlyOffset, onlyOne) {\n var mask;\n var i, len;\n for (i = 0, len = this.subarrays; i < len; ++i) {\n mask = this[i][n];\n if (i === offset)\n mask &= zero;\n if (mask != (i === onlyOffset ? onlyOne : 0)) {\n return false;\n }\n }\n return true;\n};\n\nexport default {\n array8: arrayUntyped,\n array16: arrayUntyped,\n array32: arrayUntyped,\n arrayLengthen: arrayLengthenUntyped,\n arrayWiden: arrayWidenUntyped,\n bitarray: bitarray\n};\n","const filterExact = (bisect, value) => {\n return function(values) {\n var n = values.length;\n return [bisect.left(values, value, 0, n), bisect.right(values, value, 0, n)];\n };\n}\n\nconst filterRange = (bisect, range) => {\n var min = range[0],\n max = range[1];\n return function(values) {\n var n = values.length;\n return [bisect.left(values, min, 0, n), bisect.left(values, max, 0, n)];\n };\n}\n\nconst filterAll = values => {\n return [0, values.length];\n}\n\nexport default {\n filterExact,\n filterRange,\n filterAll\n};\n","export default d => {\n return d;\n};\n","export default () => {\n return null;\n}\n","export default () => {\n return 0;\n}\n","import identity from './identity';\n\nfunction heap_by(f) {\n\n // Builds a binary heap within the specified array a[lo:hi]. The heap has the\n // property such that the parent a[lo+i] is always less than or equal to its\n // two children: a[lo+2*i+1] and a[lo+2*i+2].\n function heap(a, lo, hi) {\n var n = hi - lo,\n i = (n >>> 1) + 1;\n while (--i > 0) sift(a, i, n, lo);\n return a;\n }\n\n // Sorts the specified array a[lo:hi] in descending order, assuming it is\n // already a heap.\n function sort(a, lo, hi) {\n var n = hi - lo,\n t;\n while (--n > 0) t = a[lo], a[lo] = a[lo + n], a[lo + n] = t, sift(a, 1, n, lo);\n return a;\n }\n\n // Sifts the element a[lo+i-1] down the heap, where the heap is the contiguous\n // slice of array a[lo:lo+n]. This method can also be used to update the heap\n // incrementally, without incurring the full cost of reconstructing the heap.\n function sift(a, i, n, lo) {\n var d = a[--lo + i],\n x = f(d),\n child;\n while ((child = i << 1) <= n) {\n if (child < n && f(a[lo + child]) > f(a[lo + child + 1])) child++;\n if (x <= f(a[lo + child])) break;\n a[lo + i] = a[lo + child];\n i = child;\n }\n a[lo + i] = d;\n }\n\n heap.sort = sort;\n return heap;\n}\n\nconst h = heap_by(identity);\nh.by = heap_by;\n\nexport default h;\n","import identity from './identity';\nimport xFilterHeap from './heap';\n\nfunction heapselect_by(f) {\n var heap = xFilterHeap.by(f);\n\n // Returns a new array containing the top k elements in the array a[lo:hi].\n // The returned array is not sorted, but maintains the heap property. If k is\n // greater than hi - lo, then fewer than k elements will be returned. The\n // order of elements in a is unchanged by this operation.\n function heapselect(a, lo, hi, k) {\n var queue = new Array(k = Math.min(hi - lo, k)),\n min,\n i,\n d;\n\n for (i = 0; i < k; ++i) queue[i] = a[lo++];\n heap(queue, 0, k);\n\n if (lo < hi) {\n min = f(queue[0]);\n do {\n if (f(d = a[lo]) > min) {\n queue[0] = d;\n min = f(heap(queue, 0, k)[0]);\n }\n } while (++lo < hi);\n }\n\n return queue;\n }\n\n return heapselect;\n}\n\n\nconst h = heapselect_by(identity);\nh.by = heapselect_by; // assign the raw function to the export as well\n\nexport default h;\n","import identity from './identity';\n\nfunction bisect_by(f) {\n\n // Locate the insertion point for x in a to maintain sorted order. The\n // arguments lo and hi may be used to specify a subset of the array which\n // should be considered; by default the entire array is used. If x is already\n // present in a, the insertion point will be before (to the left of) any\n // existing entries. The return value is suitable for use as the first\n // argument to `array.splice` assuming that a is already sorted.\n //\n // The returned insertion point i partitions the array a into two halves so\n // that all v < x for v in a[lo:i] for the left side and all v >= x for v in\n // a[i:hi] for the right side.\n function bisectLeft(a, x, lo, hi) {\n while (lo < hi) {\n var mid = lo + hi >>> 1;\n if (f(a[mid]) < x) lo = mid + 1;\n else hi = mid;\n }\n return lo;\n }\n\n // Similar to bisectLeft, but returns an insertion point which comes after (to\n // the right of) any existing entries of x in a.\n //\n // The returned insertion point i partitions the array into two halves so that\n // all v <= x for v in a[lo:i] for the left side and all v > x for v in\n // a[i:hi] for the right side.\n function bisectRight(a, x, lo, hi) {\n while (lo < hi) {\n var mid = lo + hi >>> 1;\n if (x < f(a[mid])) hi = mid;\n else lo = mid + 1;\n }\n return lo;\n }\n\n bisectRight.right = bisectRight;\n bisectRight.left = bisectLeft;\n return bisectRight;\n}\n\nconst bisect = bisect_by(identity);\nbisect.by = bisect_by; // assign the raw function to the export as well\n\nexport default bisect;\n\n","export default (array, index, deep) => {\n for (var i = 0, n = index.length, copy = deep ? JSON.parse(JSON.stringify(array)) : new Array(n); i < n; ++i) {\n copy[i] = array[index[i]];\n }\n return copy;\n}\n","const reduceIncrement = p => {\n return p + 1;\n}\n\nconst reduceDecrement = p => {\n return p - 1;\n}\n\nconst reduceAdd = f => {\n return function(p, v) {\n return p + +f(v);\n };\n}\n\nconst reduceSubtract = f => {\n return function(p, v) {\n return p - f(v);\n };\n}\n\nexport default {\n reduceIncrement,\n reduceDecrement,\n reduceAdd,\n reduceSubtract\n};\n","import deep from \"@ranfdev/deepobj\"\n// Note(cg): result was previsouly using lodash.result, not ESM compatible.\n \nconst get = (obj, prop) => {\n const value = obj[prop];\n return (typeof value === 'function') ? value.call(obj) : value;\n}\n\n/**\n * get value of object at a deep path.\n * if the resolved value is a function,\n * it's invoked with the `this` binding of \n * its parent object and its result is returned. \n * \n * @param {Object} obj the object (e.g. { 'a': [{ 'b': { 'c1': 3, 'c2': 4} }], 'd': {e:1} }; )\n * @param {String} path deep path (e.g. `d.e`` or `a[0].b.c1`. Dot notation (a.0.b)is also supported)\n * @return {Any} the resolved value\n */\nconst reg = /\\[([\\w\\d]+)\\]/g;\nexport default (obj, path) => {\n return deep(get, obj, path.replace(reg, '.$1'))\n}\n","export default function(t,e,i,n,r){for(r in n=(i=i.split(\".\")).splice(-1,1),i)e=e[i[r]]=e[i[r]]||{};return t(e,n)};\n//# sourceMappingURL=deepobj.m.js.map\n","import xfilterArray from './array';\nimport xfilterFilter from './filter';\nimport cr_identity from './identity';\nimport cr_null from './null';\nimport cr_zero from './zero';\nimport xfilterHeapselect from './heapselect';\nimport xfilterHeap from './heap';\nimport bisect from './bisect';\nimport permute from './permute';\nimport xfilterReduce from './reduce';\nimport result from './result';\n\n// constants\nvar REMOVED_INDEX = -1;\n\ncrossfilter.heap = xfilterHeap;\ncrossfilter.heapselect = xfilterHeapselect;\ncrossfilter.bisect = bisect;\ncrossfilter.permute = permute;\nexport default crossfilter;\n\nfunction crossfilter() {\n var crossfilter = {\n add: add,\n remove: removeData,\n dimension: dimension,\n groupAll: groupAll,\n size: size,\n all: all,\n allFiltered: allFiltered,\n onChange: onChange,\n isElementFiltered: isElementFiltered\n };\n\n var data = [], // the records\n n = 0, // the number of records; data.length\n filters, // 1 is filtered out\n filterListeners = [], // when the filters change\n dataListeners = [], // when data is added\n removeDataListeners = [], // when data is removed\n callbacks = [];\n\n filters = new xfilterArray.bitarray(0);\n\n // Adds the specified new records to this crossfilter.\n function add(newData) {\n var n0 = n,\n n1 = newData.length;\n\n // If there's actually new data to add…\n // Merge the new data into the existing data.\n // Lengthen the filter bitset to handle the new records.\n // Notify listeners (dimensions and groups) that new data is available.\n if (n1) {\n data = data.concat(newData);\n filters.lengthen(n += n1);\n dataListeners.forEach(function(l) { l(newData, n0, n1); });\n triggerOnChange('dataAdded');\n }\n\n return crossfilter;\n }\n\n // Removes all records that match the current filters, or if a predicate function is passed,\n // removes all records matching the predicate (ignoring filters).\n function removeData(predicate) {\n var // Mapping from old record indexes to new indexes (after records removed)\n newIndex = new Array(n),\n removed = [],\n usePred = typeof predicate === 'function',\n shouldRemove = function (i) {\n return usePred ? predicate(data[i], i) : filters.zero(i)\n };\n\n for (var index1 = 0, index2 = 0; index1 < n; ++index1) {\n if ( shouldRemove(index1) ) {\n removed.push(index1);\n newIndex[index1] = REMOVED_INDEX;\n } else {\n newIndex[index1] = index2++;\n }\n }\n\n // Remove all matching records from groups.\n filterListeners.forEach(function(l) { l(-1, -1, [], removed, true); });\n\n // Update indexes.\n removeDataListeners.forEach(function(l) { l(newIndex); });\n\n // Remove old filters and data by overwriting.\n for (var index3 = 0, index4 = 0; index3 < n; ++index3) {\n if ( newIndex[index3] !== REMOVED_INDEX ) {\n if (index3 !== index4) filters.copy(index4, index3), data[index4] = data[index3];\n ++index4;\n }\n }\n\n data.length = n = index4;\n filters.truncate(index4);\n triggerOnChange('dataRemoved');\n }\n\n function maskForDimensions(dimensions) {\n var n,\n d,\n len,\n id,\n mask = Array(filters.subarrays);\n for (n = 0; n < filters.subarrays; n++) { mask[n] = ~0; }\n for (d = 0, len = dimensions.length; d < len; d++) {\n // The top bits of the ID are the subarray offset and the lower bits are the bit\n // offset of the \"one\" mask.\n id = dimensions[d].id();\n mask[id >> 7] &= ~(0x1 << (id & 0x3f));\n }\n return mask;\n }\n\n // Return true if the data element at index i is filtered IN.\n // Optionally, ignore the filters of any dimensions in the ignore_dimensions list.\n function isElementFiltered(i, ignore_dimensions) {\n var mask = maskForDimensions(ignore_dimensions || []);\n return filters.zeroExceptMask(i,mask);\n }\n\n // Adds a new dimension with the specified value accessor function.\n function dimension(value, iterable) {\n\n if (typeof value === 'string') {\n var accessorPath = value;\n value = function(d) { return result(d, accessorPath); };\n }\n\n var dimension = {\n filter: filter,\n filterExact: filterExact,\n filterRange: filterRange,\n filterFunction: filterFunction,\n filterAll: filterAll,\n currentFilter: currentFilter,\n hasCurrentFilter: hasCurrentFilter,\n top: top,\n bottom: bottom,\n group: group,\n groupAll: groupAll,\n dispose: dispose,\n remove: dispose, // for backwards-compatibility\n accessor: value,\n id: function() { return id; }\n };\n\n var one, // lowest unset bit as mask, e.g., 00001000\n zero, // inverted one, e.g., 11110111\n offset, // offset into the filters arrays\n id, // unique ID for this dimension (reused when dimensions are disposed)\n values, // sorted, cached array\n index, // maps sorted value index -> record index (in data)\n newValues, // temporary array storing newly-added values\n newIndex, // temporary array storing newly-added index\n iterablesIndexCount,\n iterablesIndexFilterStatus,\n iterablesEmptyRows = [],\n sortRange = function(n) {\n return cr_range(n).sort(function(A, B) {\n var a = newValues[A], b = newValues[B];\n return a < b ? -1 : a > b ? 1 : A - B;\n });\n },\n refilter = xfilterFilter.filterAll, // for recomputing filter\n refilterFunction, // the custom filter function in use\n filterValue, // the value used for filtering (value, array, function or undefined)\n filterValuePresent, // true if filterValue contains something\n indexListeners = [], // when data is added\n dimensionGroups = [],\n lo0 = 0,\n hi0 = 0,\n t = 0,\n k;\n\n // Updating a dimension is a two-stage process. First, we must update the\n // associated filters for the newly-added records. Once all dimensions have\n // updated their filters, the groups are notified to update.\n dataListeners.unshift(preAdd);\n dataListeners.push(postAdd);\n\n removeDataListeners.push(removeData);\n\n // Add a new dimension in the filter bitmap and store the offset and bitmask.\n var tmp = filters.add();\n offset = tmp.offset;\n one = tmp.one;\n zero = ~one;\n\n // Create a unique ID for the dimension\n // IDs will be re-used if dimensions are disposed.\n // For internal use the ID is the subarray offset shifted left 7 bits or'd with the\n // bit offset of the set bit in the dimension's \"one\" mask.\n id = (offset << 7) | (Math.log(one) / Math.log(2));\n\n preAdd(data, 0, n);\n postAdd(data, 0, n);\n\n // Incorporates the specified new records into this dimension.\n // This function is responsible for updating filters, values, and index.\n function preAdd(newData, n0, n1) {\n var newIterablesIndexCount,\n newIterablesIndexFilterStatus;\n\n if (iterable){\n // Count all the values\n t = 0;\n j = 0;\n k = [];\n\n for (var i0 = 0; i0 < newData.length; i0++) {\n for(j = 0, k = value(newData[i0]); j < k.length; j++) {\n t++;\n }\n }\n\n newValues = [];\n newIterablesIndexCount = cr_range(newData.length);\n newIterablesIndexFilterStatus = cr_index(t,1);\n var unsortedIndex = cr_range(t);\n\n for (var l = 0, index1 = 0; index1 < newData.length; index1++) {\n k = value(newData[index1])\n //\n if(!k.length){\n newIterablesIndexCount[index1] = 0;\n iterablesEmptyRows.push(index1 + n0);\n continue;\n }\n newIterablesIndexCount[index1] = k.length\n for (j = 0; j < k.length; j++) {\n newValues.push(k[j]);\n unsortedIndex[l] = index1;\n l++;\n }\n }\n\n // Create the Sort map used to sort both the values and the valueToData indices\n var sortMap = sortRange(t);\n\n // Use the sortMap to sort the newValues\n newValues = permute(newValues, sortMap);\n\n\n // Use the sortMap to sort the unsortedIndex map\n // newIndex should be a map of sortedValue -> crossfilterData\n newIndex = permute(unsortedIndex, sortMap)\n\n } else{\n // Permute new values into natural order using a standard sorted index.\n newValues = newData.map(value);\n newIndex = sortRange(n1);\n newValues = permute(newValues, newIndex);\n }\n\n // Bisect newValues to determine which new records are selected.\n var bounds = refilter(newValues), lo1 = bounds[0], hi1 = bounds[1];\n\n var index2, index3, index4;\n if(iterable) {\n n1 = t;\n if (refilterFunction) {\n for (index2 = 0; index2 < n1; ++index2) {\n if (!refilterFunction(newValues[index2], index2)) {\n if(--newIterablesIndexCount[newIndex[index2]] === 0) {\n filters[offset][newIndex[index2] + n0] |= one;\n }\n newIterablesIndexFilterStatus[index2] = 1;\n }\n }\n } else {\n for (index3 = 0; index3 < lo1; ++index3) {\n if(--newIterablesIndexCount[newIndex[index3]] === 0) {\n filters[offset][newIndex[index3] + n0] |= one;\n }\n newIterablesIndexFilterStatus[index3] = 1;\n }\n for (index4 = hi1; index4 < n1; ++index4) {\n if(--newIterablesIndexCount[newIndex[index4]] === 0) {\n filters[offset][newIndex[index4] + n0] |= one;\n }\n newIterablesIndexFilterStatus[index4] = 1;\n }\n }\n } else {\n if (refilterFunction) {\n for (index2 = 0; index2 < n1; ++index2) {\n if (!refilterFunction(newValues[index2], index2)) {\n filters[offset][newIndex[index2] + n0] |= one;\n }\n }\n } else {\n for (index3 = 0; index3 < lo1; ++index3) {\n filters[offset][newIndex[index3] + n0] |= one;\n }\n for (index4 = hi1; index4 < n1; ++index4) {\n filters[offset][newIndex[index4] + n0] |= one;\n }\n }\n }\n\n // If this dimension previously had no data, then we don't need to do the\n // more expensive merge operation; use the new values and index as-is.\n if (!n0) {\n values = newValues;\n index = newIndex;\n iterablesIndexCount = newIterablesIndexCount;\n iterablesIndexFilterStatus = newIterablesIndexFilterStatus;\n lo0 = lo1;\n hi0 = hi1;\n return;\n }\n\n\n\n var oldValues = values,\n oldIndex = index,\n oldIterablesIndexFilterStatus = iterablesIndexFilterStatus,\n old_n0,\n i1 = 0;\n\n i0 = 0;\n\n if(iterable){\n old_n0 = n0\n n0 = oldValues.length;\n n1 = t\n }\n\n // Otherwise, create new arrays into which to merge new and old.\n values = iterable ? new Array(n0 + n1) : new Array(n);\n index = iterable ? new Array(n0 + n1) : cr_index(n, n);\n if(iterable) iterablesIndexFilterStatus = cr_index(n0 + n1, 1);\n\n // Concatenate the newIterablesIndexCount onto the old one.\n if(iterable) {\n var oldiiclength = iterablesIndexCount.length;\n iterablesIndexCount = xfilterArray.arrayLengthen(iterablesIndexCount, n);\n for(var j=0; j+oldiiclength < n; j++) {\n iterablesIndexCount[j+oldiiclength] = newIterablesIndexCount[j];\n }\n }\n\n // Merge the old and new sorted values, and old and new index.\n var index5 = 0;\n for (; i0 < n0 && i1 < n1; ++index5) {\n if (oldValues[i0] < newValues[i1]) {\n values[index5] = oldValues[i0];\n if(iterable) iterablesIndexFilterStatus[index5] = oldIterablesIndexFilterStatus[i0];\n index[index5] = oldIndex[i0++];\n } else {\n values[index5] = newValues[i1];\n if(iterable) iterablesIndexFilterStatus[index5] = newIterablesIndexFilterStatus[i1];\n index[index5] = newIndex[i1++] + (iterable ? old_n0 : n0);\n }\n }\n\n // Add any remaining old values.\n for (; i0 < n0; ++i0, ++index5) {\n values[index5] = oldValues[i0];\n if(iterable) iterablesIndexFilterStatus[index5] = oldIterablesIndexFilterStatus[i0];\n index[index5] = oldIndex[i0];\n }\n\n // Add any remaining new values.\n for (; i1 < n1; ++i1, ++index5) {\n values[index5] = newValues[i1];\n if(iterable) iterablesIndexFilterStatus[index5] = newIterablesIndexFilterStatus[i1];\n index[index5] = newIndex[i1] + (iterable ? old_n0 : n0);\n }\n\n // Bisect again to recompute lo0 and hi0.\n bounds = refilter(values), lo0 = bounds[0], hi0 = bounds[1];\n }\n\n // When all filters have updated, notify index listeners of the new values.\n function postAdd(newData, n0, n1) {\n indexListeners.forEach(function(l) { l(newValues, newIndex, n0, n1); });\n newValues = newIndex = null;\n }\n\n function removeData(reIndex) {\n if (iterable) {\n for (var i0 = 0, i1 = 0; i0 < iterablesEmptyRows.length; i0++) {\n if (reIndex[iterablesEmptyRows[i0]] !== REMOVED_INDEX) {\n iterablesEmptyRows[i1] = reIndex[iterablesEmptyRows[i0]];\n i1++;\n }\n }\n iterablesEmptyRows.length = i1;\n for (i0 = 0, i1 = 0; i0 < n; i0++) {\n if (reIndex[i0] !== REMOVED_INDEX) {\n if (i1 !== i0) iterablesIndexCount[i1] = iterablesIndexCount[i0];\n i1++;\n }\n }\n iterablesIndexCount = iterablesIndexCount.slice(0, i1);\n }\n // Rewrite our index, overwriting removed values\n var n0 = values.length;\n for (var i = 0, j = 0, oldDataIndex; i < n0; ++i) {\n oldDataIndex = index[i];\n if (reIndex[oldDataIndex] !== REMOVED_INDEX) {\n if (i !== j) values[j] = values[i];\n index[j] = reIndex[oldDataIndex];\n if (iterable) {\n iterablesIndexFilterStatus[j] = iterablesIndexFilterStatus[i];\n }\n ++j;\n }\n }\n values.length = j;\n if (iterable) iterablesIndexFilterStatus = iterablesIndexFilterStatus.slice(0, j);\n while (j < n0) index[j++] = 0;\n\n // Bisect again to recompute lo0 and hi0.\n var bounds = refilter(values);\n lo0 = bounds[0], hi0 = bounds[1];\n }\n\n // Updates the selected values based on the specified bounds [lo, hi].\n // This implementation is used by all the public filter methods.\n function filterIndexBounds(bounds) {\n\n var lo1 = bounds[0],\n hi1 = bounds[1];\n\n if (refilterFunction) {\n refilterFunction = null;\n filterIndexFunction(function(d, i) { return lo1 <= i && i < hi1; }, bounds[0] === 0 && bounds[1] === values.length);\n lo0 = lo1;\n hi0 = hi1;\n return dimension;\n }\n\n var i,\n j,\n k,\n added = [],\n removed = [],\n valueIndexAdded = [],\n valueIndexRemoved = [];\n\n\n // Fast incremental update based on previous lo index.\n if (lo1 < lo0) {\n for (i = lo1, j = Math.min(lo0, hi1); i < j; ++i) {\n added.push(index[i]);\n valueIndexAdded.push(i);\n }\n } else if (lo1 > lo0) {\n for (i = lo0, j = Math.min(lo1, hi0); i < j; ++i) {\n removed.push(index[i]);\n valueIndexRemoved.push(i);\n }\n }\n\n // Fast incremental update based on previous hi index.\n if (hi1 > hi0) {\n for (i = Math.max(lo1, hi0), j = hi1; i < j; ++i) {\n added.push(index[i]);\n valueIndexAdded.push(i);\n }\n } else if (hi1 < hi0) {\n for (i = Math.max(lo0, hi1), j = hi0; i < j; ++i) {\n removed.push(index[i]);\n valueIndexRemoved.push(i);\n }\n }\n\n if(!iterable) {\n // Flip filters normally.\n\n for(i=0; i 0) toSkip = top_offset;\n\n while (--i >= lo0 && k > 0) {\n if (filters.zero(j = index[i])) {\n if(toSkip > 0) {\n //skip matching row\n --toSkip;\n } else {\n array.push(data[j]);\n --k;\n }\n }\n }\n\n if(iterable){\n for(i = 0; i < iterablesEmptyRows.length && k > 0; i++) {\n // Add row with empty iterable column at the end\n if(filters.zero(j = iterablesEmptyRows[i])) {\n if(toSkip > 0) {\n //skip matching row\n --toSkip;\n } else {\n array.push(data[j]);\n --k;\n }\n }\n }\n }\n\n return array;\n }\n\n // Returns the bottom K selected records based on this dimension's order.\n // Note: observes this dimension's filter, unlike group and groupAll.\n function bottom(k, bottom_offset) {\n var array = [],\n i,\n j,\n toSkip = 0;\n\n if(bottom_offset && bottom_offset > 0) toSkip = bottom_offset;\n\n if(iterable) {\n // Add row with empty iterable column at the top\n for(i = 0; i < iterablesEmptyRows.length && k > 0; i++) {\n if(filters.zero(j = iterablesEmptyRows[i])) {\n if(toSkip > 0) {\n //skip matching row\n --toSkip;\n } else {\n array.push(data[j]);\n --k;\n }\n }\n }\n }\n\n i = lo0;\n\n while (i < hi0 && k > 0) {\n if (filters.zero(j = index[i])) {\n if(toSkip > 0) {\n //skip matching row\n --toSkip;\n } else {\n array.push(data[j]);\n --k;\n }\n }\n i++;\n }\n\n return array;\n }\n\n // Adds a new group to this dimension, using the specified key function.\n function group(key) {\n var group = {\n top: top,\n all: all,\n reduce: reduce,\n reduceCount: reduceCount,\n reduceSum: reduceSum,\n order: order,\n orderNatural: orderNatural,\n size: size,\n dispose: dispose,\n remove: dispose // for backwards-compatibility\n };\n\n // Ensure that this group will be removed when the dimension is removed.\n dimensionGroups.push(group);\n\n var groups, // array of {key, value}\n groupIndex, // object id ↦ group id\n groupWidth = 8,\n groupCapacity = capacity(groupWidth),\n k = 0, // cardinality\n select,\n heap,\n reduceAdd,\n reduceRemove,\n reduceInitial,\n update = cr_null,\n reset = cr_null,\n resetNeeded = true,\n groupAll = key === cr_null,\n n0old;\n\n if (arguments.length < 1) key = cr_identity;\n\n // The group listens to the crossfilter for when any dimension changes, so\n // that it can update the associated reduce values. It must also listen to\n // the parent dimension for when data is added, and compute new keys.\n filterListeners.push(update);\n indexListeners.push(add);\n removeDataListeners.push(removeData);\n\n // Incorporate any existing data into the grouping.\n add(values, index, 0, n);\n\n // Incorporates the specified new values into this group.\n // This function is responsible for updating groups and groupIndex.\n function add(newValues, newIndex, n0, n1) {\n\n if(iterable) {\n n0old = n0\n n0 = values.length - newValues.length\n n1 = newValues.length;\n }\n\n var oldGroups = groups,\n reIndex = iterable ? [] : cr_index(k, groupCapacity),\n add = reduceAdd,\n remove = reduceRemove,\n initial = reduceInitial,\n k0 = k, // old cardinality\n i0 = 0, // index of old group\n i1 = 0, // index of new record\n j, // object id\n g0, // old group\n x0, // old key\n x1, // new key\n g, // group to add\n x; // key of group to add\n\n // If a reset is needed, we don't need to update the reduce values.\n if (resetNeeded) add = initial = cr_null;\n if (resetNeeded) remove = initial = cr_null;\n\n // Reset the new groups (k is a lower bound).\n // Also, make sure that groupIndex exists and is long enough.\n groups = new Array(k), k = 0;\n if(iterable){\n groupIndex = k0 ? groupIndex : [];\n }\n else{\n groupIndex = k0 > 1 ? xfilterArray.arrayLengthen(groupIndex, n) : cr_index(n, groupCapacity);\n }\n\n\n // Get the first old key (x0 of g0), if it exists.\n if (k0) x0 = (g0 = oldGroups[0]).key;\n\n // Find the first new key (x1), skipping NaN keys.\n while (i1 < n1 && !((x1 = key(newValues[i1])) >= x1)) ++i1;\n\n // While new keys remain…\n while (i1 < n1) {\n\n // Determine the lesser of the two current keys; new and old.\n // If there are no old keys remaining, then always add the new key.\n if (g0 && x0 <= x1) {\n g = g0, x = x0;\n\n // Record the new index of the old group.\n reIndex[i0] = k;\n\n // Retrieve the next old key.\n g0 = oldGroups[++i0];\n if (g0) x0 = g0.key;\n } else {\n g = {key: x1, value: initial()}, x = x1;\n }\n\n // Add the lesser group.\n groups[k] = g;\n\n // Add any selected records belonging to the added group, while\n // advancing the new key and populating the associated group index.\n\n while (x1 <= x) {\n j = newIndex[i1] + (iterable ? n0old : n0)\n\n\n if(iterable){\n if(groupIndex[j]){\n groupIndex[j].push(k)\n }\n else{\n groupIndex[j] = [k]\n }\n }\n else{\n groupIndex[j] = k;\n }\n\n // Always add new values to groups. Only remove when not in filter.\n // This gives groups full information on data life-cycle.\n g.value = add(g.value, data[j], true);\n if (!filters.zeroExcept(j, offset, zero)) g.value = remove(g.value, data[j], false);\n if (++i1 >= n1) break;\n x1 = key(newValues[i1]);\n }\n\n groupIncrement();\n }\n\n // Add any remaining old groups that were greater th1an all new keys.\n // No incremental reduce is needed; these groups have no new records.\n // Also record the new index of the old group.\n while (i0 < k0) {\n groups[reIndex[i0] = k] = oldGroups[i0++];\n groupIncrement();\n }\n\n\n // Fill in gaps with empty arrays where there may have been rows with empty iterables\n if(iterable){\n for (var index1 = 0; index1 < n; index1++) {\n if(!groupIndex[index1]){\n groupIndex[index1] = [];\n }\n }\n }\n\n // If we added any new groups before any old groups,\n // update the group index of all the old records.\n if(k > i0){\n if(iterable){\n for (i0 = 0; i0 < n0old; ++i0) {\n for (index1 = 0; index1 < groupIndex[i0].length; index1++) {\n groupIndex[i0][index1] = reIndex[groupIndex[i0][index1]];\n }\n }\n }\n else{\n for (i0 = 0; i0 < n0; ++i0) {\n groupIndex[i0] = reIndex[groupIndex[i0]];\n }\n }\n }\n\n // Modify the update and reset behavior based on the cardinality.\n // If the cardinality is less than or equal to one, then the groupIndex\n // is not needed. If the cardinality is zero, then there are no records\n // and therefore no groups to update or reset. Note that we also must\n // change the registered listener to point to the new method.\n j = filterListeners.indexOf(update);\n if (k > 1 || iterable) {\n update = updateMany;\n reset = resetMany;\n } else {\n if (!k && groupAll) {\n k = 1;\n groups = [{key: null, value: initial()}];\n }\n if (k === 1) {\n update = updateOne;\n reset = resetOne;\n } else {\n update = cr_null;\n reset = cr_null;\n }\n groupIndex = null;\n }\n filterListeners[j] = update;\n\n // Count the number of added groups,\n // and widen the group index as needed.\n function groupIncrement() {\n if(iterable){\n k++\n return\n }\n if (++k === groupCapacity) {\n reIndex = xfilterArray.arrayWiden(reIndex, groupWidth <<= 1);\n groupIndex = xfilterArray.arrayWiden(groupIndex, groupWidth);\n groupCapacity = capacity(groupWidth);\n }\n }\n }\n\n function removeData(reIndex) {\n if (k > 1 || iterable) {\n var oldK = k,\n oldGroups = groups,\n seenGroups = cr_index(oldK, oldK),\n i,\n i0,\n j;\n\n // Filter out non-matches by copying matching group index entries to\n // the beginning of the array.\n if (!iterable) {\n for (i = 0, j = 0; i < n; ++i) {\n if (reIndex[i] !== REMOVED_INDEX) {\n seenGroups[groupIndex[j] = groupIndex[i]] = 1;\n ++j;\n }\n }\n } else {\n for (i = 0, j = 0; i < n; ++i) {\n if (reIndex[i] !== REMOVED_INDEX) {\n groupIndex[j] = groupIndex[i];\n for (i0 = 0; i0 < groupIndex[j].length; i0++) {\n seenGroups[groupIndex[j][i0]] = 1;\n }\n ++j;\n }\n }\n }\n\n // Reassemble groups including only those groups that were referred\n // to by matching group index entries. Note the new group index in\n // seenGroups.\n groups = [], k = 0;\n for (i = 0; i < oldK; ++i) {\n if (seenGroups[i]) {\n seenGroups[i] = k++;\n groups.push(oldGroups[i]);\n }\n }\n\n if (k > 1 || iterable) {\n // Reindex the group index using seenGroups to find the new index.\n if (!iterable) {\n for (i = 0; i < j; ++i) groupIndex[i] = seenGroups[groupIndex[i]];\n } else {\n for (i = 0; i < j; ++i) {\n for (i0 = 0; i0 < groupIndex[i].length; ++i0) {\n groupIndex[i][i0] = seenGroups[groupIndex[i][i0]];\n }\n }\n }\n } else {\n groupIndex = null;\n }\n filterListeners[filterListeners.indexOf(update)] = k > 1 || iterable\n ? (reset = resetMany, update = updateMany)\n : k === 1 ? (reset = resetOne, update = updateOne)\n : reset = update = cr_null;\n } else if (k === 1) {\n if (groupAll) return;\n for (var index3 = 0; index3 < n; ++index3) if (reIndex[index3] !== REMOVED_INDEX) return;\n groups = [], k = 0;\n filterListeners[filterListeners.indexOf(update)] =\n update = reset = cr_null;\n }\n }\n\n // Reduces the specified selected or deselected records.\n // This function is only used when the cardinality is greater than 1.\n // notFilter indicates a crossfilter.add/remove operation.\n function updateMany(filterOne, filterOffset, added, removed, notFilter) {\n\n if ((filterOne === one && filterOffset === offset) || resetNeeded) return;\n\n var i,\n j,\n k,\n n,\n g;\n\n if(iterable){\n // Add the added values.\n for (i = 0, n = added.length; i < n; ++i) {\n if (filters.zeroExcept(k = added[i], offset, zero)) {\n for (j = 0; j < groupIndex[k].length; j++) {\n g = groups[groupIndex[k][j]];\n g.value = reduceAdd(g.value, data[k], false, j);\n }\n }\n }\n\n // Remove the removed values.\n for (i = 0, n = removed.length; i < n; ++i) {\n if (filters.onlyExcept(k = removed[i], offset, zero, filterOffset, filterOne)) {\n for (j = 0; j < groupIndex[k].length; j++) {\n g = groups[groupIndex[k][j]];\n g.value = reduceRemove(g.value, data[k], notFilter, j);\n }\n }\n }\n return;\n }\n\n // Add the added values.\n for (i = 0, n = added.length; i < n; ++i) {\n if (filters.zeroExcept(k = added[i], offset, zero)) {\n g = groups[groupIndex[k]];\n g.value = reduceAdd(g.value, data[k], false);\n }\n }\n\n // Remove the removed values.\n for (i = 0, n = removed.length; i < n; ++i) {\n if (filters.onlyExcept(k = removed[i], offset, zero, filterOffset, filterOne)) {\n g = groups[groupIndex[k]];\n g.value = reduceRemove(g.value, data[k], notFilter);\n }\n }\n }\n\n // Reduces the specified selected or deselected records.\n // This function is only used when the cardinality is 1.\n // notFilter indicates a crossfilter.add/remove operation.\n function updateOne(filterOne, filterOffset, added, removed, notFilter) {\n if ((filterOne === one && filterOffset === offset) || resetNeeded) return;\n\n var i,\n k,\n n,\n g = groups[0];\n\n // Add the added values.\n for (i = 0, n = added.length; i < n; ++i) {\n if (filters.zeroExcept(k = added[i], offset, zero)) {\n g.value = reduceAdd(g.value, data[k], false);\n }\n }\n\n // Remove the removed values.\n for (i = 0, n = removed.length; i < n; ++i) {\n if (filters.onlyExcept(k = removed[i], offset, zero, filterOffset, filterOne)) {\n g.value = reduceRemove(g.value, data[k], notFilter);\n }\n }\n }\n\n // Recomputes the group reduce values from scratch.\n // This function is only used when the cardinality is greater than 1.\n function resetMany() {\n var i,\n j,\n g;\n\n // Reset all group values.\n for (i = 0; i < k; ++i) {\n groups[i].value = reduceInitial();\n }\n\n // We add all records and then remove filtered records so that reducers\n // can build an 'unfiltered' view even if there are already filters in\n // place on other dimensions.\n if(iterable){\n for (i = 0; i < n; ++i) {\n for (j = 0; j < groupIndex[i].length; j++) {\n g = groups[groupIndex[i][j]];\n g.value = reduceAdd(g.value, data[i], true, j);\n }\n }\n for (i = 0; i < n; ++i) {\n if (!filters.zeroExcept(i, offset, zero)) {\n for (j = 0; j < groupIndex[i].length; j++) {\n g = groups[groupIndex[i][j]];\n g.value = reduceRemove(g.value, data[i], false, j);\n }\n }\n }\n return;\n }\n\n for (i = 0; i < n; ++i) {\n g = groups[groupIndex[i]];\n g.value = reduceAdd(g.value, data[i], true);\n }\n for (i = 0; i < n; ++i) {\n if (!filters.zeroExcept(i, offset, zero)) {\n g = groups[groupIndex[i]];\n g.value = reduceRemove(g.value, data[i], false);\n }\n }\n }\n\n // Recomputes the group reduce values from scratch.\n // This function is only used when the cardinality is 1.\n function resetOne() {\n var i,\n g = groups[0];\n\n // Reset the singleton group values.\n g.value = reduceInitial();\n\n // We add all records and then remove filtered records so that reducers\n // can build an 'unfiltered' view even if there are already filters in\n // place on other dimensions.\n for (i = 0; i < n; ++i) {\n g.value = reduceAdd(g.value, data[i], true);\n }\n\n for (i = 0; i < n; ++i) {\n if (!filters.zeroExcept(i, offset, zero)) {\n g.value = reduceRemove(g.value, data[i], false);\n }\n }\n }\n\n // Returns the array of group values, in the dimension's natural order.\n function all() {\n if (resetNeeded) reset(), resetNeeded = false;\n return groups;\n }\n\n // Returns a new array containing the top K group values, in reduce order.\n function top(k) {\n var top = select(all(), 0, groups.length, k);\n return heap.sort(top, 0, top.length);\n }\n\n // Sets the reduce behavior for this group to use the specified functions.\n // This method lazily recomputes the reduce values, waiting until needed.\n function reduce(add, remove, initial) {\n reduceAdd = add;\n reduceRemove = remove;\n reduceInitial = initial;\n resetNeeded = true;\n return group;\n }\n\n // A convenience method for reducing by count.\n function reduceCount() {\n return reduce(xfilterReduce.reduceIncrement, xfilterReduce.reduceDecrement, cr_zero);\n }\n\n // A convenience method for reducing by sum(value).\n function reduceSum(value) {\n return reduce(xfilterReduce.reduceAdd(value), xfilterReduce.reduceSubtract(value), cr_zero);\n }\n\n // Sets the reduce order, using the specified accessor.\n function order(value) {\n select = xfilterHeapselect.by(valueOf);\n heap = xfilterHeap.by(valueOf);\n function valueOf(d) { return value(d.value); }\n return group;\n }\n\n // A convenience method for natural ordering by reduce value.\n function orderNatural() {\n return order(cr_identity);\n }\n\n // Returns the cardinality of this group, irrespective of any filters.\n function size() {\n return k;\n }\n\n // Removes this group and associated event listeners.\n function dispose() {\n var i = filterListeners.indexOf(update);\n if (i >= 0) filterListeners.splice(i, 1);\n i = indexListeners.indexOf(add);\n if (i >= 0) indexListeners.splice(i, 1);\n i = removeDataListeners.indexOf(removeData);\n if (i >= 0) removeDataListeners.splice(i, 1);\n i = dimensionGroups.indexOf(group);\n if (i >= 0) dimensionGroups.splice(i, 1);\n return group;\n }\n\n return reduceCount().orderNatural();\n }\n\n // A convenience function for generating a singleton group.\n function groupAll() {\n var g = group(cr_null), all = g.all;\n delete g.all;\n delete g.top;\n delete g.order;\n delete g.orderNatural;\n delete g.size;\n g.value = function() { return all()[0].value; };\n return g;\n }\n\n // Removes this dimension and associated groups and event listeners.\n function dispose() {\n dimensionGroups.forEach(function(group) { group.dispose(); });\n var i = dataListeners.indexOf(preAdd);\n if (i >= 0) dataListeners.splice(i, 1);\n i = dataListeners.indexOf(postAdd);\n if (i >= 0) dataListeners.splice(i, 1);\n i = removeDataListeners.indexOf(removeData);\n if (i >= 0) removeDataListeners.splice(i, 1);\n filters.masks[offset] &= zero;\n return filterAll();\n }\n\n return dimension;\n }\n\n // A convenience method for groupAll on a dummy dimension.\n // This implementation can be optimized since it always has cardinality 1.\n function groupAll() {\n var group = {\n reduce: reduce,\n reduceCount: reduceCount,\n reduceSum: reduceSum,\n value: value,\n dispose: dispose,\n remove: dispose // for backwards-compatibility\n };\n\n var reduceValue,\n reduceAdd,\n reduceRemove,\n reduceInitial,\n resetNeeded = true;\n\n // The group listens to the crossfilter for when any dimension changes, so\n // that it can update the reduce value. It must also listen to the parent\n // dimension for when data is added.\n filterListeners.push(update);\n dataListeners.push(add);\n\n // For consistency; actually a no-op since resetNeeded is true.\n add(data, 0, n);\n\n // Incorporates the specified new values into this group.\n function add(newData, n0) {\n var i;\n\n if (resetNeeded) return;\n\n // Cycle through all the values.\n for (i = n0; i < n; ++i) {\n\n // Add all values all the time.\n reduceValue = reduceAdd(reduceValue, data[i], true);\n\n // Remove the value if filtered.\n if (!filters.zero(i)) {\n reduceValue = reduceRemove(reduceValue, data[i], false);\n }\n }\n }\n\n // Reduces the specified selected or deselected records.\n function update(filterOne, filterOffset, added, removed, notFilter) {\n var i,\n k,\n n;\n\n if (resetNeeded) return;\n\n // Add the added values.\n for (i = 0, n = added.length; i < n; ++i) {\n if (filters.zero(k = added[i])) {\n reduceValue = reduceAdd(reduceValue, data[k], notFilter);\n }\n }\n\n // Remove the removed values.\n for (i = 0, n = removed.length; i < n; ++i) {\n if (filters.only(k = removed[i], filterOffset, filterOne)) {\n reduceValue = reduceRemove(reduceValue, data[k], notFilter);\n }\n }\n }\n\n // Recomputes the group reduce value from scratch.\n function reset() {\n var i;\n\n reduceValue = reduceInitial();\n\n // Cycle through all the values.\n for (i = 0; i < n; ++i) {\n\n // Add all values all the time.\n reduceValue = reduceAdd(reduceValue, data[i], true);\n\n // Remove the value if it is filtered.\n if (!filters.zero(i)) {\n reduceValue = reduceRemove(reduceValue, data[i], false);\n }\n }\n }\n\n // Sets the reduce behavior for this group to use the specified functions.\n // This method lazily recomputes the reduce value, waiting until needed.\n function reduce(add, remove, initial) {\n reduceAdd = add;\n reduceRemove = remove;\n reduceInitial = initial;\n resetNeeded = true;\n return group;\n }\n\n // A convenience method for reducing by count.\n function reduceCount() {\n return reduce(xfilterReduce.reduceIncrement, xfilterReduce.reduceDecrement, cr_zero);\n }\n\n // A convenience method for reducing by sum(value).\n function reduceSum(value) {\n return reduce(xfilterReduce.reduceAdd(value), xfilterReduce.reduceSubtract(value), cr_zero);\n }\n\n // Returns the computed reduce value.\n function value() {\n if (resetNeeded) reset(), resetNeeded = false;\n return reduceValue;\n }\n\n // Removes this group and associated event listeners.\n function dispose() {\n var i = filterListeners.indexOf(update);\n if (i >= 0) filterListeners.splice(i, 1);\n i = dataListeners.indexOf(add);\n if (i >= 0) dataListeners.splice(i, 1);\n return group;\n }\n\n return reduceCount();\n }\n\n // Returns the number of records in this crossfilter, irrespective of any filters.\n function size() {\n return n;\n }\n\n // Returns the raw row data contained in this crossfilter\n function all(){\n return data;\n }\n\n // Returns row data with all dimension filters applied, except for filters in ignore_dimensions\n function allFiltered(ignore_dimensions) {\n var array = [],\n i = 0,\n mask = maskForDimensions(ignore_dimensions || []);\n\n for (i = 0; i < n; i++) {\n if (filters.zeroExceptMask(i, mask)) {\n array.push(data[i]);\n }\n }\n\n return array;\n }\n\n function onChange(cb){\n if(typeof cb !== 'function'){\n /* eslint no-console: 0 */\n console.warn('onChange callback parameter must be a function!');\n return;\n }\n callbacks.push(cb);\n return function(){\n callbacks.splice(callbacks.indexOf(cb), 1);\n };\n }\n\n function triggerOnChange(eventName){\n for (var i = 0; i < callbacks.length; i++) {\n callbacks[i](eventName);\n }\n }\n\n return arguments.length\n ? add(arguments[0])\n : crossfilter;\n}\n\n// Returns an array of size n, big enough to store ids up to m.\nfunction cr_index(n, m) {\n return (m < 0x101\n ? xfilterArray.array8 : m < 0x10001\n ? xfilterArray.array16\n : xfilterArray.array32)(n);\n}\n\n// Constructs a new array of size n, with sequential values from 0 to n - 1.\nfunction cr_range(n) {\n var range = cr_index(n, n);\n for (var i = -1; ++i < n;) range[i] = i;\n return range;\n}\n\nfunction capacity(w) {\n return w === 8\n ? 0x100 : w === 16\n ? 0x10000\n : 0x100000000;\n}\n","import {d3} from './lib';\nimport crossfilter from 'crossfilter2';\n\n/* Decompresses ideogram's annotations for crossfilter initialization\nBy default, annotations are clustered by chromosome, e.g.\n[\n {\"chr\": \"1\", \"annots\": [{\"from\": 100, \"to\", 101, \"chr\": \"1\", ...}, ...]},\n {\"chr\": \"2\", \"annots\": [{\"from\": 500, \"to\", 501, \"chr\": \"2\", ...}, ...]},\n ...\n]\nThis method flattens that structure to e.g.\n[\n {\"from\": 100, \"to\": 101, \"chr\": \"1\", ...},\n ...\n {\"from\": 500, \"to\": 501, \"chr\": \"2\", ...},\n]\nSee also: packAnnots\n*/\nfunction unpackAnnots() {\n var chr, annots, i,\n unpackedAnnots = [],\n ideo = this,\n chrs = ideo.annots;\n\n for (i = 0; i < chrs.length; i++) {\n chr = chrs[i];\n annots = chr.annots;\n unpackedAnnots = unpackedAnnots.concat(annots);\n }\n\n return unpackedAnnots;\n}\n\n/*\n Compresses annots back to default state. Inverse of unpackAnnots.\n*/\nfunction packAnnots(unpackedAnnots) {\n var chr, annot, i,\n annots = [],\n ideo = this,\n chrs = ideo.annots;\n\n for (chr in chrs) {\n annots.push({chr: chrs[chr].chr, annots: []});\n }\n\n for (i = 0; i < unpackedAnnots.length; i++) {\n annot = unpackedAnnots[i];\n annots[annot.chrIndex].annots.push(annot);\n }\n\n return annots;\n}\n\n/*\n Initializes crossfilter. Needed for client-side filtering.\n More: https://github.com/square/crossfilter/wiki/API-Reference\n*/\nfunction initCrossFilter() {\n var i, facet,\n ideo = this,\n keys = ideo.rawAnnots.keys;\n\n ideo.unpackedAnnots = ideo.unpackAnnots();\n ideo.crossfilter = crossfilter(ideo.unpackedAnnots);\n\n ideo.annotsByFacet = {};\n ideo.facets = keys.slice(3, keys.length);\n\n for (i = 0; i < ideo.facets.length; i++) {\n facet = ideo.facets[i];\n ideo.annotsByFacet[facet] =\n ideo.crossfilter.dimension(function(d) {\n return d[facet];\n });\n }\n\n if ('filterSelections' in ideo) {\n ideo.filterAnnots(ideo.filterSelections);\n }\n\n ideo.filteredAnnots = ideo.annots;\n}\n\nfunction getFilteredResults(selections, ideo) {\n var fn, i, facet, results, filter,\n counts = {};\n\n if (Object.keys(selections).length === 0) {\n results = ideo.unpackedAnnots;\n } else {\n for (i = 0; i < ideo.facets.length; i++) {\n facet = ideo.facets[i];\n if (facet in selections) {\n filter = selections[facet];\n if (Array.isArray(filter)) {\n fn = function(d) {\n // Filter is numeric range\n if (filter.length === 2) {\n // [min, max]\n return filter[0] <= d && d < filter[1];\n } else if (filter.length === 4) {\n // [min1, max1, min2, max2]\n return (\n filter[0] <= d && d < filter[1] ||\n filter[2] <= d && d < filter[3]\n );\n }\n };\n } else {\n fn = function(d) {\n // Filter is set of categories\n return (d in filter);\n };\n }\n } else {\n fn = null;\n }\n ideo.annotsByFacet[facet].filter(fn);\n counts[facet] = ideo.annotsByFacet[facet].group().top(Infinity);\n }\n results = ideo.annotsByFacet[facet].top(Infinity);\n }\n\n return [results, counts];\n}\n\n/*\n Filters annotations based on the given selections.\n \"selections\" is an object of objects, e.g.\n\n {\n \"tissue-type\": { <-- a facet\n \"cerebral-cortex\": 1, <-- a filter; \"1\" means it is selected\n \"liver\": 1\n },\n \"gene-type\": {\n mirna\": 1\n }\n }\n\n Translation:\n select where:\n (tissue-type is cerebral-cortex OR liver) and (gene-type is mirna)\n\n TODO:\n * Filter counts\n * Integrate server-side filtering for very large datasets\n*/\nfunction filterAnnots(selections) {\n var i, facet, results, counts,\n t0 = Date.now(),\n ideo = this;\n\n ideo.filterSelections = selections;\n [results, counts] = getFilteredResults(selections, ideo);\n\n for (i < 0; i < ideo.facets.length; i++) {\n ideo.annotsByFacet[facet].filterAll(); // clear filters\n }\n\n results = ideo.packAnnots(results);\n\n delete ideo.maxAnnotsPerBar;\n delete ideo.maxAnnotsPerBarAllChrs;\n\n ideo.filteredAnnots = results;\n\n d3.selectAll(ideo.selector + ' polygon.annot').remove();\n ideo.drawAnnots(results);\n\n console.log('Time in filterAnnots: ' + (Date.now() - t0) + ' ms');\n\n return counts;\n}\n\nexport {unpackAnnots, packAnnots, initCrossFilter, filterAnnots};\n","function getPixelAndOtherData(bands, chr, hasBands, ideo) {\n var i, band, csLength, width, maxLength,\n pxStop = 0,\n taxid = chr.id.split('-')[1],\n cs = ideo.coordinateSystem,\n chrHeight = ideo.config.chrHeight;\n\n for (i = 0; i < bands.length; i++) {\n band = bands[i];\n csLength = band[cs].stop - band[cs].start;\n\n // If ideogram is rotated (and thus showing only one chromosome),\n // then set its width independent of the longest chromosome in this\n // genome.\n if (ideo._layout._isRotated) {\n width = chrHeight * csLength / chr.length;\n } else {\n if (ideo.config.chromosomeScale === 'relative') {\n maxLength = ideo.maxLength[taxid][cs];\n } else {\n maxLength = ideo.maxLength[cs];\n }\n width = chrHeight * chr.length / maxLength * csLength / chr.length;\n }\n bands[i].px = {start: pxStop, stop: pxStop + width, width: width};\n\n pxStop = bands[i].px.stop;\n\n if (hasBands && band.stain === 'acen' && band.name[0] === 'p') {\n chr.pcenIndex = i;\n }\n }\n return [bands, chr, pxStop];\n}\n\n/**\n * TODO:\n * A chromosome-level scale property is likely\n * nonsensical for any chromosomes that have cytogenetic band data.\n * Different bands tend to have ratios between number of base pairs\n * and physical length.\n *\n * However, a chromosome-level scale property is likely\n * necessary for chromosomes that do not have band data.\n *\n * This needs further review.\n */\nfunction getChrScale(chr, hasBands, ideo) {\n var chrHeight = ideo.config.chrHeight,\n chrLength = chr.length,\n maxLength = ideo.maxLength,\n taxid = chr.id.split('-')[1],\n scale = {};\n\n scale.bp = chrHeight / maxLength.bp;\n\n if (ideo.config.multiorganism === true) {\n // chr.scale.bp = band.iscn.stop / band.bp.stop;\n if (ideo.config.chromosomeScale === 'relative') {\n scale.iscn = chrHeight * chrLength / maxLength[taxid].bp;\n scale.bp = chrHeight / maxLength[taxid].bp;\n } else {\n scale.iscn = chrHeight * chrLength / maxLength.bp;\n }\n } else if (hasBands) {\n scale.iscn = chrHeight / maxLength.iscn;\n }\n\n return scale;\n}\n\nfunction getChromosomePixels(chr) {\n var bands, chrHeight, pxStop, hasBands, maxLength,\n taxid = chr.id.split('-')[1],\n ideo = this;\n\n bands = chr.bands;\n chrHeight = ideo.config.chrHeight;\n pxStop = 0;\n hasBands = (typeof bands !== 'undefined');\n\n if (hasBands) {\n [bands, chr, pxStop] = getPixelAndOtherData(bands, chr, hasBands, ideo);\n } else {\n if (ideo.config.chromosomeScale === 'relative') {\n maxLength = ideo.maxLength[taxid][ideo.coordinateSystem];\n } else {\n maxLength = ideo.maxLength[ideo.coordinateSystem];\n }\n pxStop = chrHeight * chr.length / maxLength;\n }\n\n chr.width = pxStop;\n chr.scale = getChrScale(chr, hasBands, ideo);\n chr.bands = bands;\n\n return chr;\n}\n\nfunction getChrModelScaffold(chr, bands, chrName, ideo) {\n var hasBands = (typeof bands !== 'undefined');\n\n if (hasBands) {\n const lastBand = bands[bands.length - 1];\n chr.name = chrName;\n chr.length = lastBand[ideo.coordinateSystem].stop;\n\n // Accounts for case where this chromosome\n chr.bpLength = lastBand.bp.stop;\n\n chr.type = 'nuclear';\n } else {\n chr = chrName;\n }\n\n return chr;\n}\n\n/**\n * Encountered when processing an assembly that has chromosomes with\n * centromere data, but this chromosome does not.\n * Example: chromosome F1 in Felis catus.\n */\nfunction deleteExtraneousBands(chr, hasBands) {\n if (hasBands && chr.bands.length === 1) {\n delete chr.bands;\n }\n return chr;\n}\n\nfunction getCentromerePosition(hasBands, bands) {\n\n if (hasBands === false) return '';\n\n // As with Macaca mulatta chromosome Y\n const firstBand = bands[0];\n const lastBand = bands.slice(-1)[0];\n const chrLength = lastBand.bp.stop - firstBand.bp.start;\n const smallLength = chrLength/20;\n\n if (\n // As with almost all mouse chromosome, chimpanzee chr22\n firstBand.name[0] === 'p' && bands[1].name[0] === 'q' &&\n firstBand.bp.stop - firstBand.bp.start < smallLength\n ) {\n return 'telocentric-p';\n }\n\n const penultimateBand = bands.slice(-2)[0];\n\n if (\n penultimateBand.name[0] === 'p' && lastBand.name[0] === 'q' &&\n lastBand.bp.stop - lastBand.bp.start < smallLength\n ) {\n // As with Macaca mulatta chromosome Y\n return 'telocentric-q';\n }\n\n return '';\n}\n\n/**\n * Generates a model object for each chromosome containing information on\n * its name, DOM ID, length in base pairs or ISCN coordinates, cytogenetic\n * bands, centromere position, etc.\n */\nfunction getChromosomeModel(bands, chrName, taxid, chrIndex) {\n var hasBands, org,\n chr = {},\n ideo = this;\n\n hasBands = (typeof bands !== 'undefined');\n\n chr = getChrModelScaffold(chr, bands, chrName, ideo);\n\n chr.chrIndex = chrIndex;\n chr.id = 'chr' + chr.name + '-' + taxid;\n\n if (ideo.config.fullChromosomeLabels === true) {\n org = this.organisms[taxid];\n chr.name = org.scientificName + ' chr' + chr.name;\n }\n\n chr.bands = bands;\n chr = ideo.getChromosomePixels(chr);\n chr.centromerePosition = getCentromerePosition(hasBands, bands);\n\n chr = deleteExtraneousBands(chr, hasBands);\n\n return chr;\n}\n\nexport {getChromosomeModel, getChromosomePixels};\n","// import {getSettings, handleSettingsHeaderClick} from './settings-ui';\nimport version from '../version';\nimport {downloadPng} from '../lib';\n\nconst style = `\n `;\n\n// eslint-disable-next-line max-len\nconst gearIcon = '';\n// Font Awesome Free 5.2.0 by @fontawesome - https://fontawesome.com\n// License - https://fontawesome.com/license (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License)\n\nfunction deactivate(items) {\n items.forEach(item => {item.classList.remove('active');});\n}\n\nfunction closeTools() {\n const toolHeaders = document.querySelectorAll('#tools > ul > li');\n deactivate(toolHeaders);\n const itemsToClose =\n document.querySelectorAll('.ideo-modal, .ideo-tool-panel');\n itemsToClose.forEach(item => {item.remove();});\n\n document.querySelector('#tools').style.display = 'none';\n}\n\n/**\n * As needed, hide tool panels that are triggered by hovering\n */\nfunction handleHideForHoverables(trigger, tool, toolHeader, toolHeaders) {\n if (trigger === 'mouseenter') {\n\n // Hide panel when hover leaves tool header, if new target element\n // is part of the tools UI (and not the panel itself)\n toolHeader.addEventListener('mouseleave', event => {\n const toElement = event.toElement;\n const toId = toElement.id;\n const panelElement = document.querySelector('.ideo-tool-panel');\n const toolsElement = document.querySelector('#tools');\n if (\n toolsElement.contains(toElement) &&\n panelElement && !panelElement.contains(toElement) &&\n toId !== tool\n ) {\n deactivate(toolHeaders);\n panelElement.remove();\n }\n });\n }\n}\n\n/** Determine action that should trigger a tool panel to display */\nfunction getTrigger(toolHeader) {\n const shouldHover =\n Array.from(toolHeader.classList).includes('ideo-tool-hover');\n const trigger = shouldHover ? 'mouseenter' : 'click';\n return trigger;\n}\n\n/** Shows clicked tool as active, displays resulting panel */\nfunction handleToolClick(ideo) {\n const toolHeaders = document.querySelectorAll('#tools > ul > li');\n\n toolHeaders.forEach(toolHeader => {\n const trigger = getTrigger(toolHeader);\n\n toolHeader.addEventListener(trigger, event => {\n\n // Show only clicked tool header as active\n deactivate(toolHeaders);\n toolHeader.classList += ' active';\n\n const tool = toolHeader.id.split('-')[0];\n const panel = getPanel(tool, ideo);\n\n if (trigger === 'mouseenter') {\n toolHeader.insertAdjacentHTML('beforeend', panel);\n handleHideForHoverables(trigger, tool, toolHeader, toolHeaders);\n\n if (tool === 'download') {\n document.querySelector('#download-image')\n .addEventListener('click', event => {\n closeTools();\n downloadPng(ideo);\n });\n\n document.querySelector('#download-annots')\n .addEventListener('click', event => {\n const element = document.querySelector('#download-annots');\n const classes = Array.from(element.classList);\n if (classes.includes('ideo-disabled') === false) {\n closeTools();\n ideo.downloadAnnotations();\n }\n });\n }\n } else {\n document.querySelector('#gear').insertAdjacentHTML('beforeend', panel);\n }\n });\n });\n\n // Upon clicking \"close\" (x), remove tools UI\n document.querySelectorAll('#close').forEach(closeButton => {\n closeButton.addEventListener('click', () => {closeTools();});\n });\n\n}\n\nfunction handleGearClick(ideo) {\n document.querySelector('#gear')\n .addEventListener('click', event => {\n var options = document.querySelector('#tools');\n if (options.style.display === 'none') {\n options.style.display = '';\n hideOnClickOutside();\n } else {\n options.style.display = 'none';\n closeTools();\n }\n });\n\n handleToolClick(ideo);\n\n // handleSettingsHeaderClick(ideo);\n}\n\nfunction showGearOnIdeogramHover(ideo) {\n const container = document.querySelector(ideo.selector);\n const gear = document.querySelector('#gear');\n const panel = document.querySelector('#tools');\n\n container.addEventListener('mouseover', () => gear.style.display = '');\n container.addEventListener('mouseout', () => {\n // Hide gear only if panel is not shown\n if (panel.style.display === 'none') {\n gear.style.display = 'none';\n }\n });\n\n gear.addEventListener('mouseover', () => gear.style.display = '');\n}\n\nfunction getPanel(tool, ideo) {\n var panel;\n // if (tool === 'settings') panel = getSettings();\n if (tool === 'download') panel = getDownload(ideo);\n if (tool === 'about') panel = getAbout();\n return panel.trim();\n}\n\nfunction getDownload(ideo) {\n\n const numAnnots = document.querySelectorAll('.annot').length;\n const annotsClass = (numAnnots > 0) ? '' : 'ideo-disabled';\n\n return `\n
    \n
  • Image
  • \n
  • Annotations
  • \n
    \n `;\n}\n\nfunction getAbout() {\n const ideogramLink = `\n \n Ideogram.js`;\n const closeButton = 'x';\n return `\n
    \n ${ideogramLink}, version ${version} ${closeButton}
    \n Chromosome visualization for the web\n
    `;\n}\n\nfunction hideOnClickOutside(selector) {\n const elements = document.querySelectorAll('#gear, #tools');\n const outsideClickListener = event => {\n let clickedOutsideCount = 0;\n elements.forEach((element) => {\n if (!element.contains(event.target)) {\n clickedOutsideCount += 1;\n }\n });\n if (clickedOutsideCount === elements.length) {\n closeTools();\n removeClickListener();\n }\n };\n\n const removeClickListener = () => {\n document.removeEventListener('click', outsideClickListener);\n };\n\n document.addEventListener('click', outsideClickListener);\n}\n\nfunction initTools(ideo) {\n\n const triangle = '';\n\n const toolsHtml = `\n ${style}\n
    ${gearIcon}
    \n
    \n
      \n
    • Download ${triangle}
    • \n
    • About
    • \n
    \n
    `;\n\n\n document.querySelector(ideo.selector)\n .insertAdjacentHTML('beforebegin', toolsHtml);\n\n handleGearClick(ideo);\n\n showGearOnIdeogramHover(ideo);\n}\n\nexport {initTools};\n\n","/* eslint-disable no-use-before-define */\n\nexport class ModelAdapter {\n\n constructor(model) {\n this._model = model;\n this._class = 'ModelAdapter';\n }\n\n static getInstance(model) {\n if (model.bands) {\n return new ModelAdapter(model);\n } else {\n return new ModelNoBandsAdapter(model);\n }\n }\n\n getModel() {\n return this._model;\n }\n\n getCssClass() {\n return '';\n }\n}\n\nexport class ModelNoBandsAdapter extends ModelAdapter {\n\n constructor(model) {\n super(model);\n this._class = 'ModelNoBandsAdapter';\n }\n\n getModel() {\n this._model.bands = [];\n\n const isMT = this._model.name === 'MT'; // Is mitochondrial chromosome\n const width = this._model.width;\n\n if (width > 1 || isMT) {\n // Add single band to bands array\n this._model.bands.push({\n name: 'q',\n px: {\n start: 0,\n stop: width,\n width: width\n },\n bp: {\n start: 1,\n stop: this._model.bpLength\n },\n iscn: {\n start: 1,\n stop: this._model.length\n }\n });\n }\n\n return this._model;\n }\n\n getCssClass() {\n return 'noBands';\n }\n\n}\n","import {Ploidy} from './ploidy';\n\nexport class Color {\n\n constructor(config) {\n // Ideogram config\n this._config = config;\n this._ploidy = new Ploidy(this._config);\n }\n\n getArmColor(chrSetIndex, chrIndex, armIndex) {\n if (this._config.armColors) {\n return this._config.armColors[armIndex];\n } else if (this._config.ancestors) {\n return this._getPolyploidArmColor(chrSetIndex, chrIndex, armIndex);\n } else {\n return null;\n }\n }\n\n getBorderColor(chrSetIndex, chrIndex, armIndex) {\n const config = this._config;\n const color = config.chrBorderColor ? config.chrBorderColor : '#000';\n if (chrIndex < config.ploidy) {\n return color;\n } else if (this._ploidy.exists(chrSetIndex, chrIndex, armIndex)) {\n return color;\n } else {\n return '#fff';\n }\n }\n\n getFillColor() {\n const config = this._config;\n if (!config.chrFillColor) return '#AAA';\n const color = config.chrFillColor;\n if (typeof color === 'string') {\n return {arm: color, centromere: ''};\n } else {\n return color;\n };\n }\n\n _getPolyploidArmColor(chrSetIndex, chrIndex, armIndex) {\n if (!this._ploidy.exists(chrSetIndex, chrIndex, armIndex)) {\n return 'transparent';\n } else {\n var ancestor =\n this._ploidy.getAncestor(chrSetIndex, chrIndex, armIndex);\n return this._config.ancestors[ancestor];\n }\n }\n\n}\n","export class Range {\n\n /**\n * Chromosome range.\n * @public\n * @class\n * @param {Object} data - range data.\n * @param {Integer} data.chr - chromosome index.\n * @param {Integer[]} [data.ploidy] - array which controls on which\n * chromosomes range should appear in case\n * of ploidy.\n * @param {Integer} data.start - range start.\n * @param {Integer} data.stop - range end.\n * @param {String} data.color - range color.\n */\n constructor(data) {\n this._data = data;\n this.start = data.start;\n this.stop = data.stop;\n this.length = this.stop - this.start;\n }\n\n getColor(chrIndex) {\n if (!('ploidy' in this._data)) {\n return this._getColor(chrIndex);\n } else if ('ploidy' in this._data && this._data.ploidy[chrIndex]) {\n return this._getColor(chrIndex);\n } else {\n return 'transparent';\n }\n }\n\n _getColor(chrIndex) {\n if (Array.isArray(this._data.color)) {\n return this._data.color[chrIndex];\n } else {\n return this._data.color;\n }\n }\n\n}\n","/* eslint-disable no-use-before-define */\nimport {Color} from './../color';\nimport {Range} from './../range';\n\nexport class Chromosome {\n\n constructor(adapter, config, ideo) {\n this._adapter = adapter;\n this._model = this._adapter.getModel();\n this._config = config;\n this._ideo = ideo;\n this._color = new Color(this._config);\n this._bumpCoefficient = 5;\n }\n\n /**\n * Factory method\n */\n static getInstance(adapter, config, ideo) {\n const centromerePosition = adapter.getModel().centromerePosition;\n if (centromerePosition === 'telocentric-p') {\n return new TelocentricPChromosome(adapter, config, ideo);\n } else if (centromerePosition === 'telocentric-q') {\n return new TelocentricQChromosome(adapter, config, ideo);\n } else {\n return new MetacentricChromosome(adapter, config, ideo);\n }\n }\n\n _addPArmShape(clipPath, isPArmRendered) {\n if (isPArmRendered) {\n return clipPath.concat(this._getPArmShape());\n } else {\n return clipPath;\n }\n }\n\n _addQArmShape(clipPath, isQArmRendered) {\n if (isQArmRendered) {\n return clipPath.concat(this._getQArmShape());\n } else {\n return clipPath;\n }\n }\n\n /**\n * Append bands container and apply clip-path to it\n */\n render(container, chrSetIndex, chrIndex) {\n\n var self, isPArmRendered, isQArmRendered, clipPath, opacity, fill,\n isFullyBanded;\n\n self = this;\n\n container = container.append('g')\n .attr('class', 'bands')\n .attr('clip-path',\n 'url(#' + this._model.id + '-chromosome-set-clippath)'\n );\n\n // Render chromosome arms\n isPArmRendered = this._renderArm(container, chrSetIndex, chrIndex, 'p');\n isQArmRendered = this._renderArm(container, chrSetIndex, chrIndex, 'q');\n\n // Render range set\n this._renderRangeSet(container, chrSetIndex, chrIndex);\n\n // Push arms shape string into clipPath array\n clipPath = [];\n clipPath = this._addPArmShape(clipPath, isPArmRendered);\n clipPath = this._addQArmShape(clipPath, isQArmRendered);\n\n opacity = '0';\n fill = '';\n isFullyBanded = this.isFullyBanded();\n if (\n 'ancestors' in this._ideo.config &&\n !('rangeSet' in this._ideo.config)\n ) {\n // E.g. diploid human genome (with translucent overlay)\n fill = self._color.getArmColor(chrSetIndex, chrIndex, 0);\n if (isFullyBanded) {\n opacity = '0.5';\n }\n } else if (isFullyBanded) {\n // E.g. mouse reference genome\n opacity = null;\n fill = 'transparent';\n } else if (!('ancestors' in this._ideo.config)) {\n // E.g. chimpanzee assembly Pan_tro 3.0\n opacity = '1';\n }\n\n let centromereFill;\n if (this._ideo.config.chrFillColor) {\n const fillColor = self._color.getFillColor();\n fill = fillColor.arm;\n centromereFill = fillColor.centromere;\n }\n\n // Render chromosome border\n container.append('g')\n .attr('class', 'chromosome-border')\n .selectAll('path')\n .data(clipPath)\n .enter()\n .append('path')\n .attr('fill', fill)\n .style('fill-opacity', opacity)\n .style('fill', function(d) {\n if (d.class === 'acen' && centromereFill) {\n return centromereFill;\n }\n })\n .attr('stroke', function(d, i) {\n return self._color.getBorderColor(chrSetIndex, chrIndex, i);\n })\n .attr('stroke-width', function(d) {\n return ('strokeWidth' in d ? d.strokeWidth : 1);\n })\n .attr('d', function(d) {\n return d.path;\n }).attr('class', function(d) {\n return d.class;\n });\n\n return clipPath;\n }\n\n _renderRangeSet(container, chrSetIndex, chrIndex) {\n\n var self, rangeSet, rangesContainer, ideo;\n\n if (!('rangeSet' in this._config)) {\n return;\n }\n\n rangeSet = this._config.rangeSet.filter(function(range) {\n return range.chr - 1 === chrSetIndex;\n }).map(function(range) {\n return new Range(range);\n });\n\n rangesContainer = container.append('g').attr('class', 'range-set');\n\n self = this;\n ideo = self._ideo;\n\n rangesContainer.selectAll('rect.range')\n .data(rangeSet)\n .enter()\n .append('rect')\n .attr('class', 'range')\n .attr('x', function(range) {\n return ideo.convertBpToPx(self._model, range.start);\n }).attr('y', 0)\n .attr('width', function(range) {\n return ideo.convertBpToPx(self._model, range.length);\n }).attr('height', this._config.chrWidth)\n .style('fill', function(range) {\n return range.getColor(chrIndex);\n });\n }\n\n /**\n * Get chromosome's shape main values\n */\n _getShapeData() {\n\n var firstQBand, i, lastBand, rightTerminalPosition;\n\n // First q band from bands sequence\n for (i = 0; i < this._model.bands.length; i++) {\n if (this._model.bands[i].name[0] === 'q') {\n firstQBand = this._model.bands[i];\n break;\n }\n }\n\n // Chromosome's right position\n lastBand = this._model.bands.length - 1;\n rightTerminalPosition = this._model.bands[lastBand].px.stop;\n\n // Properties description:\n // x1 - left terminal start position\n // x2 - centromere position\n // x3 - right terminal end position\n // w - chromosome width\n // b - bump size\n return {\n x1: 0,\n x2: firstQBand ? firstQBand.px.start : rightTerminalPosition,\n x3: rightTerminalPosition,\n w: this._config.chrWidth,\n b: this._config.chrWidth / this._bumpCoefficient\n };\n }\n\n _getPArmShape() {\n var d = this._getShapeData(),\n x = d.x2 - d.b;\n\n if (this.isFullyBanded() || 'ancestors' in this._ideo.config) {\n // Encountered when chromosome has any of:\n // - One placeholder \"band\", e.g. pig genome GCF_000003025.5\n // - Many (> 2) bands, e.g. human reference genome\n // - Ancestor colors in ploidy configuration, as in ploidy-basic.html\n return {\n class: '',\n path:\n 'M' + d.b + ',0 ' +\n 'L' + x + ',0 ' +\n 'Q' + (d.x2 + d.b) + ',' + (d.w / 2) + ',' + x + ',' + d.w + ' ' +\n 'L' + d.b + ',' + d.w + ' ' +\n 'Q-' + d.b + ',' + (d.w / 2) + ',' + d.b + ',0'\n };\n } else {\n // e.g. chimpanzee assembly Pan_tro 3.0\n return [{\n class: '',\n path:\n 'M' + d.b + ',0 ' +\n 'L' + (x - 2) + ',0 ' +\n 'L' + (x - 2) + ',' + d.w + ' ' +\n 'L' + d.b + ',' + d.w + ' ' +\n 'Q-' + d.b + ',' + (d.w / 2) + ',' + d.b + ',0'\n }, {\n class: 'acen',\n path:\n 'M' + x + ',0 ' +\n 'Q' + (d.x2 + d.b) + ',' + (d.w / 2) + ',' + x + ',' + d.w + ' ' +\n 'L' + x + ',' + d.w + ' ' +\n 'L' + (x - 2) + ',' + d.w + ' ' +\n 'L' + (x - 2) + ',0'\n }];\n }\n }\n\n _getQArmShape() {\n var d = this._getShapeData(),\n x = d.x3 - d.b,\n x2b = d.x2 + d.b;\n\n if (this.isFullyBanded() || 'ancestors' in this._ideo.config) {\n return {\n class: '',\n path:\n 'M' + x2b + ',0 ' +\n 'L' + x + ',0 ' +\n 'Q' + (d.x3 + d.b) + ',' + (d.w / 2) + ',' + x + ',' + d.w + ' ' +\n 'L' + x2b + ',' + d.w + ' ' +\n 'Q' + (d.x2 - d.b) + ',' + (d.w / 2) + ',' + x2b + ',0'\n };\n } else {\n // e.g. chimpanzee assembly Pan_tro 3.0\n return [{\n path:\n 'M' + x2b + ',0 ' +\n 'L' + x + ',0 ' +\n 'Q' + (d.x3 + d.b) + ',' + (d.w / 2) + ',' + x + ',' + d.w + ' ' +\n 'L' + x2b + ',' + d.w + ' ' +\n 'L' + x2b + ',0'\n }, {\n class: 'acen',\n path:\n 'M' + x2b + ',0' +\n 'Q' + (d.x2 - d.b) + ',' + (d.w / 2) + ',' + x2b + ',' + d.w + ' ' +\n 'L' + x2b + ',' + d.w +\n 'L' + (x2b + 2) + ',' + d.w +\n 'L' + (x2b + 2) + ',0'\n }];\n }\n }\n\n isFullyBanded() {\n return (\n this._model.bands &&\n (this._model.bands.length !== 2 || this._model.bands[0].name[0] === 'q')\n );\n }\n\n /**\n * Render arm bands\n */\n _renderBands(container, chrSetIndex, chrIndex, bands, arm) {\n\n var self, armIndex, fill;\n\n self = this;\n armIndex = arm === 'p' ? 0 : 1;\n fill = '';\n\n if ('ancestors' in self._ideo.config && !(self.isFullyBanded())) {\n fill = self._color.getArmColor(chrSetIndex, chrIndex, armIndex);\n }\n\n container.selectAll('path.band.' + arm)\n .data(bands)\n .enter()\n .append('path')\n .attr('id', function(d) {\n return self._model.id + '-' + d.name.replace('.', '-');\n })\n .attr('class', function(d) {\n return 'band ' + arm + '-band ' + d.stain;\n })\n .attr('d', function(d) {\n var start, length;\n\n start = self._ideo.round(d.px.start);\n length = self._ideo.round(d.px.width);\n\n return 'M ' + start + ', 0' +\n 'l ' + length + ' 0 ' +\n 'l 0 ' + self._config.chrWidth + ' ' +\n 'l -' + length + ' 0 z';\n })\n .style('fill', fill);\n }\n\n /**\n * Render a chromosome arm.\n * Returns boolean indicating if any bands were rendered.\n */\n _renderArm(container, chrSetIndex, chrIndex, arm) {\n var bands = this._model.bands.filter(function(band) {\n return band.name[0] === arm;\n });\n\n this._renderBands(container, chrSetIndex, chrIndex, bands, arm);\n\n return Boolean(bands.length);\n }\n}\n\nexport class MetacentricChromosome extends Chromosome {\n\n constructor(model, config, ideo) {\n super(model, config, ideo);\n this._class = 'MetacentricChromosome';\n }\n}\n\nexport class TelocentricPChromosome extends Chromosome {\n\n constructor(model, config, ideo) {\n // alert('p')\n super(model, config, ideo);\n this._class = 'TelocentricPChromosome';\n this._pArmOffset = 3;\n }\n\n _addPArmShape(clipPath) {\n return clipPath.concat(this._getPArmShape());\n }\n\n _getPArmShape() {\n // Properties description:\n // x1 - left terminal start position\n // x2 - centromere position\n // x3 - right terminal end position\n // w - chromosome width\n // b - bump size\n var d = this._getShapeData();\n d.o = this._pArmOffset;\n\n return [{\n class: 'acen',\n path: 'M' + (d.x2 + 2) + ',1' +\n 'L' + (d.x2 + d.o + 3.25) + ',1 ' +\n 'L' + (d.x2 + d.o + 3.25) + ',' + (d.w - 1) + ' ' +\n 'L' + (d.x2 + 2) + ',' + (d.w - 1)\n }, {\n class: 'gpos66',\n path: 'M' + (d.x2 - d.o + 5) + ',0' +\n 'L' + (d.x2 - d.o + 3) + ',0 ' +\n 'L' + (d.x2 - d.o + 3) + ',' + d.w + ' ' +\n 'L' + (d.x2 - d.o + 5) + ',' + d.w,\n strokeWidth: 0.5\n }];\n }\n\n _getQArmShape() {\n // Properties description:\n // x1 - left terminal start position\n // x2 - centromere position\n // x3 - right terminal end position\n // w - chromosome width\n // b - bump size\n var d = this._getShapeData(),\n x = d.x3 - d.b,\n o = this._pArmOffset + 3;\n\n return {\n class: '',\n path:\n 'M' + (d.x2 + o) + ',0 ' +\n 'L' + x + ',0 ' +\n 'Q' + (d.x3 + d.b) + ',' + (d.w / 2) + ',' + x + ',' + d.w + ' ' +\n 'L' + (d.x2 + o) + ',' + d.w\n };\n }\n}\n\nexport class TelocentricQChromosome extends Chromosome {\n\n constructor(model, config, ideo) {\n // alert('q')\n super(model, config, ideo);\n this._class = 'TelocentricQChromosome';\n this._qArmOffset = 3;\n }\n\n _getPArmShape() {\n // Properties description:\n // x1 - left terminal start position\n // x2 - centromere position\n // x3 - right terminal end position\n // w - chromosome width\n // b - bump size\n\n var d = this._getShapeData(),\n x = d.x3 - d.b,\n o = this._qArmOffset;\n\n return {\n class: '',\n path:\n // 'M1,0, ' +\n 'M' + (d.x2 + o) + ',0 ' +\n 'L' + (x + o) + ',0 ' +\n 'L' + (x + o) + ',' + d.w + ' ' +\n 'L' + d.b + ',' + d.w + ' ' +\n 'Q-' + d.b + ',' + (d.w / 2) + ',' + d.b + ',0'\n };\n }\n\n _addQArmShape(clipPath) {\n return clipPath.concat(this._getQArmShape());\n }\n\n _getQArmShape() {\n // Properties description:\n // x1 - left terminal start position\n // x2 - centromere position\n // x3 - right terminal end position\n // w - chromosome width\n // b - bump size\n var d = this._getShapeData();\n d.o = this._qArmOffset;\n\n return [{\n class: 'acen',\n path: 'M' + (d.x2 + 2) + ',1 ' +\n 'L' + (d.x2 + d.o + 3.25) + ',1 ' +\n 'L' + (d.x2 + d.o + 3.25) + ',' + (d.w - 1) + ' ' +\n 'L' + (d.x2 + 2) + ',' + (d.w - 1)\n }, {\n class: 'gpos66',\n path: 'M' + (d.x2 + d.o + 5) + ',0 ' +\n 'L' + (d.x2 + d.o + 3) + ',0 ' +\n 'L' + (d.x2 + d.o + 3) + ',' + d.w + ' ' +\n 'L' + (d.x2 + d.o + 5) + ',' + d.w,\n strokeWidth: 0.5\n }];\n }\n}\n","import {d3} from '../lib';\nimport {initTools} from '../tools/tools';\nimport {ModelAdapter} from '../model-adapter';\nimport {Chromosome} from './chromosome';\n\n/**\n * Adds a copy of a chromosome (i.e. a homologous chromosome, homolog) to DOM\n *\n * @param chrModel\n * @param chrIndex\n * @param homologIndex\n * @param container\n */\nfunction appendHomolog(chrModel, chrIndex, homologIndex, container) {\n\n var homologOffset, chromosome, shape, defs, adapter;\n\n defs = d3.select(this.selector + ' defs');\n // Get chromosome model adapter class\n adapter = ModelAdapter.getInstance(chrModel);\n\n // How far this copy of the chromosome is from another\n homologOffset = homologIndex * this.config.chrMargin;\n\n // Append chromosome's container\n chromosome = container\n .append('g')\n .attr('id', chrModel.id)\n .attr('class', 'chromosome ' + adapter.getCssClass())\n .attr('transform', 'translate(0, ' + homologOffset + ')');\n\n // Render chromosome\n shape = Chromosome.getInstance(adapter, this.config, this)\n .render(chromosome, chrIndex, homologIndex);\n\n d3.select('#' + chrModel.id + '-chromosome-set-clippath').remove();\n\n defs.append('clipPath')\n .attr('id', chrModel.id + '-chromosome-set-clippath')\n .selectAll('path')\n .data(shape)\n .enter()\n .append('path')\n .attr('d', function(d) {return d.path;})\n .attr('class', function(d) {return d.class;});\n\n\n if (chrModel.width < 1) {\n d3.select('#' + chrModel.id + ' .bands').style('opacity', 0);\n }\n}\n\n/**\n * Renders all the bands and outlining boundaries of a chromosome.\n */\nfunction drawChromosome(chrModel) {\n var chrIndex, container, numChrsInSet, transform, homologIndex,\n chrSetSelector;\n\n chrIndex = chrModel.chrIndex;\n\n transform = this._layout.getChromosomeSetTranslate(chrIndex);\n\n chrSetSelector = this.selector + ' #' + chrModel.id + '-chromosome-set';\n\n d3.selectAll(chrSetSelector + ' g').remove();\n\n container = d3.select(chrSetSelector);\n\n if (container.nodes().length === 0) {\n // Append chromosome set container\n container = d3.select(this.selector)\n .append('g')\n .attr('class', 'chromosome-set')\n .attr('transform', transform)\n .attr('id', chrModel.id + '-chromosome-set');\n }\n\n if (\n 'sex' in this.config &&\n this.config.ploidy === 2 &&\n this.sexChromosomes.index === chrIndex\n ) {\n this.drawSexChromosomes(container, chrIndex);\n return;\n }\n\n numChrsInSet = 1;\n if (this.config.ploidy > 1) {\n numChrsInSet = this._ploidy.getChromosomesNumber(chrIndex);\n }\n\n for (homologIndex = 0; homologIndex < numChrsInSet; homologIndex++) {\n this.appendHomolog(chrModel, chrIndex, homologIndex, container);\n }\n}\n\n/**\n * Rotates a chromosome 90 degrees and shows or hides all other chromosomes\n * Useful for focusing or defocusing a particular chromosome\n */\nfunction rotateAndToggleDisplay(chrElement) {\n var chrName, chrModel, chrIndex;\n\n this.unhighlight();\n\n // Do nothing if taxid not defined. But it should be defined.\n // To fix that bug we should have a way to find chromosome set number.\n if (!this.config.taxid) return;\n\n chrName = chrElement.id.split('-')[0].replace('chr', '');\n chrModel = this.chromosomes[this.config.taxid][chrName];\n chrIndex = chrModel.chrIndex;\n\n this._layout.rotate(chrIndex, chrIndex, chrElement);\n}\n\nfunction setOverflowScroll() {\n var ideo, config, ideoWidth, ideoInnerWrap, ideoMiddleWrap, ideoSvg,\n ploidy, ploidyPad;\n\n ideo = this;\n config = ideo.config;\n\n ideoSvg = d3.select(config.container + ' svg#_ideogram');\n ideoInnerWrap = d3.select(config.container + ' #_ideogramInnerWrap');\n ideoMiddleWrap = d3.select(config.container + ' #_ideogramMiddleWrap');\n\n ploidy = config.ploidy;\n if (ploidy === 1) {\n ploidyPad = ploidy;\n } else {\n ploidyPad = ploidy * 1.12;\n }\n\n let annotHeight = 0;\n if ('annotationsLayout' in config) {\n annotHeight = config.annotationHeight * config.numAnnotTracks;\n }\n\n if (\n config.orientation === 'vertical' &&\n config.perspective !== 'comparative' &&\n config.geometry !== 'collinear'\n ) {\n ideoWidth =\n (ideo.numChromosomes) *\n (config.chrWidth + config.chrMargin + annotHeight);\n } else {\n return;\n }\n\n if (config.annotationsLayout === 'heatmap-2d') {\n return;\n }\n\n ideoWidth = Math.ceil(ideoWidth * ploidyPad / config.rows);\n if (ideo._layout._class === 'SmallLayout') ideoWidth += 100;\n\n ideoWidth += 35; // Account for settings gear\n\n // Ensures absolutely-positioned elements, e.g. heatmap overlaps, display\n // properly if ideogram container also has position: absolute\n ideoMiddleWrap.style('height', ideo._layout.getHeight() + 'px');\n\n ideoInnerWrap\n .style('max-width', ideoWidth + 'px')\n .style('overflow-x', 'scroll')\n .style('position', 'absolute');\n\n ideoSvg.style('min-width', (ideoWidth - 5) + 'px');\n\n if (ideo.config.showTools) {\n initTools(ideo);\n }\n}\n\nexport {\n appendHomolog, drawChromosome, rotateAndToggleDisplay, setOverflowScroll\n};\n","import {d3} from '../lib';\n\nfunction getChrSetLabelLines(d, i, ideo) {\n var lines;\n if (d.name.indexOf(' ') === -1) {\n lines = [d.name];\n } else {\n lines = d.name.match(/^(.*)\\s+([^\\s]+)$/).slice(1).reverse();\n }\n\n if (\n 'sex' in ideo.config &&\n ideo.config.ploidy === 2 &&\n i === ideo.sexChromosomes.index\n ) {\n if (ideo.config.sex === 'male') {\n lines = ['XY'];\n } else {\n lines = ['XX'];\n }\n }\n\n return lines;\n}\n\nfunction renderChromosomeSetLabel(d, i, textElement, ideo) {\n // Get label lines\n var lines = getChrSetLabelLines(d, i, ideo);\n\n // Render label lines\n d3.select(textElement).selectAll('tspan')\n .data(lines)\n .enter()\n .append('tspan')\n .attr('dy', function(d, i) {\n return i * -1.2 + 'em';\n })\n .attr('x', ideo._layout.getChromosomeSetLabelXPosition())\n .attr('class', function(a, i) {\n var fullLabels = ideo.config.fullChromosomeLabels;\n return i === 1 && fullLabels ? 'italic' : null;\n })\n .text(String);\n}\n\nfunction appendChromosomeSetLabels(ideo) {\n var layout = ideo._layout;\n\n d3.selectAll(ideo.selector + ' .chromosome-set')\n .insert('text', ':first-child')\n .data(ideo.chromosomesArray)\n .attr('class', layout.getChromosomeLabelClass())\n .attr('transform', layout.getChromosomeSetLabelTranslate())\n .attr('x', layout.getChromosomeSetLabelXPosition())\n .attr('y', function(d, i) {\n return layout.getChromosomeSetLabelYPosition(i);\n })\n .attr('text-anchor', layout.getChromosomeSetLabelAnchor())\n .each(function(d, i) {\n renderChromosomeSetLabel(d, i, this, ideo);\n });\n}\n\nfunction appendChromosomeLabels(ideo) {\n var layout = ideo._layout;\n\n d3.selectAll(ideo.selector + ' .chromosome-set')\n .each(function(a, chrSetIndex) {\n d3.select(this).selectAll('.chromosome')\n .append('text')\n .attr('class', 'chrLabel')\n .attr('transform', layout.getChromosomeSetLabelTranslate())\n .attr('x', function(d, i) {\n return layout.getChromosomeLabelXPosition(i);\n })\n .attr('y', function(d, i) {\n return layout.getChromosomeLabelYPosition(i);\n })\n .text(function(d, chrIndex) {\n return ideo._ploidy.getAncestor(chrSetIndex, chrIndex);\n })\n .attr('text-anchor', 'middle');\n });\n}\n\n/**\n * Draws labels for each chromosome, e.g. \"1\", \"2\", \"X\".\n * If ideogram configuration has 'fullChromosomeLabels: True',\n * then labels includes name of taxon, which can help when\n * depicting orthologs.\n */\nfunction drawChromosomeLabels() {\n var ideo = this;\n appendChromosomeSetLabels(ideo);\n appendChromosomeLabels(ideo);\n}\n\nfunction getLabelPositionAttrs(scale) {\n var x, y, scaleSvg;\n\n if (\n typeof (scale) !== 'undefined' &&\n scale.hasOwnProperty('x') &&\n !(scale.x === 1 && scale.y === 1)\n ) {\n scaleSvg = 'scale(' + scale.x + ',' + scale.y + ')';\n x = -6;\n y = (scale === '' ? -16 : -14);\n } else {\n x = -8;\n y = -16;\n scale = {x: 1, y: 1};\n scaleSvg = '';\n }\n\n return {x: x, y: y, scaleSvg: scaleSvg, scale: scale};\n}\n\nfunction updateChrIndex(chrIndex, config) {\n if (config.numAnnotTracks > 1 || config.orientation === '') chrIndex -= 1;\n return chrIndex;\n}\n\nfunction rotateVerticalChromosomeLabels(chr, chrIndex, labelPosAttrs, ideo) {\n var chrMargin2, chrMargin, y,\n config = ideo.config;\n\n chrIndex = updateChrIndex(chrIndex, config);\n\n chrMargin2 = -4;\n if (config.showBandLabels === true) {\n chrMargin2 = config.chrMargin + config.chrWidth + 26;\n }\n\n chrMargin = config.chrMargin * chrIndex;\n if (config.numAnnotTracks > 1 === false) chrMargin += 1;\n\n y = chrMargin + chrMargin2;\n\n chr.selectAll('text.chrLabel')\n .attr('transform', labelPosAttrs.scaleSvg)\n .selectAll('tspan')\n .attr('x', labelPosAttrs.x)\n .attr('y', y);\n}\n\nfunction rotateHorizontalChromosomeLabels(chr, chrIndex, labelPosAttrs, ideo) {\n var chrMargin, chrMargin2, tracksHeight, x,\n config = ideo.config;\n\n chrMargin2 = -config.chrWidth - 2;\n if (config.showBandLabels === true) chrMargin2 = config.chrMargin + 8;\n\n tracksHeight = config.annotTracksHeight;\n if (config.annotationsLayout !== 'overlay') tracksHeight *= 2;\n\n chrMargin = config.chrMargin * chrIndex;\n x = -(chrMargin + chrMargin2) + 3 + tracksHeight;\n x /= labelPosAttrs.scale.x;\n\n chr.selectAll('text.chrLabel')\n .attr('transform', 'rotate(-90)' + labelPosAttrs.scaleSvg)\n .selectAll('tspan')\n .attr('x', x)\n .attr('y', labelPosAttrs.y);\n}\n\n/**\n * Rotates chromosome labels by 90 degrees, e.g. upon clicking a chromosome.\n */\nfunction rotateChromosomeLabels(chr, chrIndex, orientation, scale) {\n var labelPosAttrs,\n ideo = this;\n\n chrIndex -= 1;\n\n labelPosAttrs = getLabelPositionAttrs(scale);\n\n if (orientation === 'vertical' || orientation === '') {\n rotateVerticalChromosomeLabels(chr, chrIndex, labelPosAttrs, ideo);\n } else {\n rotateHorizontalChromosomeLabels(chr, chrIndex, labelPosAttrs, ideo);\n }\n}\n\nexport {drawChromosomeLabels, rotateChromosomeLabels};\n","// DEFLATE is a complex format; to read this code, you should probably check the RFC first:\n// https://tools.ietf.org/html/rfc1951\n// You may also wish to take a look at the guide I made about this program:\n// https://gist.github.com/101arrowz/253f31eb5abc3d9275ab943003ffecad\n// Some of the following code is similar to that of UZIP.js:\n// https://github.com/photopea/UZIP.js\n// However, the vast majority of the codebase has diverged from UZIP.js to increase performance and reduce bundle size.\n// Sometimes 0 will appear where -1 would be more appropriate. This is because using a uint\n// is better for memory in most engines (I *think*).\nvar ch2 = {};\nvar wk = (function (c, id, msg, transfer, cb) {\n var w = new Worker(ch2[id] || (ch2[id] = URL.createObjectURL(new Blob([\n c + ';addEventListener(\"error\",function(e){e=e.error;postMessage({$e$:[e.message,e.code,e.stack]})})'\n ], { type: 'text/javascript' }))));\n w.onmessage = function (e) {\n var d = e.data, ed = d.$e$;\n if (ed) {\n var err = new Error(ed[0]);\n err['code'] = ed[1];\n err.stack = ed[2];\n cb(err, null);\n }\n else\n cb(null, d);\n };\n w.postMessage(msg, transfer);\n return w;\n});\n\n// aliases for shorter compressed code (most minifers don't do this)\nvar u8 = Uint8Array, u16 = Uint16Array, u32 = Uint32Array;\n// fixed length extra bits\nvar fleb = new u8([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, /* unused */ 0, 0, /* impossible */ 0]);\n// fixed distance extra bits\n// see fleb note\nvar fdeb = new u8([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, /* unused */ 0, 0]);\n// code length index map\nvar clim = new u8([16, 17, 18, 0, 8, 7, 9, 6, 10, 5, 11, 4, 12, 3, 13, 2, 14, 1, 15]);\n// get base, reverse index map from extra bits\nvar freb = function (eb, start) {\n var b = new u16(31);\n for (var i = 0; i < 31; ++i) {\n b[i] = start += 1 << eb[i - 1];\n }\n // numbers here are at max 18 bits\n var r = new u32(b[30]);\n for (var i = 1; i < 30; ++i) {\n for (var j = b[i]; j < b[i + 1]; ++j) {\n r[j] = ((j - b[i]) << 5) | i;\n }\n }\n return [b, r];\n};\nvar _a = freb(fleb, 2), fl = _a[0], revfl = _a[1];\n// we can ignore the fact that the other numbers are wrong; they never happen anyway\nfl[28] = 258, revfl[258] = 28;\nvar _b = freb(fdeb, 0), fd = _b[0], revfd = _b[1];\n// map of value to reverse (assuming 16 bits)\nvar rev = new u16(32768);\nfor (var i = 0; i < 32768; ++i) {\n // reverse table algorithm from SO\n var x = ((i & 0xAAAA) >>> 1) | ((i & 0x5555) << 1);\n x = ((x & 0xCCCC) >>> 2) | ((x & 0x3333) << 2);\n x = ((x & 0xF0F0) >>> 4) | ((x & 0x0F0F) << 4);\n rev[i] = (((x & 0xFF00) >>> 8) | ((x & 0x00FF) << 8)) >>> 1;\n}\n// create huffman tree from u8 \"map\": index -> code length for code index\n// mb (max bits) must be at most 15\n// TODO: optimize/split up?\nvar hMap = (function (cd, mb, r) {\n var s = cd.length;\n // index\n var i = 0;\n // u16 \"map\": index -> # of codes with bit length = index\n var l = new u16(mb);\n // length of cd must be 288 (total # of codes)\n for (; i < s; ++i) {\n if (cd[i])\n ++l[cd[i] - 1];\n }\n // u16 \"map\": index -> minimum code for bit length = index\n var le = new u16(mb);\n for (i = 0; i < mb; ++i) {\n le[i] = (le[i - 1] + l[i - 1]) << 1;\n }\n var co;\n if (r) {\n // u16 \"map\": index -> number of actual bits, symbol for code\n co = new u16(1 << mb);\n // bits to remove for reverser\n var rvb = 15 - mb;\n for (i = 0; i < s; ++i) {\n // ignore 0 lengths\n if (cd[i]) {\n // num encoding both symbol and bits read\n var sv = (i << 4) | cd[i];\n // free bits\n var r_1 = mb - cd[i];\n // start value\n var v = le[cd[i] - 1]++ << r_1;\n // m is end value\n for (var m = v | ((1 << r_1) - 1); v <= m; ++v) {\n // every 16 bit value starting with the code yields the same result\n co[rev[v] >>> rvb] = sv;\n }\n }\n }\n }\n else {\n co = new u16(s);\n for (i = 0; i < s; ++i) {\n if (cd[i]) {\n co[i] = rev[le[cd[i] - 1]++] >>> (15 - cd[i]);\n }\n }\n }\n return co;\n});\n// fixed length tree\nvar flt = new u8(288);\nfor (var i = 0; i < 144; ++i)\n flt[i] = 8;\nfor (var i = 144; i < 256; ++i)\n flt[i] = 9;\nfor (var i = 256; i < 280; ++i)\n flt[i] = 7;\nfor (var i = 280; i < 288; ++i)\n flt[i] = 8;\n// fixed distance tree\nvar fdt = new u8(32);\nfor (var i = 0; i < 32; ++i)\n fdt[i] = 5;\n// fixed length map\nvar flm = /*#__PURE__*/ hMap(flt, 9, 0), flrm = /*#__PURE__*/ hMap(flt, 9, 1);\n// fixed distance map\nvar fdm = /*#__PURE__*/ hMap(fdt, 5, 0), fdrm = /*#__PURE__*/ hMap(fdt, 5, 1);\n// find max of array\nvar max = function (a) {\n var m = a[0];\n for (var i = 1; i < a.length; ++i) {\n if (a[i] > m)\n m = a[i];\n }\n return m;\n};\n// read d, starting at bit p and mask with m\nvar bits = function (d, p, m) {\n var o = (p / 8) | 0;\n return ((d[o] | (d[o + 1] << 8)) >> (p & 7)) & m;\n};\n// read d, starting at bit p continuing for at least 16 bits\nvar bits16 = function (d, p) {\n var o = (p / 8) | 0;\n return ((d[o] | (d[o + 1] << 8) | (d[o + 2] << 16)) >> (p & 7));\n};\n// get end of byte\nvar shft = function (p) { return ((p + 7) / 8) | 0; };\n// typed array slice - allows garbage collector to free original reference,\n// while being more compatible than .slice\nvar slc = function (v, s, e) {\n if (s == null || s < 0)\n s = 0;\n if (e == null || e > v.length)\n e = v.length;\n // can't use .constructor in case user-supplied\n var n = new (v.BYTES_PER_ELEMENT == 2 ? u16 : v.BYTES_PER_ELEMENT == 4 ? u32 : u8)(e - s);\n n.set(v.subarray(s, e));\n return n;\n};\n/**\n * Codes for errors generated within this library\n */\nexport var FlateErrorCode = {\n UnexpectedEOF: 0,\n InvalidBlockType: 1,\n InvalidLengthLiteral: 2,\n InvalidDistance: 3,\n StreamFinished: 4,\n NoStreamHandler: 5,\n InvalidHeader: 6,\n NoCallback: 7,\n InvalidUTF8: 8,\n ExtraFieldTooLong: 9,\n InvalidDate: 10,\n FilenameTooLong: 11,\n StreamFinishing: 12,\n InvalidZipData: 13,\n UnknownCompressionMethod: 14\n};\n// error codes\nvar ec = [\n 'unexpected EOF',\n 'invalid block type',\n 'invalid length/literal',\n 'invalid distance',\n 'stream finished',\n 'no stream handler',\n ,\n 'no callback',\n 'invalid UTF-8 data',\n 'extra field too long',\n 'date not in range 1980-2099',\n 'filename too long',\n 'stream finishing',\n 'invalid zip data'\n // determined by unknown compression method\n];\n;\nvar err = function (ind, msg, nt) {\n var e = new Error(msg || ec[ind]);\n e.code = ind;\n if (Error.captureStackTrace)\n Error.captureStackTrace(e, err);\n if (!nt)\n throw e;\n return e;\n};\n// expands raw DEFLATE data\nvar inflt = function (dat, buf, st) {\n // source length\n var sl = dat.length;\n if (!sl || (st && st.f && !st.l))\n return buf || new u8(0);\n // have to estimate size\n var noBuf = !buf || st;\n // no state\n var noSt = !st || st.i;\n if (!st)\n st = {};\n // Assumes roughly 33% compression ratio average\n if (!buf)\n buf = new u8(sl * 3);\n // ensure buffer can fit at least l elements\n var cbuf = function (l) {\n var bl = buf.length;\n // need to increase size to fit\n if (l > bl) {\n // Double or set to necessary, whichever is greater\n var nbuf = new u8(Math.max(bl * 2, l));\n nbuf.set(buf);\n buf = nbuf;\n }\n };\n // last chunk bitpos bytes\n var final = st.f || 0, pos = st.p || 0, bt = st.b || 0, lm = st.l, dm = st.d, lbt = st.m, dbt = st.n;\n // total bits\n var tbts = sl * 8;\n do {\n if (!lm) {\n // BFINAL - this is only 1 when last chunk is next\n final = bits(dat, pos, 1);\n // type: 0 = no compression, 1 = fixed huffman, 2 = dynamic huffman\n var type = bits(dat, pos + 1, 3);\n pos += 3;\n if (!type) {\n // go to end of byte boundary\n var s = shft(pos) + 4, l = dat[s - 4] | (dat[s - 3] << 8), t = s + l;\n if (t > sl) {\n if (noSt)\n err(0);\n break;\n }\n // ensure size\n if (noBuf)\n cbuf(bt + l);\n // Copy over uncompressed data\n buf.set(dat.subarray(s, t), bt);\n // Get new bitpos, update byte count\n st.b = bt += l, st.p = pos = t * 8, st.f = final;\n continue;\n }\n else if (type == 1)\n lm = flrm, dm = fdrm, lbt = 9, dbt = 5;\n else if (type == 2) {\n // literal lengths\n var hLit = bits(dat, pos, 31) + 257, hcLen = bits(dat, pos + 10, 15) + 4;\n var tl = hLit + bits(dat, pos + 5, 31) + 1;\n pos += 14;\n // length+distance tree\n var ldt = new u8(tl);\n // code length tree\n var clt = new u8(19);\n for (var i = 0; i < hcLen; ++i) {\n // use index map to get real code\n clt[clim[i]] = bits(dat, pos + i * 3, 7);\n }\n pos += hcLen * 3;\n // code lengths bits\n var clb = max(clt), clbmsk = (1 << clb) - 1;\n // code lengths map\n var clm = hMap(clt, clb, 1);\n for (var i = 0; i < tl;) {\n var r = clm[bits(dat, pos, clbmsk)];\n // bits read\n pos += r & 15;\n // symbol\n var s = r >>> 4;\n // code length to copy\n if (s < 16) {\n ldt[i++] = s;\n }\n else {\n // copy count\n var c = 0, n = 0;\n if (s == 16)\n n = 3 + bits(dat, pos, 3), pos += 2, c = ldt[i - 1];\n else if (s == 17)\n n = 3 + bits(dat, pos, 7), pos += 3;\n else if (s == 18)\n n = 11 + bits(dat, pos, 127), pos += 7;\n while (n--)\n ldt[i++] = c;\n }\n }\n // length tree distance tree\n var lt = ldt.subarray(0, hLit), dt = ldt.subarray(hLit);\n // max length bits\n lbt = max(lt);\n // max dist bits\n dbt = max(dt);\n lm = hMap(lt, lbt, 1);\n dm = hMap(dt, dbt, 1);\n }\n else\n err(1);\n if (pos > tbts) {\n if (noSt)\n err(0);\n break;\n }\n }\n // Make sure the buffer can hold this + the largest possible addition\n // Maximum chunk size (practically, theoretically infinite) is 2^17;\n if (noBuf)\n cbuf(bt + 131072);\n var lms = (1 << lbt) - 1, dms = (1 << dbt) - 1;\n var lpos = pos;\n for (;; lpos = pos) {\n // bits read, code\n var c = lm[bits16(dat, pos) & lms], sym = c >>> 4;\n pos += c & 15;\n if (pos > tbts) {\n if (noSt)\n err(0);\n break;\n }\n if (!c)\n err(2);\n if (sym < 256)\n buf[bt++] = sym;\n else if (sym == 256) {\n lpos = pos, lm = null;\n break;\n }\n else {\n var add = sym - 254;\n // no extra bits needed if less\n if (sym > 264) {\n // index\n var i = sym - 257, b = fleb[i];\n add = bits(dat, pos, (1 << b) - 1) + fl[i];\n pos += b;\n }\n // dist\n var d = dm[bits16(dat, pos) & dms], dsym = d >>> 4;\n if (!d)\n err(3);\n pos += d & 15;\n var dt = fd[dsym];\n if (dsym > 3) {\n var b = fdeb[dsym];\n dt += bits16(dat, pos) & ((1 << b) - 1), pos += b;\n }\n if (pos > tbts) {\n if (noSt)\n err(0);\n break;\n }\n if (noBuf)\n cbuf(bt + 131072);\n var end = bt + add;\n for (; bt < end; bt += 4) {\n buf[bt] = buf[bt - dt];\n buf[bt + 1] = buf[bt + 1 - dt];\n buf[bt + 2] = buf[bt + 2 - dt];\n buf[bt + 3] = buf[bt + 3 - dt];\n }\n bt = end;\n }\n }\n st.l = lm, st.p = lpos, st.b = bt, st.f = final;\n if (lm)\n final = 1, st.m = lbt, st.d = dm, st.n = dbt;\n } while (!final);\n return bt == buf.length ? buf : slc(buf, 0, bt);\n};\n// starting at p, write the minimum number of bits that can hold v to d\nvar wbits = function (d, p, v) {\n v <<= p & 7;\n var o = (p / 8) | 0;\n d[o] |= v;\n d[o + 1] |= v >>> 8;\n};\n// starting at p, write the minimum number of bits (>8) that can hold v to d\nvar wbits16 = function (d, p, v) {\n v <<= p & 7;\n var o = (p / 8) | 0;\n d[o] |= v;\n d[o + 1] |= v >>> 8;\n d[o + 2] |= v >>> 16;\n};\n// creates code lengths from a frequency table\nvar hTree = function (d, mb) {\n // Need extra info to make a tree\n var t = [];\n for (var i = 0; i < d.length; ++i) {\n if (d[i])\n t.push({ s: i, f: d[i] });\n }\n var s = t.length;\n var t2 = t.slice();\n if (!s)\n return [et, 0];\n if (s == 1) {\n var v = new u8(t[0].s + 1);\n v[t[0].s] = 1;\n return [v, 1];\n }\n t.sort(function (a, b) { return a.f - b.f; });\n // after i2 reaches last ind, will be stopped\n // freq must be greater than largest possible number of symbols\n t.push({ s: -1, f: 25001 });\n var l = t[0], r = t[1], i0 = 0, i1 = 1, i2 = 2;\n t[0] = { s: -1, f: l.f + r.f, l: l, r: r };\n // efficient algorithm from UZIP.js\n // i0 is lookbehind, i2 is lookahead - after processing two low-freq\n // symbols that combined have high freq, will start processing i2 (high-freq,\n // non-composite) symbols instead\n // see https://reddit.com/r/photopea/comments/ikekht/uzipjs_questions/\n while (i1 != s - 1) {\n l = t[t[i0].f < t[i2].f ? i0++ : i2++];\n r = t[i0 != i1 && t[i0].f < t[i2].f ? i0++ : i2++];\n t[i1++] = { s: -1, f: l.f + r.f, l: l, r: r };\n }\n var maxSym = t2[0].s;\n for (var i = 1; i < s; ++i) {\n if (t2[i].s > maxSym)\n maxSym = t2[i].s;\n }\n // code lengths\n var tr = new u16(maxSym + 1);\n // max bits in tree\n var mbt = ln(t[i1 - 1], tr, 0);\n if (mbt > mb) {\n // more algorithms from UZIP.js\n // TODO: find out how this code works (debt)\n // ind debt\n var i = 0, dt = 0;\n // left cost\n var lft = mbt - mb, cst = 1 << lft;\n t2.sort(function (a, b) { return tr[b.s] - tr[a.s] || a.f - b.f; });\n for (; i < s; ++i) {\n var i2_1 = t2[i].s;\n if (tr[i2_1] > mb) {\n dt += cst - (1 << (mbt - tr[i2_1]));\n tr[i2_1] = mb;\n }\n else\n break;\n }\n dt >>>= lft;\n while (dt > 0) {\n var i2_2 = t2[i].s;\n if (tr[i2_2] < mb)\n dt -= 1 << (mb - tr[i2_2]++ - 1);\n else\n ++i;\n }\n for (; i >= 0 && dt; --i) {\n var i2_3 = t2[i].s;\n if (tr[i2_3] == mb) {\n --tr[i2_3];\n ++dt;\n }\n }\n mbt = mb;\n }\n return [new u8(tr), mbt];\n};\n// get the max length and assign length codes\nvar ln = function (n, l, d) {\n return n.s == -1\n ? Math.max(ln(n.l, l, d + 1), ln(n.r, l, d + 1))\n : (l[n.s] = d);\n};\n// length codes generation\nvar lc = function (c) {\n var s = c.length;\n // Note that the semicolon was intentional\n while (s && !c[--s])\n ;\n var cl = new u16(++s);\n // ind num streak\n var cli = 0, cln = c[0], cls = 1;\n var w = function (v) { cl[cli++] = v; };\n for (var i = 1; i <= s; ++i) {\n if (c[i] == cln && i != s)\n ++cls;\n else {\n if (!cln && cls > 2) {\n for (; cls > 138; cls -= 138)\n w(32754);\n if (cls > 2) {\n w(cls > 10 ? ((cls - 11) << 5) | 28690 : ((cls - 3) << 5) | 12305);\n cls = 0;\n }\n }\n else if (cls > 3) {\n w(cln), --cls;\n for (; cls > 6; cls -= 6)\n w(8304);\n if (cls > 2)\n w(((cls - 3) << 5) | 8208), cls = 0;\n }\n while (cls--)\n w(cln);\n cls = 1;\n cln = c[i];\n }\n }\n return [cl.subarray(0, cli), s];\n};\n// calculate the length of output from tree, code lengths\nvar clen = function (cf, cl) {\n var l = 0;\n for (var i = 0; i < cl.length; ++i)\n l += cf[i] * cl[i];\n return l;\n};\n// writes a fixed block\n// returns the new bit pos\nvar wfblk = function (out, pos, dat) {\n // no need to write 00 as type: TypedArray defaults to 0\n var s = dat.length;\n var o = shft(pos + 2);\n out[o] = s & 255;\n out[o + 1] = s >>> 8;\n out[o + 2] = out[o] ^ 255;\n out[o + 3] = out[o + 1] ^ 255;\n for (var i = 0; i < s; ++i)\n out[o + i + 4] = dat[i];\n return (o + 4 + s) * 8;\n};\n// writes a block\nvar wblk = function (dat, out, final, syms, lf, df, eb, li, bs, bl, p) {\n wbits(out, p++, final);\n ++lf[256];\n var _a = hTree(lf, 15), dlt = _a[0], mlb = _a[1];\n var _b = hTree(df, 15), ddt = _b[0], mdb = _b[1];\n var _c = lc(dlt), lclt = _c[0], nlc = _c[1];\n var _d = lc(ddt), lcdt = _d[0], ndc = _d[1];\n var lcfreq = new u16(19);\n for (var i = 0; i < lclt.length; ++i)\n lcfreq[lclt[i] & 31]++;\n for (var i = 0; i < lcdt.length; ++i)\n lcfreq[lcdt[i] & 31]++;\n var _e = hTree(lcfreq, 7), lct = _e[0], mlcb = _e[1];\n var nlcc = 19;\n for (; nlcc > 4 && !lct[clim[nlcc - 1]]; --nlcc)\n ;\n var flen = (bl + 5) << 3;\n var ftlen = clen(lf, flt) + clen(df, fdt) + eb;\n var dtlen = clen(lf, dlt) + clen(df, ddt) + eb + 14 + 3 * nlcc + clen(lcfreq, lct) + (2 * lcfreq[16] + 3 * lcfreq[17] + 7 * lcfreq[18]);\n if (flen <= ftlen && flen <= dtlen)\n return wfblk(out, p, dat.subarray(bs, bs + bl));\n var lm, ll, dm, dl;\n wbits(out, p, 1 + (dtlen < ftlen)), p += 2;\n if (dtlen < ftlen) {\n lm = hMap(dlt, mlb, 0), ll = dlt, dm = hMap(ddt, mdb, 0), dl = ddt;\n var llm = hMap(lct, mlcb, 0);\n wbits(out, p, nlc - 257);\n wbits(out, p + 5, ndc - 1);\n wbits(out, p + 10, nlcc - 4);\n p += 14;\n for (var i = 0; i < nlcc; ++i)\n wbits(out, p + 3 * i, lct[clim[i]]);\n p += 3 * nlcc;\n var lcts = [lclt, lcdt];\n for (var it = 0; it < 2; ++it) {\n var clct = lcts[it];\n for (var i = 0; i < clct.length; ++i) {\n var len = clct[i] & 31;\n wbits(out, p, llm[len]), p += lct[len];\n if (len > 15)\n wbits(out, p, (clct[i] >>> 5) & 127), p += clct[i] >>> 12;\n }\n }\n }\n else {\n lm = flm, ll = flt, dm = fdm, dl = fdt;\n }\n for (var i = 0; i < li; ++i) {\n if (syms[i] > 255) {\n var len = (syms[i] >>> 18) & 31;\n wbits16(out, p, lm[len + 257]), p += ll[len + 257];\n if (len > 7)\n wbits(out, p, (syms[i] >>> 23) & 31), p += fleb[len];\n var dst = syms[i] & 31;\n wbits16(out, p, dm[dst]), p += dl[dst];\n if (dst > 3)\n wbits16(out, p, (syms[i] >>> 5) & 8191), p += fdeb[dst];\n }\n else {\n wbits16(out, p, lm[syms[i]]), p += ll[syms[i]];\n }\n }\n wbits16(out, p, lm[256]);\n return p + ll[256];\n};\n// deflate options (nice << 13) | chain\nvar deo = /*#__PURE__*/ new u32([65540, 131080, 131088, 131104, 262176, 1048704, 1048832, 2114560, 2117632]);\n// empty\nvar et = /*#__PURE__*/ new u8(0);\n// compresses data into a raw DEFLATE buffer\nvar dflt = function (dat, lvl, plvl, pre, post, lst) {\n var s = dat.length;\n var o = new u8(pre + s + 5 * (1 + Math.ceil(s / 7000)) + post);\n // writing to this writes to the output buffer\n var w = o.subarray(pre, o.length - post);\n var pos = 0;\n if (!lvl || s < 8) {\n for (var i = 0; i <= s; i += 65535) {\n // end\n var e = i + 65535;\n if (e >= s) {\n // write final block\n w[pos >> 3] = lst;\n }\n pos = wfblk(w, pos + 1, dat.subarray(i, e));\n }\n }\n else {\n var opt = deo[lvl - 1];\n var n = opt >>> 13, c = opt & 8191;\n var msk_1 = (1 << plvl) - 1;\n // prev 2-byte val map curr 2-byte val map\n var prev = new u16(32768), head = new u16(msk_1 + 1);\n var bs1_1 = Math.ceil(plvl / 3), bs2_1 = 2 * bs1_1;\n var hsh = function (i) { return (dat[i] ^ (dat[i + 1] << bs1_1) ^ (dat[i + 2] << bs2_1)) & msk_1; };\n // 24576 is an arbitrary number of maximum symbols per block\n // 424 buffer for last block\n var syms = new u32(25000);\n // length/literal freq distance freq\n var lf = new u16(288), df = new u16(32);\n // l/lcnt exbits index l/lind waitdx bitpos\n var lc_1 = 0, eb = 0, i = 0, li = 0, wi = 0, bs = 0;\n for (; i < s; ++i) {\n // hash value\n // deopt when i > s - 3 - at end, deopt acceptable\n var hv = hsh(i);\n // index mod 32768 previous index mod\n var imod = i & 32767, pimod = head[hv];\n prev[imod] = pimod;\n head[hv] = imod;\n // We always should modify head and prev, but only add symbols if\n // this data is not yet processed (\"wait\" for wait index)\n if (wi <= i) {\n // bytes remaining\n var rem = s - i;\n if ((lc_1 > 7000 || li > 24576) && rem > 423) {\n pos = wblk(dat, w, 0, syms, lf, df, eb, li, bs, i - bs, pos);\n li = lc_1 = eb = 0, bs = i;\n for (var j = 0; j < 286; ++j)\n lf[j] = 0;\n for (var j = 0; j < 30; ++j)\n df[j] = 0;\n }\n // len dist chain\n var l = 2, d = 0, ch_1 = c, dif = (imod - pimod) & 32767;\n if (rem > 2 && hv == hsh(i - dif)) {\n var maxn = Math.min(n, rem) - 1;\n var maxd = Math.min(32767, i);\n // max possible length\n // not capped at dif because decompressors implement \"rolling\" index population\n var ml = Math.min(258, rem);\n while (dif <= maxd && --ch_1 && imod != pimod) {\n if (dat[i + l] == dat[i + l - dif]) {\n var nl = 0;\n for (; nl < ml && dat[i + nl] == dat[i + nl - dif]; ++nl)\n ;\n if (nl > l) {\n l = nl, d = dif;\n // break out early when we reach \"nice\" (we are satisfied enough)\n if (nl > maxn)\n break;\n // now, find the rarest 2-byte sequence within this\n // length of literals and search for that instead.\n // Much faster than just using the start\n var mmd = Math.min(dif, nl - 2);\n var md = 0;\n for (var j = 0; j < mmd; ++j) {\n var ti = (i - dif + j + 32768) & 32767;\n var pti = prev[ti];\n var cd = (ti - pti + 32768) & 32767;\n if (cd > md)\n md = cd, pimod = ti;\n }\n }\n }\n // check the previous match\n imod = pimod, pimod = prev[imod];\n dif += (imod - pimod + 32768) & 32767;\n }\n }\n // d will be nonzero only when a match was found\n if (d) {\n // store both dist and len data in one Uint32\n // Make sure this is recognized as a len/dist with 28th bit (2^28)\n syms[li++] = 268435456 | (revfl[l] << 18) | revfd[d];\n var lin = revfl[l] & 31, din = revfd[d] & 31;\n eb += fleb[lin] + fdeb[din];\n ++lf[257 + lin];\n ++df[din];\n wi = i + l;\n ++lc_1;\n }\n else {\n syms[li++] = dat[i];\n ++lf[dat[i]];\n }\n }\n }\n pos = wblk(dat, w, lst, syms, lf, df, eb, li, bs, i - bs, pos);\n // this is the easiest way to avoid needing to maintain state\n if (!lst && pos & 7)\n pos = wfblk(w, pos + 1, et);\n }\n return slc(o, 0, pre + shft(pos) + post);\n};\n// CRC32 table\nvar crct = /*#__PURE__*/ (function () {\n var t = new Int32Array(256);\n for (var i = 0; i < 256; ++i) {\n var c = i, k = 9;\n while (--k)\n c = ((c & 1) && -306674912) ^ (c >>> 1);\n t[i] = c;\n }\n return t;\n})();\n// CRC32\nvar crc = function () {\n var c = -1;\n return {\n p: function (d) {\n // closures have awful performance\n var cr = c;\n for (var i = 0; i < d.length; ++i)\n cr = crct[(cr & 255) ^ d[i]] ^ (cr >>> 8);\n c = cr;\n },\n d: function () { return ~c; }\n };\n};\n// Alder32\nvar adler = function () {\n var a = 1, b = 0;\n return {\n p: function (d) {\n // closures have awful performance\n var n = a, m = b;\n var l = d.length | 0;\n for (var i = 0; i != l;) {\n var e = Math.min(i + 2655, l);\n for (; i < e; ++i)\n m += n += d[i];\n n = (n & 65535) + 15 * (n >> 16), m = (m & 65535) + 15 * (m >> 16);\n }\n a = n, b = m;\n },\n d: function () {\n a %= 65521, b %= 65521;\n return (a & 255) << 24 | (a >>> 8) << 16 | (b & 255) << 8 | (b >>> 8);\n }\n };\n};\n;\n// deflate with opts\nvar dopt = function (dat, opt, pre, post, st) {\n return dflt(dat, opt.level == null ? 6 : opt.level, opt.mem == null ? Math.ceil(Math.max(8, Math.min(13, Math.log(dat.length))) * 1.5) : (12 + opt.mem), pre, post, !st);\n};\n// Walmart object spread\nvar mrg = function (a, b) {\n var o = {};\n for (var k in a)\n o[k] = a[k];\n for (var k in b)\n o[k] = b[k];\n return o;\n};\n// worker clone\n// This is possibly the craziest part of the entire codebase, despite how simple it may seem.\n// The only parameter to this function is a closure that returns an array of variables outside of the function scope.\n// We're going to try to figure out the variable names used in the closure as strings because that is crucial for workerization.\n// We will return an object mapping of true variable name to value (basically, the current scope as a JS object).\n// The reason we can't just use the original variable names is minifiers mangling the toplevel scope.\n// This took me three weeks to figure out how to do.\nvar wcln = function (fn, fnStr, td) {\n var dt = fn();\n var st = fn.toString();\n var ks = st.slice(st.indexOf('[') + 1, st.lastIndexOf(']')).replace(/\\s+/g, '').split(',');\n for (var i = 0; i < dt.length; ++i) {\n var v = dt[i], k = ks[i];\n if (typeof v == 'function') {\n fnStr += ';' + k + '=';\n var st_1 = v.toString();\n if (v.prototype) {\n // for global objects\n if (st_1.indexOf('[native code]') != -1) {\n var spInd = st_1.indexOf(' ', 8) + 1;\n fnStr += st_1.slice(spInd, st_1.indexOf('(', spInd));\n }\n else {\n fnStr += st_1;\n for (var t in v.prototype)\n fnStr += ';' + k + '.prototype.' + t + '=' + v.prototype[t].toString();\n }\n }\n else\n fnStr += st_1;\n }\n else\n td[k] = v;\n }\n return [fnStr, td];\n};\nvar ch = [];\n// clone bufs\nvar cbfs = function (v) {\n var tl = [];\n for (var k in v) {\n if (v[k].buffer) {\n tl.push((v[k] = new v[k].constructor(v[k])).buffer);\n }\n }\n return tl;\n};\n// use a worker to execute code\nvar wrkr = function (fns, init, id, cb) {\n var _a;\n if (!ch[id]) {\n var fnStr = '', td_1 = {}, m = fns.length - 1;\n for (var i = 0; i < m; ++i)\n _a = wcln(fns[i], fnStr, td_1), fnStr = _a[0], td_1 = _a[1];\n ch[id] = wcln(fns[m], fnStr, td_1);\n }\n var td = mrg({}, ch[id][1]);\n return wk(ch[id][0] + ';onmessage=function(e){for(var k in e.data)self[k]=e.data[k];onmessage=' + init.toString() + '}', id, td, cbfs(td), cb);\n};\n// base async inflate fn\nvar bInflt = function () { return [u8, u16, u32, fleb, fdeb, clim, fl, fd, flrm, fdrm, rev, ec, hMap, max, bits, bits16, shft, slc, err, inflt, inflateSync, pbf, gu8]; };\nvar bDflt = function () { return [u8, u16, u32, fleb, fdeb, clim, revfl, revfd, flm, flt, fdm, fdt, rev, deo, et, hMap, wbits, wbits16, hTree, ln, lc, clen, wfblk, wblk, shft, slc, dflt, dopt, deflateSync, pbf]; };\n// gzip extra\nvar gze = function () { return [gzh, gzhl, wbytes, crc, crct]; };\n// gunzip extra\nvar guze = function () { return [gzs, gzl]; };\n// zlib extra\nvar zle = function () { return [zlh, wbytes, adler]; };\n// unzlib extra\nvar zule = function () { return [zlv]; };\n// post buf\nvar pbf = function (msg) { return postMessage(msg, [msg.buffer]); };\n// get u8\nvar gu8 = function (o) { return o && o.size && new u8(o.size); };\n// async helper\nvar cbify = function (dat, opts, fns, init, id, cb) {\n var w = wrkr(fns, init, id, function (err, dat) {\n w.terminate();\n cb(err, dat);\n });\n w.postMessage([dat, opts], opts.consume ? [dat.buffer] : []);\n return function () { w.terminate(); };\n};\n// auto stream\nvar astrm = function (strm) {\n strm.ondata = function (dat, final) { return postMessage([dat, final], [dat.buffer]); };\n return function (ev) { return strm.push(ev.data[0], ev.data[1]); };\n};\n// async stream attach\nvar astrmify = function (fns, strm, opts, init, id) {\n var t;\n var w = wrkr(fns, init, id, function (err, dat) {\n if (err)\n w.terminate(), strm.ondata.call(strm, err);\n else {\n if (dat[1])\n w.terminate();\n strm.ondata.call(strm, err, dat[0], dat[1]);\n }\n });\n w.postMessage(opts);\n strm.push = function (d, f) {\n if (!strm.ondata)\n err(5);\n if (t)\n strm.ondata(err(4, 0, 1), null, !!f);\n w.postMessage([d, t = f], [d.buffer]);\n };\n strm.terminate = function () { w.terminate(); };\n};\n// read 2 bytes\nvar b2 = function (d, b) { return d[b] | (d[b + 1] << 8); };\n// read 4 bytes\nvar b4 = function (d, b) { return (d[b] | (d[b + 1] << 8) | (d[b + 2] << 16) | (d[b + 3] << 24)) >>> 0; };\nvar b8 = function (d, b) { return b4(d, b) + (b4(d, b + 4) * 4294967296); };\n// write bytes\nvar wbytes = function (d, b, v) {\n for (; v; ++b)\n d[b] = v, v >>>= 8;\n};\n// gzip header\nvar gzh = function (c, o) {\n var fn = o.filename;\n c[0] = 31, c[1] = 139, c[2] = 8, c[8] = o.level < 2 ? 4 : o.level == 9 ? 2 : 0, c[9] = 3; // assume Unix\n if (o.mtime != 0)\n wbytes(c, 4, Math.floor(new Date(o.mtime || Date.now()) / 1000));\n if (fn) {\n c[3] = 8;\n for (var i = 0; i <= fn.length; ++i)\n c[i + 10] = fn.charCodeAt(i);\n }\n};\n// gzip footer: -8 to -4 = CRC, -4 to -0 is length\n// gzip start\nvar gzs = function (d) {\n if (d[0] != 31 || d[1] != 139 || d[2] != 8)\n err(6, 'invalid gzip data');\n var flg = d[3];\n var st = 10;\n if (flg & 4)\n st += d[10] | (d[11] << 8) + 2;\n for (var zs = (flg >> 3 & 1) + (flg >> 4 & 1); zs > 0; zs -= !d[st++])\n ;\n return st + (flg & 2);\n};\n// gzip length\nvar gzl = function (d) {\n var l = d.length;\n return ((d[l - 4] | d[l - 3] << 8 | d[l - 2] << 16) | (d[l - 1] << 24)) >>> 0;\n};\n// gzip header length\nvar gzhl = function (o) { return 10 + ((o.filename && (o.filename.length + 1)) || 0); };\n// zlib header\nvar zlh = function (c, o) {\n var lv = o.level, fl = lv == 0 ? 0 : lv < 6 ? 1 : lv == 9 ? 3 : 2;\n c[0] = 120, c[1] = (fl << 6) | (fl ? (32 - 2 * fl) : 1);\n};\n// zlib valid\nvar zlv = function (d) {\n if ((d[0] & 15) != 8 || (d[0] >>> 4) > 7 || ((d[0] << 8 | d[1]) % 31))\n err(6, 'invalid zlib data');\n if (d[1] & 32)\n err(6, 'invalid zlib data: preset dictionaries not supported');\n};\nfunction AsyncCmpStrm(opts, cb) {\n if (!cb && typeof opts == 'function')\n cb = opts, opts = {};\n this.ondata = cb;\n return opts;\n}\n// zlib footer: -4 to -0 is Adler32\n/**\n * Streaming DEFLATE compression\n */\nvar Deflate = /*#__PURE__*/ (function () {\n function Deflate(opts, cb) {\n if (!cb && typeof opts == 'function')\n cb = opts, opts = {};\n this.ondata = cb;\n this.o = opts || {};\n }\n Deflate.prototype.p = function (c, f) {\n this.ondata(dopt(c, this.o, 0, 0, !f), f);\n };\n /**\n * Pushes a chunk to be deflated\n * @param chunk The chunk to push\n * @param final Whether this is the last chunk\n */\n Deflate.prototype.push = function (chunk, final) {\n if (!this.ondata)\n err(5);\n if (this.d)\n err(4);\n this.d = final;\n this.p(chunk, final || false);\n };\n return Deflate;\n}());\nexport { Deflate };\n/**\n * Asynchronous streaming DEFLATE compression\n */\nvar AsyncDeflate = /*#__PURE__*/ (function () {\n function AsyncDeflate(opts, cb) {\n astrmify([\n bDflt,\n function () { return [astrm, Deflate]; }\n ], this, AsyncCmpStrm.call(this, opts, cb), function (ev) {\n var strm = new Deflate(ev.data);\n onmessage = astrm(strm);\n }, 6);\n }\n return AsyncDeflate;\n}());\nexport { AsyncDeflate };\nexport function deflate(data, opts, cb) {\n if (!cb)\n cb = opts, opts = {};\n if (typeof cb != 'function')\n err(7);\n return cbify(data, opts, [\n bDflt,\n ], function (ev) { return pbf(deflateSync(ev.data[0], ev.data[1])); }, 0, cb);\n}\n/**\n * Compresses data with DEFLATE without any wrapper\n * @param data The data to compress\n * @param opts The compression options\n * @returns The deflated version of the data\n */\nexport function deflateSync(data, opts) {\n return dopt(data, opts || {}, 0, 0);\n}\n/**\n * Streaming DEFLATE decompression\n */\nvar Inflate = /*#__PURE__*/ (function () {\n /**\n * Creates an inflation stream\n * @param cb The callback to call whenever data is inflated\n */\n function Inflate(cb) {\n this.s = {};\n this.p = new u8(0);\n this.ondata = cb;\n }\n Inflate.prototype.e = function (c) {\n if (!this.ondata)\n err(5);\n if (this.d)\n err(4);\n var l = this.p.length;\n var n = new u8(l + c.length);\n n.set(this.p), n.set(c, l), this.p = n;\n };\n Inflate.prototype.c = function (final) {\n this.d = this.s.i = final || false;\n var bts = this.s.b;\n var dt = inflt(this.p, this.o, this.s);\n this.ondata(slc(dt, bts, this.s.b), this.d);\n this.o = slc(dt, this.s.b - 32768), this.s.b = this.o.length;\n this.p = slc(this.p, (this.s.p / 8) | 0), this.s.p &= 7;\n };\n /**\n * Pushes a chunk to be inflated\n * @param chunk The chunk to push\n * @param final Whether this is the final chunk\n */\n Inflate.prototype.push = function (chunk, final) {\n this.e(chunk), this.c(final);\n };\n return Inflate;\n}());\nexport { Inflate };\n/**\n * Asynchronous streaming DEFLATE decompression\n */\nvar AsyncInflate = /*#__PURE__*/ (function () {\n /**\n * Creates an asynchronous inflation stream\n * @param cb The callback to call whenever data is deflated\n */\n function AsyncInflate(cb) {\n this.ondata = cb;\n astrmify([\n bInflt,\n function () { return [astrm, Inflate]; }\n ], this, 0, function () {\n var strm = new Inflate();\n onmessage = astrm(strm);\n }, 7);\n }\n return AsyncInflate;\n}());\nexport { AsyncInflate };\nexport function inflate(data, opts, cb) {\n if (!cb)\n cb = opts, opts = {};\n if (typeof cb != 'function')\n err(7);\n return cbify(data, opts, [\n bInflt\n ], function (ev) { return pbf(inflateSync(ev.data[0], gu8(ev.data[1]))); }, 1, cb);\n}\n/**\n * Expands DEFLATE data with no wrapper\n * @param data The data to decompress\n * @param out Where to write the data. Saves memory if you know the decompressed size and provide an output buffer of that length.\n * @returns The decompressed version of the data\n */\nexport function inflateSync(data, out) {\n return inflt(data, out);\n}\n// before you yell at me for not just using extends, my reason is that TS inheritance is hard to workerize.\n/**\n * Streaming GZIP compression\n */\nvar Gzip = /*#__PURE__*/ (function () {\n function Gzip(opts, cb) {\n this.c = crc();\n this.l = 0;\n this.v = 1;\n Deflate.call(this, opts, cb);\n }\n /**\n * Pushes a chunk to be GZIPped\n * @param chunk The chunk to push\n * @param final Whether this is the last chunk\n */\n Gzip.prototype.push = function (chunk, final) {\n Deflate.prototype.push.call(this, chunk, final);\n };\n Gzip.prototype.p = function (c, f) {\n this.c.p(c);\n this.l += c.length;\n var raw = dopt(c, this.o, this.v && gzhl(this.o), f && 8, !f);\n if (this.v)\n gzh(raw, this.o), this.v = 0;\n if (f)\n wbytes(raw, raw.length - 8, this.c.d()), wbytes(raw, raw.length - 4, this.l);\n this.ondata(raw, f);\n };\n return Gzip;\n}());\nexport { Gzip };\n/**\n * Asynchronous streaming GZIP compression\n */\nvar AsyncGzip = /*#__PURE__*/ (function () {\n function AsyncGzip(opts, cb) {\n astrmify([\n bDflt,\n gze,\n function () { return [astrm, Deflate, Gzip]; }\n ], this, AsyncCmpStrm.call(this, opts, cb), function (ev) {\n var strm = new Gzip(ev.data);\n onmessage = astrm(strm);\n }, 8);\n }\n return AsyncGzip;\n}());\nexport { AsyncGzip };\nexport function gzip(data, opts, cb) {\n if (!cb)\n cb = opts, opts = {};\n if (typeof cb != 'function')\n err(7);\n return cbify(data, opts, [\n bDflt,\n gze,\n function () { return [gzipSync]; }\n ], function (ev) { return pbf(gzipSync(ev.data[0], ev.data[1])); }, 2, cb);\n}\n/**\n * Compresses data with GZIP\n * @param data The data to compress\n * @param opts The compression options\n * @returns The gzipped version of the data\n */\nexport function gzipSync(data, opts) {\n if (!opts)\n opts = {};\n var c = crc(), l = data.length;\n c.p(data);\n var d = dopt(data, opts, gzhl(opts), 8), s = d.length;\n return gzh(d, opts), wbytes(d, s - 8, c.d()), wbytes(d, s - 4, l), d;\n}\n/**\n * Streaming GZIP decompression\n */\nvar Gunzip = /*#__PURE__*/ (function () {\n /**\n * Creates a GUNZIP stream\n * @param cb The callback to call whenever data is inflated\n */\n function Gunzip(cb) {\n this.v = 1;\n Inflate.call(this, cb);\n }\n /**\n * Pushes a chunk to be GUNZIPped\n * @param chunk The chunk to push\n * @param final Whether this is the last chunk\n */\n Gunzip.prototype.push = function (chunk, final) {\n Inflate.prototype.e.call(this, chunk);\n if (this.v) {\n var s = this.p.length > 3 ? gzs(this.p) : 4;\n if (s >= this.p.length && !final)\n return;\n this.p = this.p.subarray(s), this.v = 0;\n }\n if (final) {\n if (this.p.length < 8)\n err(6, 'invalid gzip data');\n this.p = this.p.subarray(0, -8);\n }\n // necessary to prevent TS from using the closure value\n // This allows for workerization to function correctly\n Inflate.prototype.c.call(this, final);\n };\n return Gunzip;\n}());\nexport { Gunzip };\n/**\n * Asynchronous streaming GZIP decompression\n */\nvar AsyncGunzip = /*#__PURE__*/ (function () {\n /**\n * Creates an asynchronous GUNZIP stream\n * @param cb The callback to call whenever data is deflated\n */\n function AsyncGunzip(cb) {\n this.ondata = cb;\n astrmify([\n bInflt,\n guze,\n function () { return [astrm, Inflate, Gunzip]; }\n ], this, 0, function () {\n var strm = new Gunzip();\n onmessage = astrm(strm);\n }, 9);\n }\n return AsyncGunzip;\n}());\nexport { AsyncGunzip };\nexport function gunzip(data, opts, cb) {\n if (!cb)\n cb = opts, opts = {};\n if (typeof cb != 'function')\n err(7);\n return cbify(data, opts, [\n bInflt,\n guze,\n function () { return [gunzipSync]; }\n ], function (ev) { return pbf(gunzipSync(ev.data[0])); }, 3, cb);\n}\n/**\n * Expands GZIP data\n * @param data The data to decompress\n * @param out Where to write the data. GZIP already encodes the output size, so providing this doesn't save memory.\n * @returns The decompressed version of the data\n */\nexport function gunzipSync(data, out) {\n return inflt(data.subarray(gzs(data), -8), out || new u8(gzl(data)));\n}\n/**\n * Streaming Zlib compression\n */\nvar Zlib = /*#__PURE__*/ (function () {\n function Zlib(opts, cb) {\n this.c = adler();\n this.v = 1;\n Deflate.call(this, opts, cb);\n }\n /**\n * Pushes a chunk to be zlibbed\n * @param chunk The chunk to push\n * @param final Whether this is the last chunk\n */\n Zlib.prototype.push = function (chunk, final) {\n Deflate.prototype.push.call(this, chunk, final);\n };\n Zlib.prototype.p = function (c, f) {\n this.c.p(c);\n var raw = dopt(c, this.o, this.v && 2, f && 4, !f);\n if (this.v)\n zlh(raw, this.o), this.v = 0;\n if (f)\n wbytes(raw, raw.length - 4, this.c.d());\n this.ondata(raw, f);\n };\n return Zlib;\n}());\nexport { Zlib };\n/**\n * Asynchronous streaming Zlib compression\n */\nvar AsyncZlib = /*#__PURE__*/ (function () {\n function AsyncZlib(opts, cb) {\n astrmify([\n bDflt,\n zle,\n function () { return [astrm, Deflate, Zlib]; }\n ], this, AsyncCmpStrm.call(this, opts, cb), function (ev) {\n var strm = new Zlib(ev.data);\n onmessage = astrm(strm);\n }, 10);\n }\n return AsyncZlib;\n}());\nexport { AsyncZlib };\nexport function zlib(data, opts, cb) {\n if (!cb)\n cb = opts, opts = {};\n if (typeof cb != 'function')\n err(7);\n return cbify(data, opts, [\n bDflt,\n zle,\n function () { return [zlibSync]; }\n ], function (ev) { return pbf(zlibSync(ev.data[0], ev.data[1])); }, 4, cb);\n}\n/**\n * Compress data with Zlib\n * @param data The data to compress\n * @param opts The compression options\n * @returns The zlib-compressed version of the data\n */\nexport function zlibSync(data, opts) {\n if (!opts)\n opts = {};\n var a = adler();\n a.p(data);\n var d = dopt(data, opts, 2, 4);\n return zlh(d, opts), wbytes(d, d.length - 4, a.d()), d;\n}\n/**\n * Streaming Zlib decompression\n */\nvar Unzlib = /*#__PURE__*/ (function () {\n /**\n * Creates a Zlib decompression stream\n * @param cb The callback to call whenever data is inflated\n */\n function Unzlib(cb) {\n this.v = 1;\n Inflate.call(this, cb);\n }\n /**\n * Pushes a chunk to be unzlibbed\n * @param chunk The chunk to push\n * @param final Whether this is the last chunk\n */\n Unzlib.prototype.push = function (chunk, final) {\n Inflate.prototype.e.call(this, chunk);\n if (this.v) {\n if (this.p.length < 2 && !final)\n return;\n this.p = this.p.subarray(2), this.v = 0;\n }\n if (final) {\n if (this.p.length < 4)\n err(6, 'invalid zlib data');\n this.p = this.p.subarray(0, -4);\n }\n // necessary to prevent TS from using the closure value\n // This allows for workerization to function correctly\n Inflate.prototype.c.call(this, final);\n };\n return Unzlib;\n}());\nexport { Unzlib };\n/**\n * Asynchronous streaming Zlib decompression\n */\nvar AsyncUnzlib = /*#__PURE__*/ (function () {\n /**\n * Creates an asynchronous Zlib decompression stream\n * @param cb The callback to call whenever data is deflated\n */\n function AsyncUnzlib(cb) {\n this.ondata = cb;\n astrmify([\n bInflt,\n zule,\n function () { return [astrm, Inflate, Unzlib]; }\n ], this, 0, function () {\n var strm = new Unzlib();\n onmessage = astrm(strm);\n }, 11);\n }\n return AsyncUnzlib;\n}());\nexport { AsyncUnzlib };\nexport function unzlib(data, opts, cb) {\n if (!cb)\n cb = opts, opts = {};\n if (typeof cb != 'function')\n err(7);\n return cbify(data, opts, [\n bInflt,\n zule,\n function () { return [unzlibSync]; }\n ], function (ev) { return pbf(unzlibSync(ev.data[0], gu8(ev.data[1]))); }, 5, cb);\n}\n/**\n * Expands Zlib data\n * @param data The data to decompress\n * @param out Where to write the data. Saves memory if you know the decompressed size and provide an output buffer of that length.\n * @returns The decompressed version of the data\n */\nexport function unzlibSync(data, out) {\n return inflt((zlv(data), data.subarray(2, -4)), out);\n}\n// Default algorithm for compression (used because having a known output size allows faster decompression)\nexport { gzip as compress, AsyncGzip as AsyncCompress };\n// Default algorithm for compression (used because having a known output size allows faster decompression)\nexport { gzipSync as compressSync, Gzip as Compress };\n/**\n * Streaming GZIP, Zlib, or raw DEFLATE decompression\n */\nvar Decompress = /*#__PURE__*/ (function () {\n /**\n * Creates a decompression stream\n * @param cb The callback to call whenever data is decompressed\n */\n function Decompress(cb) {\n this.G = Gunzip;\n this.I = Inflate;\n this.Z = Unzlib;\n this.ondata = cb;\n }\n /**\n * Pushes a chunk to be decompressed\n * @param chunk The chunk to push\n * @param final Whether this is the last chunk\n */\n Decompress.prototype.push = function (chunk, final) {\n if (!this.ondata)\n err(5);\n if (!this.s) {\n if (this.p && this.p.length) {\n var n = new u8(this.p.length + chunk.length);\n n.set(this.p), n.set(chunk, this.p.length);\n }\n else\n this.p = chunk;\n if (this.p.length > 2) {\n var _this_1 = this;\n var cb = function () { _this_1.ondata.apply(_this_1, arguments); };\n this.s = (this.p[0] == 31 && this.p[1] == 139 && this.p[2] == 8)\n ? new this.G(cb)\n : ((this.p[0] & 15) != 8 || (this.p[0] >> 4) > 7 || ((this.p[0] << 8 | this.p[1]) % 31))\n ? new this.I(cb)\n : new this.Z(cb);\n this.s.push(this.p, final);\n this.p = null;\n }\n }\n else\n this.s.push(chunk, final);\n };\n return Decompress;\n}());\nexport { Decompress };\n/**\n * Asynchronous streaming GZIP, Zlib, or raw DEFLATE decompression\n */\nvar AsyncDecompress = /*#__PURE__*/ (function () {\n /**\n * Creates an asynchronous decompression stream\n * @param cb The callback to call whenever data is decompressed\n */\n function AsyncDecompress(cb) {\n this.G = AsyncGunzip;\n this.I = AsyncInflate;\n this.Z = AsyncUnzlib;\n this.ondata = cb;\n }\n /**\n * Pushes a chunk to be decompressed\n * @param chunk The chunk to push\n * @param final Whether this is the last chunk\n */\n AsyncDecompress.prototype.push = function (chunk, final) {\n Decompress.prototype.push.call(this, chunk, final);\n };\n return AsyncDecompress;\n}());\nexport { AsyncDecompress };\nexport function decompress(data, opts, cb) {\n if (!cb)\n cb = opts, opts = {};\n if (typeof cb != 'function')\n err(7);\n return (data[0] == 31 && data[1] == 139 && data[2] == 8)\n ? gunzip(data, opts, cb)\n : ((data[0] & 15) != 8 || (data[0] >> 4) > 7 || ((data[0] << 8 | data[1]) % 31))\n ? inflate(data, opts, cb)\n : unzlib(data, opts, cb);\n}\n/**\n * Expands compressed GZIP, Zlib, or raw DEFLATE data, automatically detecting the format\n * @param data The data to decompress\n * @param out Where to write the data. Saves memory if you know the decompressed size and provide an output buffer of that length.\n * @returns The decompressed version of the data\n */\nexport function decompressSync(data, out) {\n return (data[0] == 31 && data[1] == 139 && data[2] == 8)\n ? gunzipSync(data, out)\n : ((data[0] & 15) != 8 || (data[0] >> 4) > 7 || ((data[0] << 8 | data[1]) % 31))\n ? inflateSync(data, out)\n : unzlibSync(data, out);\n}\n// flatten a directory structure\nvar fltn = function (d, p, t, o) {\n for (var k in d) {\n var val = d[k], n = p + k, op = o;\n if (Array.isArray(val))\n op = mrg(o, val[1]), val = val[0];\n if (val instanceof u8)\n t[n] = [val, op];\n else {\n t[n += '/'] = [new u8(0), op];\n fltn(val, n, t, o);\n }\n }\n};\n// text encoder\nvar te = typeof TextEncoder != 'undefined' && /*#__PURE__*/ new TextEncoder();\n// text decoder\nvar td = typeof TextDecoder != 'undefined' && /*#__PURE__*/ new TextDecoder();\n// text decoder stream\nvar tds = 0;\ntry {\n td.decode(et, { stream: true });\n tds = 1;\n}\ncatch (e) { }\n// decode UTF8\nvar dutf8 = function (d) {\n for (var r = '', i = 0;;) {\n var c = d[i++];\n var eb = (c > 127) + (c > 223) + (c > 239);\n if (i + eb > d.length)\n return [r, slc(d, i - 1)];\n if (!eb)\n r += String.fromCharCode(c);\n else if (eb == 3) {\n c = ((c & 15) << 18 | (d[i++] & 63) << 12 | (d[i++] & 63) << 6 | (d[i++] & 63)) - 65536,\n r += String.fromCharCode(55296 | (c >> 10), 56320 | (c & 1023));\n }\n else if (eb & 1)\n r += String.fromCharCode((c & 31) << 6 | (d[i++] & 63));\n else\n r += String.fromCharCode((c & 15) << 12 | (d[i++] & 63) << 6 | (d[i++] & 63));\n }\n};\n/**\n * Streaming UTF-8 decoding\n */\nvar DecodeUTF8 = /*#__PURE__*/ (function () {\n /**\n * Creates a UTF-8 decoding stream\n * @param cb The callback to call whenever data is decoded\n */\n function DecodeUTF8(cb) {\n this.ondata = cb;\n if (tds)\n this.t = new TextDecoder();\n else\n this.p = et;\n }\n /**\n * Pushes a chunk to be decoded from UTF-8 binary\n * @param chunk The chunk to push\n * @param final Whether this is the last chunk\n */\n DecodeUTF8.prototype.push = function (chunk, final) {\n if (!this.ondata)\n err(5);\n final = !!final;\n if (this.t) {\n this.ondata(this.t.decode(chunk, { stream: true }), final);\n if (final) {\n if (this.t.decode().length)\n err(8);\n this.t = null;\n }\n return;\n }\n if (!this.p)\n err(4);\n var dat = new u8(this.p.length + chunk.length);\n dat.set(this.p);\n dat.set(chunk, this.p.length);\n var _a = dutf8(dat), ch = _a[0], np = _a[1];\n if (final) {\n if (np.length)\n err(8);\n this.p = null;\n }\n else\n this.p = np;\n this.ondata(ch, final);\n };\n return DecodeUTF8;\n}());\nexport { DecodeUTF8 };\n/**\n * Streaming UTF-8 encoding\n */\nvar EncodeUTF8 = /*#__PURE__*/ (function () {\n /**\n * Creates a UTF-8 decoding stream\n * @param cb The callback to call whenever data is encoded\n */\n function EncodeUTF8(cb) {\n this.ondata = cb;\n }\n /**\n * Pushes a chunk to be encoded to UTF-8\n * @param chunk The string data to push\n * @param final Whether this is the last chunk\n */\n EncodeUTF8.prototype.push = function (chunk, final) {\n if (!this.ondata)\n err(5);\n if (this.d)\n err(4);\n this.ondata(strToU8(chunk), this.d = final || false);\n };\n return EncodeUTF8;\n}());\nexport { EncodeUTF8 };\n/**\n * Converts a string into a Uint8Array for use with compression/decompression methods\n * @param str The string to encode\n * @param latin1 Whether or not to interpret the data as Latin-1. This should\n * not need to be true unless decoding a binary string.\n * @returns The string encoded in UTF-8/Latin-1 binary\n */\nexport function strToU8(str, latin1) {\n if (latin1) {\n var ar_1 = new u8(str.length);\n for (var i = 0; i < str.length; ++i)\n ar_1[i] = str.charCodeAt(i);\n return ar_1;\n }\n if (te)\n return te.encode(str);\n var l = str.length;\n var ar = new u8(str.length + (str.length >> 1));\n var ai = 0;\n var w = function (v) { ar[ai++] = v; };\n for (var i = 0; i < l; ++i) {\n if (ai + 5 > ar.length) {\n var n = new u8(ai + 8 + ((l - i) << 1));\n n.set(ar);\n ar = n;\n }\n var c = str.charCodeAt(i);\n if (c < 128 || latin1)\n w(c);\n else if (c < 2048)\n w(192 | (c >> 6)), w(128 | (c & 63));\n else if (c > 55295 && c < 57344)\n c = 65536 + (c & 1023 << 10) | (str.charCodeAt(++i) & 1023),\n w(240 | (c >> 18)), w(128 | ((c >> 12) & 63)), w(128 | ((c >> 6) & 63)), w(128 | (c & 63));\n else\n w(224 | (c >> 12)), w(128 | ((c >> 6) & 63)), w(128 | (c & 63));\n }\n return slc(ar, 0, ai);\n}\n/**\n * Converts a Uint8Array to a string\n * @param dat The data to decode to string\n * @param latin1 Whether or not to interpret the data as Latin-1. This should\n * not need to be true unless encoding to binary string.\n * @returns The original UTF-8/Latin-1 string\n */\nexport function strFromU8(dat, latin1) {\n if (latin1) {\n var r = '';\n for (var i = 0; i < dat.length; i += 16384)\n r += String.fromCharCode.apply(null, dat.subarray(i, i + 16384));\n return r;\n }\n else if (td)\n return td.decode(dat);\n else {\n var _a = dutf8(dat), out = _a[0], ext = _a[1];\n if (ext.length)\n err(8);\n return out;\n }\n}\n;\n// deflate bit flag\nvar dbf = function (l) { return l == 1 ? 3 : l < 6 ? 2 : l == 9 ? 1 : 0; };\n// skip local zip header\nvar slzh = function (d, b) { return b + 30 + b2(d, b + 26) + b2(d, b + 28); };\n// read zip header\nvar zh = function (d, b, z) {\n var fnl = b2(d, b + 28), fn = strFromU8(d.subarray(b + 46, b + 46 + fnl), !(b2(d, b + 8) & 2048)), es = b + 46 + fnl, bs = b4(d, b + 20);\n var _a = z && bs == 4294967295 ? z64e(d, es) : [bs, b4(d, b + 24), b4(d, b + 42)], sc = _a[0], su = _a[1], off = _a[2];\n return [b2(d, b + 10), sc, su, fn, es + b2(d, b + 30) + b2(d, b + 32), off];\n};\n// read zip64 extra field\nvar z64e = function (d, b) {\n for (; b2(d, b) != 1; b += 4 + b2(d, b + 2))\n ;\n return [b8(d, b + 12), b8(d, b + 4), b8(d, b + 20)];\n};\n// extra field length\nvar exfl = function (ex) {\n var le = 0;\n if (ex) {\n for (var k in ex) {\n var l = ex[k].length;\n if (l > 65535)\n err(9);\n le += l + 4;\n }\n }\n return le;\n};\n// write zip header\nvar wzh = function (d, b, f, fn, u, c, ce, co) {\n var fl = fn.length, ex = f.extra, col = co && co.length;\n var exl = exfl(ex);\n wbytes(d, b, ce != null ? 0x2014B50 : 0x4034B50), b += 4;\n if (ce != null)\n d[b++] = 20, d[b++] = f.os;\n d[b] = 20, b += 2; // spec compliance? what's that?\n d[b++] = (f.flag << 1) | (c == null && 8), d[b++] = u && 8;\n d[b++] = f.compression & 255, d[b++] = f.compression >> 8;\n var dt = new Date(f.mtime == null ? Date.now() : f.mtime), y = dt.getFullYear() - 1980;\n if (y < 0 || y > 119)\n err(10);\n wbytes(d, b, (y << 25) | ((dt.getMonth() + 1) << 21) | (dt.getDate() << 16) | (dt.getHours() << 11) | (dt.getMinutes() << 5) | (dt.getSeconds() >>> 1)), b += 4;\n if (c != null) {\n wbytes(d, b, f.crc);\n wbytes(d, b + 4, c);\n wbytes(d, b + 8, f.size);\n }\n wbytes(d, b + 12, fl);\n wbytes(d, b + 14, exl), b += 16;\n if (ce != null) {\n wbytes(d, b, col);\n wbytes(d, b + 6, f.attrs);\n wbytes(d, b + 10, ce), b += 14;\n }\n d.set(fn, b);\n b += fl;\n if (exl) {\n for (var k in ex) {\n var exf = ex[k], l = exf.length;\n wbytes(d, b, +k);\n wbytes(d, b + 2, l);\n d.set(exf, b + 4), b += 4 + l;\n }\n }\n if (col)\n d.set(co, b), b += col;\n return b;\n};\n// write zip footer (end of central directory)\nvar wzf = function (o, b, c, d, e) {\n wbytes(o, b, 0x6054B50); // skip disk\n wbytes(o, b + 8, c);\n wbytes(o, b + 10, c);\n wbytes(o, b + 12, d);\n wbytes(o, b + 16, e);\n};\n/**\n * A pass-through stream to keep data uncompressed in a ZIP archive.\n */\nvar ZipPassThrough = /*#__PURE__*/ (function () {\n /**\n * Creates a pass-through stream that can be added to ZIP archives\n * @param filename The filename to associate with this data stream\n */\n function ZipPassThrough(filename) {\n this.filename = filename;\n this.c = crc();\n this.size = 0;\n this.compression = 0;\n }\n /**\n * Processes a chunk and pushes to the output stream. You can override this\n * method in a subclass for custom behavior, but by default this passes\n * the data through. You must call this.ondata(err, chunk, final) at some\n * point in this method.\n * @param chunk The chunk to process\n * @param final Whether this is the last chunk\n */\n ZipPassThrough.prototype.process = function (chunk, final) {\n this.ondata(null, chunk, final);\n };\n /**\n * Pushes a chunk to be added. If you are subclassing this with a custom\n * compression algorithm, note that you must push data from the source\n * file only, pre-compression.\n * @param chunk The chunk to push\n * @param final Whether this is the last chunk\n */\n ZipPassThrough.prototype.push = function (chunk, final) {\n if (!this.ondata)\n err(5);\n this.c.p(chunk);\n this.size += chunk.length;\n if (final)\n this.crc = this.c.d();\n this.process(chunk, final || false);\n };\n return ZipPassThrough;\n}());\nexport { ZipPassThrough };\n// I don't extend because TypeScript extension adds 1kB of runtime bloat\n/**\n * Streaming DEFLATE compression for ZIP archives. Prefer using AsyncZipDeflate\n * for better performance\n */\nvar ZipDeflate = /*#__PURE__*/ (function () {\n /**\n * Creates a DEFLATE stream that can be added to ZIP archives\n * @param filename The filename to associate with this data stream\n * @param opts The compression options\n */\n function ZipDeflate(filename, opts) {\n var _this_1 = this;\n if (!opts)\n opts = {};\n ZipPassThrough.call(this, filename);\n this.d = new Deflate(opts, function (dat, final) {\n _this_1.ondata(null, dat, final);\n });\n this.compression = 8;\n this.flag = dbf(opts.level);\n }\n ZipDeflate.prototype.process = function (chunk, final) {\n try {\n this.d.push(chunk, final);\n }\n catch (e) {\n this.ondata(e, null, final);\n }\n };\n /**\n * Pushes a chunk to be deflated\n * @param chunk The chunk to push\n * @param final Whether this is the last chunk\n */\n ZipDeflate.prototype.push = function (chunk, final) {\n ZipPassThrough.prototype.push.call(this, chunk, final);\n };\n return ZipDeflate;\n}());\nexport { ZipDeflate };\n/**\n * Asynchronous streaming DEFLATE compression for ZIP archives\n */\nvar AsyncZipDeflate = /*#__PURE__*/ (function () {\n /**\n * Creates a DEFLATE stream that can be added to ZIP archives\n * @param filename The filename to associate with this data stream\n * @param opts The compression options\n */\n function AsyncZipDeflate(filename, opts) {\n var _this_1 = this;\n if (!opts)\n opts = {};\n ZipPassThrough.call(this, filename);\n this.d = new AsyncDeflate(opts, function (err, dat, final) {\n _this_1.ondata(err, dat, final);\n });\n this.compression = 8;\n this.flag = dbf(opts.level);\n this.terminate = this.d.terminate;\n }\n AsyncZipDeflate.prototype.process = function (chunk, final) {\n this.d.push(chunk, final);\n };\n /**\n * Pushes a chunk to be deflated\n * @param chunk The chunk to push\n * @param final Whether this is the last chunk\n */\n AsyncZipDeflate.prototype.push = function (chunk, final) {\n ZipPassThrough.prototype.push.call(this, chunk, final);\n };\n return AsyncZipDeflate;\n}());\nexport { AsyncZipDeflate };\n// TODO: Better tree shaking\n/**\n * A zippable archive to which files can incrementally be added\n */\nvar Zip = /*#__PURE__*/ (function () {\n /**\n * Creates an empty ZIP archive to which files can be added\n * @param cb The callback to call whenever data for the generated ZIP archive\n * is available\n */\n function Zip(cb) {\n this.ondata = cb;\n this.u = [];\n this.d = 1;\n }\n /**\n * Adds a file to the ZIP archive\n * @param file The file stream to add\n */\n Zip.prototype.add = function (file) {\n var _this_1 = this;\n if (!this.ondata)\n err(5);\n // finishing or finished\n if (this.d & 2)\n this.ondata(err(4 + (this.d & 1) * 8, 0, 1), null, false);\n else {\n var f = strToU8(file.filename), fl_1 = f.length;\n var com = file.comment, o = com && strToU8(com);\n var u = fl_1 != file.filename.length || (o && (com.length != o.length));\n var hl_1 = fl_1 + exfl(file.extra) + 30;\n if (fl_1 > 65535)\n this.ondata(err(11, 0, 1), null, false);\n var header = new u8(hl_1);\n wzh(header, 0, file, f, u);\n var chks_1 = [header];\n var pAll_1 = function () {\n for (var _i = 0, chks_2 = chks_1; _i < chks_2.length; _i++) {\n var chk = chks_2[_i];\n _this_1.ondata(null, chk, false);\n }\n chks_1 = [];\n };\n var tr_1 = this.d;\n this.d = 0;\n var ind_1 = this.u.length;\n var uf_1 = mrg(file, {\n f: f,\n u: u,\n o: o,\n t: function () {\n if (file.terminate)\n file.terminate();\n },\n r: function () {\n pAll_1();\n if (tr_1) {\n var nxt = _this_1.u[ind_1 + 1];\n if (nxt)\n nxt.r();\n else\n _this_1.d = 1;\n }\n tr_1 = 1;\n }\n });\n var cl_1 = 0;\n file.ondata = function (err, dat, final) {\n if (err) {\n _this_1.ondata(err, dat, final);\n _this_1.terminate();\n }\n else {\n cl_1 += dat.length;\n chks_1.push(dat);\n if (final) {\n var dd = new u8(16);\n wbytes(dd, 0, 0x8074B50);\n wbytes(dd, 4, file.crc);\n wbytes(dd, 8, cl_1);\n wbytes(dd, 12, file.size);\n chks_1.push(dd);\n uf_1.c = cl_1, uf_1.b = hl_1 + cl_1 + 16, uf_1.crc = file.crc, uf_1.size = file.size;\n if (tr_1)\n uf_1.r();\n tr_1 = 1;\n }\n else if (tr_1)\n pAll_1();\n }\n };\n this.u.push(uf_1);\n }\n };\n /**\n * Ends the process of adding files and prepares to emit the final chunks.\n * This *must* be called after adding all desired files for the resulting\n * ZIP file to work properly.\n */\n Zip.prototype.end = function () {\n var _this_1 = this;\n if (this.d & 2) {\n this.ondata(err(4 + (this.d & 1) * 8, 0, 1), null, true);\n return;\n }\n if (this.d)\n this.e();\n else\n this.u.push({\n r: function () {\n if (!(_this_1.d & 1))\n return;\n _this_1.u.splice(-1, 1);\n _this_1.e();\n },\n t: function () { }\n });\n this.d = 3;\n };\n Zip.prototype.e = function () {\n var bt = 0, l = 0, tl = 0;\n for (var _i = 0, _a = this.u; _i < _a.length; _i++) {\n var f = _a[_i];\n tl += 46 + f.f.length + exfl(f.extra) + (f.o ? f.o.length : 0);\n }\n var out = new u8(tl + 22);\n for (var _b = 0, _c = this.u; _b < _c.length; _b++) {\n var f = _c[_b];\n wzh(out, bt, f, f.f, f.u, f.c, l, f.o);\n bt += 46 + f.f.length + exfl(f.extra) + (f.o ? f.o.length : 0), l += f.b;\n }\n wzf(out, bt, this.u.length, tl, l);\n this.ondata(null, out, true);\n this.d = 2;\n };\n /**\n * A method to terminate any internal workers used by the stream. Subsequent\n * calls to add() will fail.\n */\n Zip.prototype.terminate = function () {\n for (var _i = 0, _a = this.u; _i < _a.length; _i++) {\n var f = _a[_i];\n f.t();\n }\n this.d = 2;\n };\n return Zip;\n}());\nexport { Zip };\nexport function zip(data, opts, cb) {\n if (!cb)\n cb = opts, opts = {};\n if (typeof cb != 'function')\n err(7);\n var r = {};\n fltn(data, '', r, opts);\n var k = Object.keys(r);\n var lft = k.length, o = 0, tot = 0;\n var slft = lft, files = new Array(lft);\n var term = [];\n var tAll = function () {\n for (var i = 0; i < term.length; ++i)\n term[i]();\n };\n var cbd = function (a, b) {\n mt(function () { cb(a, b); });\n };\n mt(function () { cbd = cb; });\n var cbf = function () {\n var out = new u8(tot + 22), oe = o, cdl = tot - o;\n tot = 0;\n for (var i = 0; i < slft; ++i) {\n var f = files[i];\n try {\n var l = f.c.length;\n wzh(out, tot, f, f.f, f.u, l);\n var badd = 30 + f.f.length + exfl(f.extra);\n var loc = tot + badd;\n out.set(f.c, loc);\n wzh(out, o, f, f.f, f.u, l, tot, f.m), o += 16 + badd + (f.m ? f.m.length : 0), tot = loc + l;\n }\n catch (e) {\n return cbd(e, null);\n }\n }\n wzf(out, o, files.length, cdl, oe);\n cbd(null, out);\n };\n if (!lft)\n cbf();\n var _loop_1 = function (i) {\n var fn = k[i];\n var _a = r[fn], file = _a[0], p = _a[1];\n var c = crc(), size = file.length;\n c.p(file);\n var f = strToU8(fn), s = f.length;\n var com = p.comment, m = com && strToU8(com), ms = m && m.length;\n var exl = exfl(p.extra);\n var compression = p.level == 0 ? 0 : 8;\n var cbl = function (e, d) {\n if (e) {\n tAll();\n cbd(e, null);\n }\n else {\n var l = d.length;\n files[i] = mrg(p, {\n size: size,\n crc: c.d(),\n c: d,\n f: f,\n m: m,\n u: s != fn.length || (m && (com.length != ms)),\n compression: compression\n });\n o += 30 + s + exl + l;\n tot += 76 + 2 * (s + exl) + (ms || 0) + l;\n if (!--lft)\n cbf();\n }\n };\n if (s > 65535)\n cbl(err(11, 0, 1), null);\n if (!compression)\n cbl(null, file);\n else if (size < 160000) {\n try {\n cbl(null, deflateSync(file, p));\n }\n catch (e) {\n cbl(e, null);\n }\n }\n else\n term.push(deflate(file, p, cbl));\n };\n // Cannot use lft because it can decrease\n for (var i = 0; i < slft; ++i) {\n _loop_1(i);\n }\n return tAll;\n}\n/**\n * Synchronously creates a ZIP file. Prefer using `zip` for better performance\n * with more than one file.\n * @param data The directory structure for the ZIP archive\n * @param opts The main options, merged with per-file options\n * @returns The generated ZIP archive\n */\nexport function zipSync(data, opts) {\n if (!opts)\n opts = {};\n var r = {};\n var files = [];\n fltn(data, '', r, opts);\n var o = 0;\n var tot = 0;\n for (var fn in r) {\n var _a = r[fn], file = _a[0], p = _a[1];\n var compression = p.level == 0 ? 0 : 8;\n var f = strToU8(fn), s = f.length;\n var com = p.comment, m = com && strToU8(com), ms = m && m.length;\n var exl = exfl(p.extra);\n if (s > 65535)\n err(11);\n var d = compression ? deflateSync(file, p) : file, l = d.length;\n var c = crc();\n c.p(file);\n files.push(mrg(p, {\n size: file.length,\n crc: c.d(),\n c: d,\n f: f,\n m: m,\n u: s != fn.length || (m && (com.length != ms)),\n o: o,\n compression: compression\n }));\n o += 30 + s + exl + l;\n tot += 76 + 2 * (s + exl) + (ms || 0) + l;\n }\n var out = new u8(tot + 22), oe = o, cdl = tot - o;\n for (var i = 0; i < files.length; ++i) {\n var f = files[i];\n wzh(out, f.o, f, f.f, f.u, f.c.length);\n var badd = 30 + f.f.length + exfl(f.extra);\n out.set(f.c, f.o + badd);\n wzh(out, o, f, f.f, f.u, f.c.length, f.o, f.m), o += 16 + badd + (f.m ? f.m.length : 0);\n }\n wzf(out, o, files.length, cdl, oe);\n return out;\n}\n/**\n * Streaming pass-through decompression for ZIP archives\n */\nvar UnzipPassThrough = /*#__PURE__*/ (function () {\n function UnzipPassThrough() {\n }\n UnzipPassThrough.prototype.push = function (data, final) {\n this.ondata(null, data, final);\n };\n UnzipPassThrough.compression = 0;\n return UnzipPassThrough;\n}());\nexport { UnzipPassThrough };\n/**\n * Streaming DEFLATE decompression for ZIP archives. Prefer AsyncZipInflate for\n * better performance.\n */\nvar UnzipInflate = /*#__PURE__*/ (function () {\n /**\n * Creates a DEFLATE decompression that can be used in ZIP archives\n */\n function UnzipInflate() {\n var _this_1 = this;\n this.i = new Inflate(function (dat, final) {\n _this_1.ondata(null, dat, final);\n });\n }\n UnzipInflate.prototype.push = function (data, final) {\n try {\n this.i.push(data, final);\n }\n catch (e) {\n this.ondata(e, null, final);\n }\n };\n UnzipInflate.compression = 8;\n return UnzipInflate;\n}());\nexport { UnzipInflate };\n/**\n * Asynchronous streaming DEFLATE decompression for ZIP archives\n */\nvar AsyncUnzipInflate = /*#__PURE__*/ (function () {\n /**\n * Creates a DEFLATE decompression that can be used in ZIP archives\n */\n function AsyncUnzipInflate(_, sz) {\n var _this_1 = this;\n if (sz < 320000) {\n this.i = new Inflate(function (dat, final) {\n _this_1.ondata(null, dat, final);\n });\n }\n else {\n this.i = new AsyncInflate(function (err, dat, final) {\n _this_1.ondata(err, dat, final);\n });\n this.terminate = this.i.terminate;\n }\n }\n AsyncUnzipInflate.prototype.push = function (data, final) {\n if (this.i.terminate)\n data = slc(data, 0);\n this.i.push(data, final);\n };\n AsyncUnzipInflate.compression = 8;\n return AsyncUnzipInflate;\n}());\nexport { AsyncUnzipInflate };\n/**\n * A ZIP archive decompression stream that emits files as they are discovered\n */\nvar Unzip = /*#__PURE__*/ (function () {\n /**\n * Creates a ZIP decompression stream\n * @param cb The callback to call whenever a file in the ZIP archive is found\n */\n function Unzip(cb) {\n this.onfile = cb;\n this.k = [];\n this.o = {\n 0: UnzipPassThrough\n };\n this.p = et;\n }\n /**\n * Pushes a chunk to be unzipped\n * @param chunk The chunk to push\n * @param final Whether this is the last chunk\n */\n Unzip.prototype.push = function (chunk, final) {\n var _this_1 = this;\n if (!this.onfile)\n err(5);\n if (!this.p)\n err(4);\n if (this.c > 0) {\n var len = Math.min(this.c, chunk.length);\n var toAdd = chunk.subarray(0, len);\n this.c -= len;\n if (this.d)\n this.d.push(toAdd, !this.c);\n else\n this.k[0].push(toAdd);\n chunk = chunk.subarray(len);\n if (chunk.length)\n return this.push(chunk, final);\n }\n else {\n var f = 0, i = 0, is = void 0, buf = void 0;\n if (!this.p.length)\n buf = chunk;\n else if (!chunk.length)\n buf = this.p;\n else {\n buf = new u8(this.p.length + chunk.length);\n buf.set(this.p), buf.set(chunk, this.p.length);\n }\n var l = buf.length, oc = this.c, add = oc && this.d;\n var _loop_2 = function () {\n var _a;\n var sig = b4(buf, i);\n if (sig == 0x4034B50) {\n f = 1, is = i;\n this_1.d = null;\n this_1.c = 0;\n var bf = b2(buf, i + 6), cmp_1 = b2(buf, i + 8), u = bf & 2048, dd = bf & 8, fnl = b2(buf, i + 26), es = b2(buf, i + 28);\n if (l > i + 30 + fnl + es) {\n var chks_3 = [];\n this_1.k.unshift(chks_3);\n f = 2;\n var sc_1 = b4(buf, i + 18), su_1 = b4(buf, i + 22);\n var fn_1 = strFromU8(buf.subarray(i + 30, i += 30 + fnl), !u);\n if (sc_1 == 4294967295) {\n _a = dd ? [-2] : z64e(buf, i), sc_1 = _a[0], su_1 = _a[1];\n }\n else if (dd)\n sc_1 = -1;\n i += es;\n this_1.c = sc_1;\n var d_1;\n var file_1 = {\n name: fn_1,\n compression: cmp_1,\n start: function () {\n if (!file_1.ondata)\n err(5);\n if (!sc_1)\n file_1.ondata(null, et, true);\n else {\n var ctr = _this_1.o[cmp_1];\n if (!ctr)\n file_1.ondata(err(14, 'unknown compression type ' + cmp_1, 1), null, false);\n d_1 = sc_1 < 0 ? new ctr(fn_1) : new ctr(fn_1, sc_1, su_1);\n d_1.ondata = function (err, dat, final) { file_1.ondata(err, dat, final); };\n for (var _i = 0, chks_4 = chks_3; _i < chks_4.length; _i++) {\n var dat = chks_4[_i];\n d_1.push(dat, false);\n }\n if (_this_1.k[0] == chks_3 && _this_1.c)\n _this_1.d = d_1;\n else\n d_1.push(et, true);\n }\n },\n terminate: function () {\n if (d_1 && d_1.terminate)\n d_1.terminate();\n }\n };\n if (sc_1 >= 0)\n file_1.size = sc_1, file_1.originalSize = su_1;\n this_1.onfile(file_1);\n }\n return \"break\";\n }\n else if (oc) {\n if (sig == 0x8074B50) {\n is = i += 12 + (oc == -2 && 8), f = 3, this_1.c = 0;\n return \"break\";\n }\n else if (sig == 0x2014B50) {\n is = i -= 4, f = 3, this_1.c = 0;\n return \"break\";\n }\n }\n };\n var this_1 = this;\n for (; i < l - 4; ++i) {\n var state_1 = _loop_2();\n if (state_1 === \"break\")\n break;\n }\n this.p = et;\n if (oc < 0) {\n var dat = f ? buf.subarray(0, is - 12 - (oc == -2 && 8) - (b4(buf, is - 16) == 0x8074B50 && 4)) : buf.subarray(0, i);\n if (add)\n add.push(dat, !!f);\n else\n this.k[+(f == 2)].push(dat);\n }\n if (f & 2)\n return this.push(buf.subarray(i), final);\n this.p = buf.subarray(i);\n }\n if (final) {\n if (this.c)\n err(13);\n this.p = null;\n }\n };\n /**\n * Registers a decoder with the stream, allowing for files compressed with\n * the compression type provided to be expanded correctly\n * @param decoder The decoder constructor\n */\n Unzip.prototype.register = function (decoder) {\n this.o[decoder.compression] = decoder;\n };\n return Unzip;\n}());\nexport { Unzip };\nvar mt = typeof queueMicrotask == 'function' ? queueMicrotask : typeof setTimeout == 'function' ? setTimeout : function (fn) { fn(); };\nexport function unzip(data, opts, cb) {\n if (!cb)\n cb = opts, opts = {};\n if (typeof cb != 'function')\n err(7);\n var term = [];\n var tAll = function () {\n for (var i = 0; i < term.length; ++i)\n term[i]();\n };\n var files = {};\n var cbd = function (a, b) {\n mt(function () { cb(a, b); });\n };\n mt(function () { cbd = cb; });\n var e = data.length - 22;\n for (; b4(data, e) != 0x6054B50; --e) {\n if (!e || data.length - e > 65558) {\n cbd(err(13, 0, 1), null);\n return tAll;\n }\n }\n ;\n var lft = b2(data, e + 8);\n if (lft) {\n var c = lft;\n var o = b4(data, e + 16);\n var z = o == 4294967295;\n if (z) {\n e = b4(data, e - 12);\n if (b4(data, e) != 0x6064B50) {\n cbd(err(13, 0, 1), null);\n return tAll;\n }\n c = lft = b4(data, e + 32);\n o = b4(data, e + 48);\n }\n var fltr = opts && opts.filter;\n var _loop_3 = function (i) {\n var _a = zh(data, o, z), c_1 = _a[0], sc = _a[1], su = _a[2], fn = _a[3], no = _a[4], off = _a[5], b = slzh(data, off);\n o = no;\n var cbl = function (e, d) {\n if (e) {\n tAll();\n cbd(e, null);\n }\n else {\n if (d)\n files[fn] = d;\n if (!--lft)\n cbd(null, files);\n }\n };\n if (!fltr || fltr({\n name: fn,\n size: sc,\n originalSize: su,\n compression: c_1\n })) {\n if (!c_1)\n cbl(null, slc(data, b, b + sc));\n else if (c_1 == 8) {\n var infl = data.subarray(b, b + sc);\n if (sc < 320000) {\n try {\n cbl(null, inflateSync(infl, new u8(su)));\n }\n catch (e) {\n cbl(e, null);\n }\n }\n else\n term.push(inflate(infl, { size: su }, cbl));\n }\n else\n cbl(err(14, 'unknown compression type ' + c_1, 1), null);\n }\n else\n cbl(null, null);\n };\n for (var i = 0; i < c; ++i) {\n _loop_3(i);\n }\n }\n else\n cbd(null, {});\n return tAll;\n}\n/**\n * Synchronously decompresses a ZIP archive. Prefer using `unzip` for better\n * performance with more than one file.\n * @param data The raw compressed ZIP file\n * @param opts The ZIP extraction options\n * @returns The decompressed files\n */\nexport function unzipSync(data, opts) {\n var files = {};\n var e = data.length - 22;\n for (; b4(data, e) != 0x6054B50; --e) {\n if (!e || data.length - e > 65558)\n err(13);\n }\n ;\n var c = b2(data, e + 8);\n if (!c)\n return {};\n var o = b4(data, e + 16);\n var z = o == 4294967295;\n if (z) {\n e = b4(data, e - 12);\n if (b4(data, e) != 0x6064B50)\n err(13);\n c = b4(data, e + 32);\n o = b4(data, e + 48);\n }\n var fltr = opts && opts.filter;\n for (var i = 0; i < c; ++i) {\n var _a = zh(data, o, z), c_2 = _a[0], sc = _a[1], su = _a[2], fn = _a[3], no = _a[4], off = _a[5], b = slzh(data, off);\n o = no;\n if (!fltr || fltr({\n name: fn,\n size: sc,\n originalSize: su,\n compression: c_2\n })) {\n if (!c_2)\n files[fn] = slc(data, b, b + sc);\n else if (c_2 == 8)\n files[fn] = inflateSync(data.subarray(b, b + sc), new u8(su));\n else\n err(14, 'unknown compression type ' + c_2);\n }\n }\n return files;\n}\n","/** Get time in milliseconds between a start time (t0) and now */\nfunction timeDiff(t0) {\n return Math.round(performance.now() - t0);\n}\n\n/** Initialize performance analysis settings */\nfunction initAnalyzeRelatedGenes(ideo) {\n ideo.time = {\n rg: { // times for related genes\n t0: performance.now()\n }\n };\n if ('_didRelatedGenesFirstPlot' in ideo) {\n delete ideo._didRelatedGenesFirstPlot;\n }\n}\n\nfunction getRelatedGenesByType() {\n const ideo = this;\n const relatedGenes = ideo.annotDescriptions.annots;\n\n const related = Object.values(relatedGenes).slice();\n\n const paralogous = related.filter(r => {\n return r.type && r.type.includes('paralogous');\n });\n const interacting = related.filter(r => {\n return r.type && r.type.includes('interacting gene');\n });\n const searched = Object.entries(relatedGenes).filter(entry => {\n return entry[1].type && entry[1].type.includes('searched gene');\n })[0][0];\n\n return {related, paralogous, interacting, searched};\n}\n\nfunction getRelatedGenesTooltipAnalytics(annot) {\n const ideo = this;\n\n const timeSincePrevTooltip = performance.now() - ideo.time.prevTooltipOff;\n const prevAnnotDomId = ideo.time.prevTooltipAnnotDomId;\n\n if (timeSincePrevTooltip < 300 && annot.domId === prevAnnotDomId) {\n return null;\n }\n\n const tooltipGene = annot.name;\n\n // e.g. \"interacting gene\" -> \"interacting\"\n const tooltipRelatedType =\n ideo.annotDescriptions.annots[annot.name].type.split(' ')[0];\n\n const countsByType = getCountsByType(ideo);\n\n const analytics = Object.assign(\n {tooltipGene, tooltipRelatedType}, countsByType\n );\n\n return analytics;\n}\n\n/** Compute granular related genes plotting analytics */\nfunction analyzePlotTimes(type, ideo) {\n // Paralogs and interacting genes:\n // http://localhost:8080/examples/vanilla/related-genes?q=RAD51\n //\n // No paralogs:\n // http://localhost:8080/examples/vanilla/related-genes?q=BRCA1&org=mus-musculus\n //\n // No interacting genes:\n // http://localhost:8080/examples/vanilla/related-genes?q=DMC1\n //\n // No paralogs, no interacting genes:\n // http://localhost:8080/examples/vanilla/related-genes?q=BRCA1&org=macaca-mulatta\n\n\n const otherTypes = {\n paralogous: 'interacting',\n interacting: 'paralogous'\n };\n const related = ideo.getRelatedGenesByType();\n const otherType = otherTypes[type];\n const numThisRelated = related[type].length;\n const numOtherRelated = related[otherType] ? related[otherType].length : 0;\n\n if (!ideo._didRelatedGenesFirstPlot) {\n // 1st of 2 attempted plot logs\n ideo._didRelatedGenesFirstPlot = true;\n\n ideo.time.rg.totalFirstPlot = timeDiff(ideo.time.rg.t0);\n\n if (numThisRelated > 0) {\n ideo.time.rg.timestampFirstPlot = performance.now();\n ideo._relatedGenesFirstPlotType = type;\n }\n } else {\n // 2nd of 2 attempted plot logs\n if (numThisRelated > 0 && numOtherRelated > 0) {\n // Paralogs and interacting genes were found, e.g. human RAD51\n const timestampFirstPlot = ideo.time.rg.timestampFirstPlot;\n ideo.time.rg.totalLastPlotDiff = timeDiff(timestampFirstPlot);\n } else if (numThisRelated > 0 && numOtherRelated === 0) {\n // Other attempt did not plot, and this did, so log this as 1st\n // Often seen when no interacting genes found, e.g. human DMC1\n ideo.time.rg.timestampFirstPlot = performance.now();\n ideo.time.rg.totalFirstPlot = timeDiff(ideo.time.rg.t0);\n ideo._relatedGenesFirstPlotType = type;\n ideo.time.rg.totalLastPlotDiff = 0;\n\n } else if (numThisRelated === 0 && numOtherRelated > 0) {\n // This attempt did not plot, the other did, so log 1st plot as also last\n // Often seen when no paralogs found, e.g. mouse BRCA1\n ideo.time.rg.totalLastPlotDiff = 0;\n } else {\n // No related genes found, so note only the searched gene is plotted\n // Example: Macaca mulatta BRCA1\n ideo._relatedGenesFirstPlotType = 'searched';\n ideo.time.rg.totalLastPlotDiff = 0;\n }\n }\n}\n\nfunction getCountsByType(ideo) {\n const related = ideo.getRelatedGenesByType();\n\n const numRelatedGenes = related['related'].length;\n const numParalogs = related['paralogous'].length;\n const numInteractingGenes = related['interacting'].length;\n const searchedGene = related['searched'];\n\n return {\n numRelatedGenes, numParalogs, numInteractingGenes, searchedGene\n };\n}\n\n/** Summarizes number and kind of related genes, performance, etc. */\nfunction analyzeRelatedGenes(ideo) {\n\n const countsByType = getCountsByType(ideo);\n\n const timeTotal = ideo.time.rg.total;\n const timeTotalFirstPlot = ideo.time.rg.totalFirstPlot;\n const timeTotalLastPlotDiff = ideo.time.rg.totalLastPlotDiff;\n const timeParalogs = ideo.time.rg.paralogs;\n const timeInteractingGenes = ideo.time.rg.interactions;\n const timeSearchedGene = ideo.time.rg.searchedGene;\n const firstPlotType = ideo._relatedGenesFirstPlotType;\n\n const analytics = Object.assign({\n firstPlotType,\n timeTotal, timeTotalFirstPlot, timeTotalLastPlotDiff,\n timeSearchedGene, timeInteractingGenes, timeParalogs\n }, countsByType);\n\n ideo.relatedGenesAnalytics = analytics;\n}\n\nexport {\n initAnalyzeRelatedGenes, analyzePlotTimes, analyzeRelatedGenes, timeDiff,\n getRelatedGenesByType, getRelatedGenesTooltipAnalytics\n};\n","/**\n * @fileoverview Fetch cached gene data: name, position, etc.\n *\n * Gene cache eliminates needing to fetch names and positions of genes from\n * third-party APIs at runtime. It achieves this by fetching a static file\n * containing gene data upon initializing Ideogram.\n *\n * Use cases:\n *\n * - test if a given string is a gene name, e.g. for gene search\n * - find genomic position of a given gene (or all genes)\n */\n\nimport {slug, getEarlyTaxid} from './lib';\nimport {organismMetadata} from './init/organism-metadata';\nimport version from './version';\n\nlet perfTimes;\n\n/** Get URL for gene cache file */\nfunction getCacheUrl(orgName, cacheDir, ideo) {\n const organism = slug(orgName);\n\n if (!cacheDir) {\n const splitDataDir = ideo.config.dataDir.split('/');\n const dataIndex = splitDataDir.indexOf('data');\n const baseDir = splitDataDir.slice(0, dataIndex).join('/') + '/data/';\n cacheDir = baseDir + 'cache/';\n }\n\n const cacheUrl = cacheDir + organism + '-genes.tsv';\n\n return cacheUrl;\n}\n\n/**\n * Convert pre-annotation arrays to annotation objects\n * sorted by genomic position.\n */\nfunction parseAnnots(preAnnots) {\n const chromosomes = {};\n\n for (let i = 0; i < preAnnots.length; i++) {\n const [chromosome, start, stop, ensemblId, gene] = preAnnots[i];\n\n if (!(chromosome in chromosomes)) {\n chromosomes[chromosome] = {chr: chromosome, annots: []};\n } else {\n const annot = {name: gene, start, stop, ensemblId};\n chromosomes[chromosome].annots.push(annot);\n }\n }\n\n const annotsSortedByPosition = {};\n\n Object.entries(chromosomes).forEach(([chr, annotsByChr]) => {\n annotsSortedByPosition[chr] = {\n chr,\n annots: annotsByChr.annots.sort((a, b) => a.start - b.start)\n };\n });\n\n return annotsSortedByPosition;\n}\n\n/**\n * Build full Ensembl ID from prefix (e.g. ENSG) and slim ID (e.g. 223972)\n *\n * Example output ID: ENSG00000223972\n * */\nfunction getEnsemblId(ensemblPrefix, slimEnsemblId) {\n\n // C. elegans (prefix: WBGene) has special IDs, e.g. WBGene00197333\n const padLength = ensemblPrefix === 'WBGene' ? 8 : 11;\n\n // Zero-pad the slim ID, e.g. 223972 -> 00000223972\n const zeroPaddedId = slimEnsemblId.padStart(padLength, '0');\n\n return ensemblPrefix + zeroPaddedId;\n}\n\n/** Parse a gene cache TSV file, return array of useful transforms */\nfunction parseCache(rawTsv, orgName) {\n const names = [];\n const nameCaseMap = {};\n const namesById = {};\n const idsByName = {};\n const lociByName = {};\n const lociById = {};\n const preAnnots = [];\n let ensemblPrefix;\n\n let t0 = performance.now();\n const lines = rawTsv.split(/\\r\\n|\\n/);\n perfTimes.rawTsvSplit = Math.round(performance.now() - t0);\n\n t0 = performance.now();\n for (let i = 0; i < lines.length; i++) {\n const line = lines[i];\n if (line === '') continue; // Skip empty lines\n if (line[0] === '#') {\n if (line.slice(0, 9) === '## prefix') {\n ensemblPrefix = line.split('prefix: ')[1];\n }\n continue;\n }\n const [\n chromosome, rawStart, rawLength, slimEnsemblId, gene\n ] = line.trim().split(/\\t/);\n const start = parseInt(rawStart);\n const stop = start + parseInt(rawLength);\n const ensemblId = getEnsemblId(ensemblPrefix, slimEnsemblId);\n preAnnots.push([chromosome, start, stop, ensemblId, gene]);\n const locus = [chromosome, start, stop];\n\n names.push(gene);\n nameCaseMap[gene.toLowerCase()] = gene;\n namesById[ensemblId] = gene;\n idsByName[gene] = ensemblId;\n lociByName[gene] = locus;\n lociById[ensemblId] = locus;\n };\n const t1 = performance.now();\n perfTimes.parseCacheLoop = Math.round(t1 - t0);\n\n const sortedAnnots = parseAnnots(preAnnots);\n perfTimes.parseAnnots = Math.round(performance.now() - t1);\n\n return [\n names, nameCaseMap, namesById, idsByName, lociByName, lociById,\n sortedAnnots\n ];\n}\n\n/** Get organism's metadata fields */\nfunction parseOrgMetadata(orgName) {\n const taxid = getEarlyTaxid(orgName);\n return organismMetadata[taxid];\n}\n\n/** Reports if current organism has a gene cache */\nfunction hasGeneCache(orgName) {\n const metadata = parseOrgMetadata(orgName);\n return (metadata.hasGeneCache && metadata.hasGeneCache === true);\n}\n\nasync function cacheFetch(url) {\n const response = await Ideogram.cache.match(url);\n if (typeof response === 'undefined') {\n // If cache miss, then fetch and add response to cache\n await Ideogram.cache.add(url);\n }\n return await Ideogram.cache.match(url);\n}\n\n/**\n * Fetch cached gene data, transform it usefully, and set it as ideo prop\n */\nexport default async function initGeneCache(orgName, ideo, cacheDir=null) {\n\n const startTime = performance.now();\n perfTimes = {};\n\n // Skip initialization if files needed to make cache don't exist\n if (!hasGeneCache(orgName)) return;\n\n // Skip initialization if cache is already populated\n if (Ideogram.geneCache && Ideogram.geneCache[orgName]) {\n // Simplify chief use case, i.e. for single organism\n ideo.geneCache = Ideogram.geneCache[orgName];\n return;\n }\n\n if (!Ideogram.geneCache) {\n Ideogram.geneCache = {};\n }\n\n Ideogram.cache = await caches.open(`ideogram-${version}`);\n\n const cacheUrl = getCacheUrl(orgName, cacheDir, ideo);\n\n const fetchStartTime = performance.now();\n const response = await cacheFetch(cacheUrl);\n const data = await response.text();\n const fetchEndTime = performance.now();\n perfTimes.fetch = Math.round(fetchEndTime - fetchStartTime);\n\n const [\n interestingNames, nameCaseMap, namesById, idsByName,\n lociByName, lociById, sortedAnnots\n ] = parseCache(data, orgName);\n perfTimes.parseCache = Math.round(performance.now() - fetchEndTime);\n\n ideo.geneCache = {\n interestingNames, // Array ordered by general or scholarly interest\n nameCaseMap, // Maps of lowercase gene names to proper gene names\n namesById,\n idsByName,\n lociByName, // Object of gene positions, keyed by gene name\n lociById,\n sortedAnnots // Ideogram annotations sorted by genomic position\n };\n Ideogram.geneCache[orgName] = ideo.geneCache;\n\n if (ideo.config.debug) {\n perfTimes.total = Math.round(performance.now() - startTime);\n console.log('perfTimes in initGeneCache:', perfTimes);\n }\n}\n","import {decompressSync, strFromU8} from 'fflate';\n\n// Definitions for ArrowHead values in WikiPathways GPML\n//\n// See also: https://discover.nci.nih.gov/mim/formal_mim_spec.pdf\nconst interactionArrowMap = {\n 'Arrow': ['acts on', 'acted on by'],\n 'TBar': ['inhibits', 'inhibited by'],\n 'mim-binding': ['binds', 'binds'],\n 'mim-catalysis': ['catalyzes', 'catalyzed by'],\n 'mim-cleavage': ['cleaves', 'cleaved by'],\n 'mim-conversion': ['converts', 'converted by'],\n // 'mim-covalent-bond': ['covalently binds',\n // 'mim-gap': 'MimGap',\n 'mim-inhibition': ['inhibits', 'inhibited by'],\n 'mim-modification': ['modifies', 'modified by'],\n 'mim-necessary-stimulation':\n ['necessarily stimulates', 'necessarily stimulated by'],\n 'mim-stimulation': ['stimulates', 'stimulated by'],\n 'mim-transcription-translation':\n ['transcribes / translates', 'transcribed / translated by']\n};\n\n// Which interactions types to show first, if showing multiple\nconst rankedInteractionTypes = [\n 'transcribe',\n 'cleave',\n 'convert',\n 'bind',\n 'modifie',\n 'catalyze',\n 'necessarily stimulate',\n 'inhibit',\n 'stimulate',\n 'act'\n];\n\nexport function sortInteractionTypes(a, b) {\n const ranks = {};\n for (let i = 0; i < rankedInteractionTypes.length; i++) {\n const rankedIxnType = rankedInteractionTypes[i];\n if (rankedIxnType.includes(a)) ranks.a = i;\n if (rankedIxnType.includes(b)) ranks.b = i;\n }\n return ranks.b - ranks.a;\n}\n\n/** Determine if all given interactions in *one* pathway are same */\nfunction determineIxnsInPathwayAreSame(ixns, ixnTypeReference) {\n let isRefMatch = true;\n let thisIsSame = true;\n\n if (ixns.length === 0) return {isRefMatch, thisIsSame};\n\n const thisIxnTypeReference = ixns[0].ixnType.toLowerCase();\n ixns.forEach(ixn => {\n const ixnType = ixn.ixnType.toLowerCase();\n if (ixnType !== ixnTypeReference) {\n isRefMatch = false;\n }\n if (ixnType !== thisIxnTypeReference) {\n thisIsSame = false;\n }\n });\n return {isRefMatch, thisIsSame};\n}\n\n/**\n * Return first valid interaction type from interactions-by-pathway object\n */\nfunction getIxnTypeReference(ixnsByPwid) {\n const ixnTypeReference = Object.values(ixnsByPwid).find(ixns => {\n return ixns.length > 0 && 'ixnType' in ixns[0];\n })[0].ixnType.toLowerCase();\n\n return ixnTypeReference;\n}\n\n/**\n * Determine whether all given interactions in all given pathways are the same\n */\nfunction setIsSame(enrichedIxns) {\n let isSame = true;\n const ixnsByPwid = enrichedIxns.ixnsByPwid;\n\n const ixnTypeReference = getIxnTypeReference(ixnsByPwid);\n\n Object.entries(ixnsByPwid).map(([pwid, ixns]) => {\n const {isRefMatch, thisIsSame} =\n determineIxnsInPathwayAreSame(ixns, ixnTypeReference);\n if (!thisIsSame || !isRefMatch) {\n isSame = false;\n }\n enrichedIxns.isSameByPwid[pwid] = thisIsSame;\n });\n enrichedIxns.isSame = isSame;\n\n return enrichedIxns;\n}\n\n/**\n * If interactions aren't all exactly the same, then they are often still\n * directionally equivalent.\n *\n * E.g. if gene A both \"modifies\" and \"converts\" gene B, then we can summarize\n * that as gene A \"acts on\" gene B, rather than completely reverting to saying\n * gene A \"interacts with\" gene B.\n *\n */\nfunction summarizeByDirection(enrichedIxns) {\n\n let isDirectionSame = true;\n\n const leftTypes = []; // \"Acts on\" types\n const rightTypes = []; // \"Acted on by\" types\n Object.values(interactionArrowMap).forEach(directedTypes => {\n rightTypes.push(directedTypes[0]);\n leftTypes.push(directedTypes[1]);\n });\n\n const right = 'Acts on';\n const left = 'Acted on by';\n\n const ixnsByPwid = enrichedIxns.ixnsByPwid;\n const firstIxnType = getIxnTypeReference(ixnsByPwid);\n const isRight = rightTypes.includes(firstIxnType);\n const directionReference = isRight ? right : left;\n\n Object.entries(ixnsByPwid).map(([pwid, ixns]) => {\n let isPwDirectionSame = true;\n if (ixns.length > 0) {\n const pwFirstIxnType = ixns[0].ixnType.toLowerCase();\n const pwIsRight = rightTypes.includes(pwFirstIxnType);\n const pwDirectionReference = pwIsRight ? right : left;\n ixns.forEach(ixn => {\n const ixnType = ixn.ixnType.toLowerCase();\n const thisIsRight = rightTypes.includes(ixnType);\n const direction = thisIsRight ? right : left;\n enrichedIxns.directionsByPwid[pwid] = direction;\n if (direction !== directionReference) {\n isDirectionSame = false;\n }\n if (direction !== pwDirectionReference) {\n isPwDirectionSame = false;\n }\n });\n }\n enrichedIxns.isDirectionSameByPwid[pwid] = isPwDirectionSame;\n\n });\n\n enrichedIxns.isDirectionSame = isDirectionSame;\n if (isDirectionSame === true) {\n enrichedIxns.direction = directionReference;\n }\n\n return enrichedIxns;\n}\n\n/**\n * Summarize interactions by direction\n *\n * @param {String} gene Interacting gene\n * @param {Array} pathwayIds List of WikiPathways IDs\n * @param {Object} ideo Ideogram instance object\n * @returns\n */\nexport function summarizeInteractions(gene, pathwayIds, ideo) {\n let summary = null;\n\n const ixnsByPwid = detailAllInteractions(gene, pathwayIds, ideo);\n\n console.log('gene')\n console.log(gene)\n console.log('ixnsByPwid')\n console.log(ixnsByPwid)\n console.log('pathwayIds')\n console.log(pathwayIds)\n console.log('pathwayIds[0]')\n console.log(pathwayIds[0])\n\n const ixns = ixnsByPwid[pathwayIds[0]];\n\n if (ixns.length > 0) {\n let enrichedIxns = {\n ixnsByPwid,\n isSameByPwid: {}, // If pathway has all same interaction types\n isSame: null, // If above is true for all pathways\n isDirectionSameByPwid: {}, // If pathway has same ixn direction\n isDirectionSame: null, // If above is true for all pathways\n directionsByPwid: {}\n };\n enrichedIxns = setIsSame(enrichedIxns);\n\n if (enrichedIxns.isSame) {\n const ixnType = ixns[0].ixnType;\n const newIxn = ixnType;\n summary = newIxn;\n } else {\n\n enrichedIxns = summarizeByDirection(enrichedIxns);\n\n if (enrichedIxns.isDirectionSame) {\n summary = enrichedIxns.direction;\n } else {\n summary = 'Interacts with';\n }\n }\n }\n\n\n // if (direction !== null) {\n // summary = direction;\n // }\n // const pwidsByIxnType = {};\n // Object.entries(ixns).map(([k, v]) => {\n // if (!pwidsByIxnType[v.ixnType]) {\n // pwidsByIxnType[v.ixnType] = [v.pathwayId];\n // } else {\n // pwidsByIxnType[v.ixnType].push([v.pathwayId]);\n // }\n // });\n\n // console.log('pwidsByIxnType')\n // console.log(pwidsByIxnType)\n // const tpArray = Object.entries(pwidsByIxnType);\n // const sortedIndices = sortInteractionTypes(tpArray.map(tp => tp[0]));\n // const sortedTpArray =\n // sortedIndices.map(sortedIndex => tpArray[sortedIndex]);\n\n // console.log('sortedTpArray')\n // console.log(sortedTpArray)\n return summary;\n}\n\n/**\n * Get detailInteractions results for multiple pathways\n *\n * @param gene Interacting gene\n * @param pathwayIds List of WikiPathways IDs\n * @ideo ideo Ideogram instance object\n */\nexport function detailAllInteractions(gene, pathwayIds, ideo) {\n const ixnsByPwid = {};\n\n pathwayIds.map(pathwayId => {\n const ixns = detailInteractions(gene, pathwayId, ideo);\n\n ixnsByPwid[pathwayId] = ixns;\n });\n return ixnsByPwid;\n}\n\n/** Get IDs and data element objects for searched or interacting gene */\nfunction getMatches(gpml, label) {\n\n const nodes = Array.from(gpml.querySelectorAll(\n `DataNode[TextLabel=\"${label}\"]`\n ));\n\n const genes = nodes.map(node => {\n return {\n type: 'node',\n matchedLabel: label,\n textLabel: node.getAttribute('TextLabel'),\n graphId: node.getAttribute('GraphId'),\n groupRef: node.getAttribute('GroupRef')\n };\n });\n\n // Get group identifiers\n const geneGraphIds = genes.map(g => g.graphId);\n const geneGroupRefs = genes.map(g => g.groupRef);\n const groupSelectors =\n geneGroupRefs.map(ggr => `Group[GroupId=\"${ggr}\"]`).join(',');\n\n let geneGroups = [];\n if (groupSelectors !== '') {\n const groups = gpml.querySelectorAll(groupSelectors);\n geneGroups = Array.from(groups).map(group => {\n return {\n type: 'group',\n matchedLabel: label,\n graphId: group.getAttribute('GraphId'),\n groupId: group.getAttribute('GroupId')\n };\n });\n }\n\n const geneGroupGraphIds = geneGroups.map(g => g.graphId);\n const matchingGraphIds = geneGraphIds.concat(geneGroupGraphIds);\n\n const elements = genes.concat(geneGroups);\n\n return [matchingGraphIds, elements];\n}\n\n/**\n * Request compressed GPML files, which contain detailed interaction data, e.g.\n * https://cdn.jsdelivr.net/npm/ixn/WP3982.xml.gz\n *\n * For more easily readable versions, see also:\n * - https://www.wikipathways.org/index.php?title=Pathway:WP3982&action=edit\n * - https://www.wikipathways.org//wpi/wpi.php?action=downloadFile&type=gpml&pwTitle=Pathway:WP3982\n *\n * GPML (Graphical Pathway Markup Language) data encodes detailed interaction\n * data for biochemical pathways.\n */\nexport function fetchGpmls(ideo) {\n\n const pathwayIdsByInteractingGene = {};\n Object.entries(ideo.annotDescriptions.annots)\n .forEach(([annotName, descObj]) => {\n if ('type' in descObj && descObj.type.includes('interacting gene')) {\n pathwayIdsByInteractingGene[annotName] = descObj.pathwayIds;\n }\n });\n\n const gpmlsByInteractingGene = {};\n Object.entries(pathwayIdsByInteractingGene)\n .forEach(([ixnGene, pathwayIds]) => {\n gpmlsByInteractingGene[ixnGene] = {};\n pathwayIds.map(async pathwayId => {\n const pathwayFile = `${pathwayId}.xml.gz`;\n const gpmlUrl = `https://cdn.jsdelivr.net/npm/ixn2/${pathwayFile}`;\n const response = await fetch(gpmlUrl);\n const blob = await response.blob();\n const uint8Array = new Uint8Array(await blob.arrayBuffer());\n const rawGpml = strFromU8(decompressSync(uint8Array));\n\n const gpml = new DOMParser().parseFromString(rawGpml, 'text/xml');\n\n gpmlsByInteractingGene[ixnGene][pathwayId] = gpml;\n });\n });\n\n ideo.gpmlsByInteractingGene = gpmlsByInteractingGene;\n}\n\n/**\n * Get interaction object from a GPML graphics XML element\n *\n * This interaction object connects the searched gene and interacting gene.\n */\nfunction parseInteractionGraphic(graphic, graphIds) {\n let interaction = null;\n\n const {searchedGeneGraphIds, matchingGraphIds} = graphIds;\n\n const endGraphRefs = [];\n let numMatchingPoints = 0;\n let isConnectedToSourceGene = false;\n let ixnType = null;\n let searchedGeneIndex = null;\n\n Array.from(graphic.children).forEach(child => {\n if (child.nodeName !== 'Point') return;\n const point = child;\n const graphRef = point.getAttribute('GraphRef');\n if (graphRef === null) return;\n\n if (matchingGraphIds.includes(graphRef)) {\n numMatchingPoints += 1;\n endGraphRefs.push(graphRef);\n\n if (searchedGeneGraphIds.includes(graphRef)) {\n isConnectedToSourceGene = true;\n }\n\n if (point.getAttribute('ArrowHead')) {\n const arrowHead = point.getAttribute('ArrowHead');\n const isStart = searchedGeneGraphIds.includes(graphRef);\n if (searchedGeneIndex === null) {\n searchedGeneIndex = isStart ? 0 : 1;\n }\n ixnType = interactionArrowMap[arrowHead][isStart ? 0 : 1];\n }\n }\n });\n\n if (numMatchingPoints >= 2 && isConnectedToSourceGene) {\n if (searchedGeneIndex === null) {\n ixnType = 'interacts with';\n }\n ixnType = ixnType[0].toUpperCase() + ixnType.slice(1);\n const interactionGraphId = graphic.parentNode.getAttribute('GraphId');\n interaction = {\n 'interactionId': interactionGraphId,\n 'endIds': endGraphRefs,\n ixnType\n };\n }\n\n return interaction;\n}\n\n/**\n * Fetch GPML for pathway and find ID of Interaction between two genes,\n * and the ID of the two DataNodes for each of those interactions.\n *\n * WikiPathways SVG isn't detailed enough to reliably determine the specific\n * interaction elements relating two genes, given only the gene symbols. This\n * fetches augmented GPML data for the pathway, and queries it to get only\n * interactions between the two genes.\n */\nexport function detailInteractions(interactingGene, pathwayId, ideo) {\n\n // Get pathway's GPML, which contains detailed interaction data\n const gpml = ideo.gpmlsByInteractingGene[interactingGene][pathwayId];\n\n // Get symbol of the searched gene, e.g. \"PTEN\"\n const searchedGene =\n Object.entries(ideo.annotDescriptions.annots)\n .find(([k, v]) => v.type === 'searched gene')[0];\n\n // Gets IDs and elements for searched gene and interacting gene, and,\n // if they're in any groups, the IDs of those groups\n const [searchedGeneGraphIds, se] = getMatches(gpml, searchedGene);\n const [interactingGeneGraphIds, ie] = getMatches(gpml, interactingGene);\n\n const elements = {\n searchedGene: se,\n interactingGene: ie\n };\n\n const matchingGraphIds =\n searchedGeneGraphIds.concat(interactingGeneGraphIds);\n const graphIds = {searchedGeneGraphIds, matchingGraphIds};\n\n // Get interaction objects that connect the searched and interacting genes\n const interactions = [];\n const graphicsXml = gpml.querySelectorAll('Interaction Graphics');\n Array.from(graphicsXml).forEach(graphic => {\n const interaction = parseInteractionGraphic(graphic, graphIds);\n if (interaction !== null) {\n interaction.elements = elements;\n interactions.push(interaction);\n }\n });\n\n return interactions;\n}\n\n// export async function fetchInteractionDiagram(annot, descObj, ideo) {\n// // Fetch raw SVG for pathway diagram\n// const pathwayId = descObj.pathwayIds[0];\n// // const baseUrl = 'https://eweitz.github.io/cachome/wikipathways/';\n// const baseUrl = 'https://cachome.github.io/wikipathways/';\n// // const baseUrl = 'http://localhost/wikipathways/data/';\n// const diagramUrl = baseUrl + pathwayId + '.svg';\n// const response = await fetch(diagramUrl);\n// if (response.ok) {\n\n// // console.log('searchedGene', searchedGene)\n\n// const ixns = await detailInteractions(annot.name, pathwayId, ideo);\n\n// let selectors = `[name=${annot.name}]`;\n// let searchedGeneIndex = 0;\n// let interactingGeneIndex;\n// if (ixns.length > 0) {\n// selectors = ixns[0].endIds.map(id => '#' + id).join(',');\n// searchedGeneIndex = ixns[0].searchedGeneIndex;\n// interactingGeneIndex = (searchedGeneIndex === 0) ? 1 : 0;\n// }\n// // https://webservice.wikipathways.org/findInteractions?query=ACE2&format=json\n\n// const rawDiagram = await response.text();\n\n// const pathwayDiagram =\n// `
    ${rawDiagram}
    `;\n\n// annot.displayName += pathwayDiagram;\n\n// document.querySelector('#_ideogramTooltip').innerHTML =\n// annot.displayName;\n\n// Ideogram.d3.select('svg.Diagram')\n// .attr('width', 350)\n// .attr('height', 300);\n\n// const viewport = document.querySelector('.svg-pan-zoom_viewport');\n// viewport.removeAttribute('style');\n// viewport.removeAttribute('transform');\n\n// const matches = document.querySelectorAll(selectors);\n// console.log('matches', matches)\n// const match0 = matches[searchedGeneIndex]\n// const m0 = match0.getCTM();\n// const m0Rect = match0.getBoundingClientRect();\n// const m0Box = match0.getBBox();\n// const m0MinX = m0.e/m0.a;\n// const m0MinY = m0.f/m0.d;\n\n// let minX = m0MinX;\n// let minY = m0MinY;\n// let width;\n// let height;\n\n// width = 350;\n// height = 300;\n\n// // matches[0].children[0].setAttribute('fill', '#F55');\n// match0.children[0].style.fill = '#f55';\n\n// if (matches.length > 1) {\n// // console.log('matches.length > 1')\n// // matches[1].children[0].setAttribute('fill', '#C4C');\n// const match1 = matches[interactingGeneIndex];\n// // console.log('match1')\n// // console.log(match1)\n// match1.children[0].style.fill = '#c4c';\n// const m1 = matches[1].getCTM();\n// const m1Rect = matches[1].getBoundingClientRect();\n// const m1Box = matches[1].getBBox();\n// console.log('m0', m0)\n// console.log('m1', m1)\n// const m1MinX = m1.e/m1.a;\n// const m1MinY = m1.f/m1.d;\n// // const m1MinX = m1.e/m1.a + m1Rect.width;\n// // const m1MinY = m1.f/m1.d - m1Rect.height;\n// if (m1MinX < m0MinX) minX = m1MinX;\n// if (m1MinY < m0MinY) minY = m1MinY;\n\n// let pairWidth = 0;\n// if (m0Rect.left < m1Rect.left) {\n// // pairWidth = m1Rect.right - m0Rect.left;\n// width += m1Box.width + 40;\n// }\n\n// // width += pairWidth;\n\n// // console.log('m0Rect', m0Rect)\n// // console.log('m1Rect', m1Rect)\n// // console.log('m1MinX', m1MinX)\n// // console.log('m0MinX', m0MinX)\n// // console.log('m1MinY', m1MinY)\n// // console.log('m0MinY', m0MinY)\n// // console.log('pairWidth', pairWidth)\n// // console.log('width', width)\n// // width += Math.abs(m1MinX - m0MinX);\n// // height += Math.abs(m1MinY - m0MinY);\n\n// // minX -= 100;\n// // minY -= 100;\n\n// // minX -= 150;\n// // minY -= 150;\n// } else {\n// minX -= 150;\n// minY -= 150;\n// }\n\n// minX = Math.round(minX);\n// minY = Math.round(minY);\n// width = Math.round(width);\n// height = Math.round(height);\n\n// const viewBox = `${minX} ${minY} ${width} ${height}`;\n// console.log('viewBox', viewBox);\n// document.querySelector('svg.Diagram').setAttribute('viewBox', viewBox);\n\n// }\n// }\n","/**\n * @fileoverview Kit used in \"Related genes\" example\n *\n * This file simplifies client code for reusing a \"related genes\" ideogram --\n * which finds and displays related genes for a searched gene.\n *\n * Related genes here are either \"interacting genes\" or \"paralogs\".\n * Interacting genes are genes immediately upstream or downstream of the\n * searched gene in a biochemical pathway. Paralogs are evolutionarily\n * similar genes in the same species.\n *\n * Data sources:\n * - Interacting genes: WikiPathways\n * - Paralogs: Ensembl\n * - Genomic coordinates: Ensembl, via MyGene.info\n *\n * Features provided by this module help users discover and explore genes\n * related to their gene of interest.\n *\n * The reference implementation is available at:\n * https://eweitz.github.io/ideogram/related-genes\n */\n\nimport {decompressSync, strFromU8} from 'fflate';\n\nimport {\n initAnalyzeRelatedGenes, analyzePlotTimes, analyzeRelatedGenes, timeDiff,\n getRelatedGenesByType, getRelatedGenesTooltipAnalytics\n} from './analyze-related-genes';\n\nimport {writeLegend} from '../annotations/legend';\nimport {getAnnotDomId} from '../annotations/process';\nimport {applyRankCutoff, sortAnnotsByRank} from '../annotations/labels';\nimport {getDir} from '../lib';\nimport initGeneCache from '../gene-cache';\nimport {fetchGpmls, summarizeInteractions} from './wikipathways';\n\n/** Sets DOM IDs for ideo.relatedAnnots; needed to associate labels */\nfunction setRelatedAnnotDomIds(ideo) {\n const updated = [];\n\n const sortedChrNames = ideo.chromosomesArray.map((chr) => {\n return chr.name;\n });\n\n // Arrange related annots by chromosome\n const annotsByChr = {};\n ideo.relatedAnnots.forEach((annot) => {\n if (annot.chr in annotsByChr) {\n annotsByChr[annot.chr].push(annot);\n } else {\n annotsByChr[annot.chr] = [annot];\n }\n });\n\n // Sort related annots by relevance within each chromosome\n const relevanceSortedAnnotsNamesByChr = {};\n Object.entries(annotsByChr).map(([chr, annots]) => {\n\n // Reverse-sort, so first annots are drawn last, and thus at top layer\n annots.sort((a, b) => ideo.annotSortFunction(a, b));\n\n const annotNames = annots.map((annot) => annot.name).reverse();\n relevanceSortedAnnotsNamesByChr[chr] = annotNames;\n });\n\n ideo.relatedAnnots.forEach((annot) => {\n const chr = annot.chr;\n\n // Annots have DOM IDs keyed by chromosome index and annotation index.\n // We reconstruct those here using structures built in two blocks above.\n const chrIndex = sortedChrNames.indexOf(chr);\n const annotIndex =\n relevanceSortedAnnotsNamesByChr[chr].indexOf(annot.name);\n\n annot.domId = getAnnotDomId(chrIndex, annotIndex);\n updated.push(annot);\n });\n\n ideo.relatedAnnots = updated;\n}\n\n/**\n * Determines if interaction node might be a gene\n *\n * Some interaction nodes are biological processes; this filters out many.\n * Filtering these out makes downstream queries faster.\n *\n * ixn {Object} Interaction from WikiPathways\n * gene {Object} Gene from MyGene.info\n */\nfunction maybeGeneSymbol(ixn, gene) {\n return (\n ixn !== '' &&\n !ixn.includes(' ') &&\n !ixn.includes('/') && // e.g. Akt/PKB\n ixn.toLowerCase() !== gene.name.toLowerCase()\n );\n}\n\n// /** Helpful for debugging race conditions caused by concurrency */\n// const sleep = (delay) => {\n// new Promise((resolve) => setTimeout(resolve, delay));\n// }\n\n/** Reports if interaction node is a gene and not previously seen */\nfunction isInteractionRelevant(rawIxn, gene, nameId, seenNameIds, ideo) {\n let isGeneSymbol;\n if ('geneCache' in ideo && gene.name) {\n isGeneSymbol = rawIxn.toLowerCase() in ideo.geneCache.nameCaseMap;\n } else {\n isGeneSymbol = maybeGeneSymbol(rawIxn, gene);\n }\n\n return isGeneSymbol && !(nameId in seenNameIds);\n}\n\n/**\n * Retrieves interacting genes from WikiPathways API\n *\n * Docs:\n * https://webservice.wikipathways.org/ui/\n * https://www.wikipathways.org/index.php/Help:WikiPathways_Webservice/API\n *\n * Examples:\n * https://webservice.wikipathways.org/findInteractions?query=ACE2&format=json\n * https://webservice.wikipathways.org/findInteractions?query=RAD51&format=json\n */\nasync function fetchInteractions(gene, ideo) {\n const ixns = {};\n const seenNameIds = {};\n const orgNameSimple = ideo.config.organism.replace(/-/g, ' ');\n const upperGene = gene.name.toUpperCase();\n // const queryString = `?query=${gene.name}&format=json`;\n // const url =\n // `https://webservice.wikipathways.org/findInteractions${queryString}`;\n // const url = `http://localhost:8080/dist/data/cache/${gene.name}.json.gz`;\n const url = `https://cdn.jsdelivr.net/npm/ixn2/${upperGene}.json.gz`;\n\n // await sleep(3000);\n\n const response = await fetch(url);\n // const data = await response.json();\n\n let data = {result: []};\n\n if (response.ok) {\n const blob = await response.blob();\n const uint8Array = new Uint8Array(await blob.arrayBuffer());\n data = JSON.parse(strFromU8(decompressSync(uint8Array)));\n }\n\n console.log('data')\n console.log(data)\n\n // For each interaction, get nodes immediately upstream and downstream.\n // Filter out pathway nodes that are definitely not gene symbols, then\n // group pathways by gene symbol. Each interacting gene can have\n // multiple pathways.\n data.result.forEach(interaction => {\n if (interaction.species.toLowerCase() === orgNameSimple) {\n const right = interaction.fields.right.values;\n const left = interaction.fields.left.values;\n // let mediator = [];\n // if ('mediator' in interaction.fields) {\n // mediator = interaction.fields.mediator.values;\n // console.log('mediator', mediator)\n // }\n // const rawIxns = right.concat(left, mediator);\n const rawIxns = right.concat(left);\n const name = interaction.name;\n const id = interaction.id;\n\n // rawIxns can contain multiple genes, e.g. when\n // a group (i.e. a complex or a set of paralogs)\n // interacts with the searched gene\n const wrappedRawIxns = rawIxns.map(rawIxn => {\n return {name: rawIxn, color: ''};\n });\n const sortedRawIxns =\n sortAnnotsByRank(wrappedRawIxns, ideo).map(i => i.name);\n\n console.log('sortedRawIxns')\n console.log(sortedRawIxns)\n\n sortedRawIxns.forEach(rawIxn => {\n\n // Prevent overwriting searched gene. Occurs with e.g. human CD4\n if (rawIxn.includes(gene.name)) return;\n\n // if (rawIxn === '') return; // Avoid oddly blank placeholders\n\n const nameId = name + id;\n\n const isRelevant =\n isInteractionRelevant(rawIxn, gene, nameId, seenNameIds, ideo);\n\n if (isRelevant) {\n console.log('id, rawIxn', id, rawIxn)\n seenNameIds[nameId] = 1;\n const ixn = {name, pathwayId: id};\n if (rawIxn in ixns) {\n ixns[rawIxn].push(ixn);\n } else {\n ixns[rawIxn] = [ixn];\n }\n }\n });\n }\n });\n\n return ixns;\n}\n\n/**\n * Queries MyGene.info API, returns parsed JSON\n *\n * Docs:\n * https://docs.mygene.info/en/v3/\n *\n * Example:\n * https://mygene.info/v3/query?q=symbol:cdk2%20OR%20symbol:brca1&species=9606&fields=symbol,genomic_pos,name\n */\nasync function fetchMyGeneInfo(queryString) {\n const myGeneBase = 'https://mygene.info/v3/query';\n const response = await fetch(myGeneBase + queryString + '&size=400');\n const data = await response.json();\n return data;\n}\n\nfunction parseNameAndEnsemblIdFromMgiGene(gene) {\n const name = gene.name;\n const id = gene.genomic_pos.ensemblgene;\n let ensemblId = id;\n if (typeof id === 'undefined') {\n // Encountered in AKT3, when querying related genes for MTOR\n // A 'chr'omosome value containing _ indicates an alt loci scaffold,\n // so ignore that and take the Ensembl ID associated with the\n // first position of a primary chromosome.\n ensemblId =\n gene.genomic_pos.filter(pos => !pos.chr.includes('_'))[0].ensemblgene;\n }\n return {name, ensemblId};\n}\n\n/**\n * Summarizes interactions for a gene\n *\n * This comprises most of the content for tooltips for interacting genes.\n */\nfunction describeInteractions(gene, ixns, searchedGene) {\n const pathwayIds = [];\n const pathwayNames = [];\n let ixnsDescription = '';\n console.log('gene', gene)\n\n console.log('ixns', ixns)\n if (typeof ixns !== 'undefined') {\n // ixns is undefined when querying e.g. CDKN1B in human\n const pathwaysBase = 'https://www.wikipathways.org/index.php/Pathway:';\n const links = ixns.map(ixn => {\n const url = `${pathwaysBase}${ixn.pathwayId}`;\n pathwayIds.push(ixn.pathwayId);\n pathwayNames.push(ixn.name);\n return `${ixn.name}`;\n }).join('
    ');\n\n ixnsDescription =\n `Interacts with ${searchedGene.name} in:
    ${links}`;\n }\n\n const {name, ensemblId} = parseNameAndEnsemblIdFromMgiGene(gene);\n const type = 'interacting gene';\n const descriptionObj = {\n description: ixnsDescription,\n ixnsDescription, ensemblId, name, type, pathwayIds, pathwayNames\n };\n return descriptionObj;\n}\n\n/** Throw error when searched gene (e.g. \"Foo\") isn't found */\nfunction throwGeneNotFound(geneSymbol, ideo) {\n const organism = ideo.organismScientificName;\n throw Error(`\"${geneSymbol}\" is not a known gene in ${organism}`);\n}\n\n/**\n * Fetch genes from cache\n * Construct objects that match format of MyGene.info API response\n */\nfunction fetchGenesFromCache(names, type, ideo) {\n const cache = ideo.geneCache;\n const isSymbol = (type === 'symbol');\n const locusMap = isSymbol ? cache.lociByName : cache.lociById;\n const nameMap = isSymbol ? cache.idsByName : cache.namesById;\n\n const hits = names.map(name => {\n\n const nameLc = name.toLowerCase();\n\n if (!locusMap[name] && !cache.nameCaseMap[nameLc]) {\n if (isSymbol) {\n throwGeneNotFound(name, ideo);\n } else {\n return;\n }\n }\n\n // Canonicalize name if it is mistaken in upstream data source.\n // This can sometimes happen in WikiPathways, e.g. when searching\n // interactions for rat Pten, it includes a result for \"PIK3CA\".\n // In that case, this would correct PIK3CA to be Pik3ca.\n if (isSymbol && !locusMap[name] && cache.nameCaseMap[nameLc]) {\n name = cache.nameCaseMap[nameLc];\n }\n\n const locus = locusMap[name];\n const symbol = isSymbol ? name : nameMap[name];\n const ensemblId = isSymbol ? nameMap[name] : name;\n\n const hit = {\n symbol,\n name: '',\n source: 'cache',\n genomic_pos: {\n chr: locus[0],\n start: locus[1],\n end: locus[2],\n ensemblgene: ensemblId\n }\n };\n\n return hit;\n });\n\n const hitsWithGenomicPos = hits.filter(hit => hit !== undefined);\n\n return hitsWithGenomicPos;\n}\n\n/** Fetch genes from cache, or, if needed, from MyGene.info API */\nasync function fetchGenes(names, type, ideo) {\n\n let data;\n\n // Account for single-gene fetch\n if (typeof names === 'string') names = [names];\n\n // Query parameter for MyGene.info API\n const qParam = names.map(name => `${type}:${name.trim()}`).join(' OR ');\n const taxid = ideo.config.taxid;\n\n const queryStringBase = `?q=${qParam}&species=${taxid}&fields=`;\n\n if (ideo.geneCache) {\n const hits = fetchGenesFromCache(names, type, ideo);\n\n // Asynchronously fetch full name, but don't await the response, because\n // full names are only shown upon hovering over an annotation.\n const queryString = `${queryStringBase}symbol,name`;\n data = fetchMyGeneInfo(queryString).then(data => {\n data.hits.forEach((hit) => {\n const symbol = hit.symbol;\n const fullName = hit.name;\n if (symbol in ideo.annotDescriptions.annots) {\n ideo.annotDescriptions.annots[symbol].name = fullName;\n } else {\n ideo.annotDescriptions.annots[symbol] = {name: fullName};\n }\n });\n });\n\n data = {hits, fromGeneCache: true};\n } else {\n // Fetch gene data from MyGene.info\n const queryString = `${queryStringBase}symbol,genomic_pos,name`;\n data = await fetchMyGeneInfo(queryString);\n }\n\n return data;\n}\n\n/**\n * Retrieves position and other data on interacting genes from MyGene.info\n */\nasync function fetchInteractionAnnots(interactions, searchedGene, ideo) {\n\n const annots = [];\n const symbols = Object.keys(interactions);\n\n if (symbols.length === 0) return annots;\n\n const data = await fetchGenes(symbols, 'symbol', ideo);\n\n data.hits.forEach(gene => {\n // If hit lacks position\n // or is same as searched gene (e.g. search for human SRC),\n // then skip processing\n if (\n 'genomic_pos' in gene === false ||\n gene.symbol === searchedGene.name\n ) {\n return;\n }\n\n const annot = parseAnnotFromMgiGene(gene, ideo, 'purple');\n annots.push(annot);\n\n const ixns = interactions[gene.symbol];\n\n const descriptionObj = describeInteractions(gene, ixns, searchedGene);\n\n mergeDescriptions(annot, descriptionObj, ideo);\n });\n\n // Fetch GPML files to use when updating interaction descriptions with\n // refined direction.\n fetchGpmls(ideo);\n\n return annots;\n}\n\n/** Fetch paralog positions from MyGeneInfo */\nasync function fetchParalogPositionsFromMyGeneInfo(\n homologs, searchedGene, ideo\n) {\n const annots = [];\n const ensemblIds = homologs.map(homolog => homolog.id);\n\n const data = await fetchGenes(ensemblIds, 'ensemblgene', ideo);\n\n data.hits.forEach(gene => {\n\n // If hit lacks position, skip processing\n if ('genomic_pos' in gene === false) return;\n if ('name' in gene === false) return;\n\n const annot = parseAnnotFromMgiGene(gene, ideo, 'pink');\n annots.push(annot);\n\n const description = `Paralog of ${searchedGene.name}`;\n const {name, ensemblId} = parseNameAndEnsemblIdFromMgiGene(gene);\n const type = 'paralogous gene';\n const descriptionObj = {description, ensemblId, name, type};\n mergeDescriptions(annot, descriptionObj, ideo);\n });\n\n return annots;\n}\n\n/**\n * Fetch paralogs of searched gene\n */\nasync function fetchParalogs(annot, ideo) {\n const taxid = ideo.config.taxid;\n\n // Fetch paralogs\n const params = `&format=condensed&type=paralogues&target_taxon=${taxid}`;\n const path = `/homology/id/${annot.id}?${params}`;\n const ensemblHomologs = await Ideogram.fetchEnsembl(path);\n const homologs = ensemblHomologs.data[0].homologies;\n\n // Fetch positions of paralogs\n let annots =\n await fetchParalogPositionsFromMyGeneInfo(homologs, annot, ideo);\n\n // Omit genes named like \"AC113554.1\", which is an \"accession.version\".\n // Such accVers are raw and poorly suited here.\n annots = annots.filter(annot => {\n const isAccVer = annot.name.match(/^AC[0-9.]+$/);\n return !isAccVer;\n });\n\n return annots;\n}\n\n/**\n * Filters out placements on alternative loci scaffolds, an advanced\n * genome assembly feature we are not concerned with in ideograms.\n *\n * Example:\n * https://mygene.info/v3/query?q=symbol:PTPRC&species=9606&fields=symbol,genomic_pos,name\n */\nfunction getGenomicPos(gene, ideo) {\n let genomicPos = null;\n if (Array.isArray(gene.genomic_pos)) {\n genomicPos = gene.genomic_pos.filter(pos => {\n return pos.chr in ideo.chromosomes[ideo.config.taxid];\n })[0];\n } else {\n genomicPos = gene.genomic_pos;\n }\n return genomicPos;\n}\n\n/**\n * Transforms MyGene.info (MGI) gene into Ideogram annotation\n */\nfunction parseAnnotFromMgiGene(gene, ideo, color='red') {\n const genomicPos = getGenomicPos(gene, ideo);\n\n const annot = {\n name: gene.symbol,\n chr: genomicPos.chr,\n start: genomicPos.start,\n stop: genomicPos.end,\n id: genomicPos.ensemblgene,\n color\n };\n\n return annot;\n}\n\nfunction moveLegend() {\n const ideoInnerDom = document.querySelector('#_ideogramInnerWrap');\n const decorPad = setRelatedDecorPad({}).legendPad;\n const left = decorPad + 20;\n const legendStyle = `position: absolute; top: 15px; left: ${left}px`;\n const legend = document.querySelector('#_ideogramLegend');\n ideoInnerDom.prepend(legend);\n legend.style = legendStyle;\n}\n\n/** Filter annotations to only include those in configured list */\nfunction applyAnnotsIncludeList(annots, ideo) {\n\n if (ideo.config.annotsInList === 'all') return annots;\n\n const includedAnnots = [];\n annots.forEach(annot => {\n if (ideo.config.annotsInList.includes(annot.name.toLowerCase())) {\n includedAnnots.push(annot);\n }\n });\n return includedAnnots;\n}\n\n/** Fetch and draw interacting genes, return Promise for annots */\nfunction processInteractions(annot, ideo) {\n return new Promise(async (resolve) => {\n const t0 = performance.now();\n\n const interactions = await fetchInteractions(annot, ideo);\n const annots = await fetchInteractionAnnots(interactions, annot, ideo);\n\n ideo.relatedAnnots.push(...annots);\n finishPlotRelatedGenes('interacting', ideo);\n\n ideo.time.rg.interactions = timeDiff(t0);\n\n resolve();\n });\n}\n\n/** Find and draw paralogs, return Promise for annots */\nfunction processParalogs(annot, ideo) {\n return new Promise(async (resolve) => {\n const t0 = performance.now();\n\n const annots = await fetchParalogs(annot, ideo);\n ideo.relatedAnnots.push(...annots);\n finishPlotRelatedGenes('paralogous', ideo);\n\n ideo.time.rg.paralogs = timeDiff(t0);\n\n resolve();\n });\n}\n\n/**\n * Sorts gene names consistently.\n *\n * Might also loosely rank by first-discovered or most prominent\n */\nfunction sortGeneNames(aName, bName) {\n // Rank shorter names above longer names\n if (bName.length !== aName.length) return bName.length - aName.length;\n\n // Rank names of equal length alphabetically\n return [aName, bName].sort().indexOf(aName) === 0 ? 1 : -1;\n}\n\n/** Sorts by relevance of related status */\nfunction sortAnnotsByRelatedStatus(a, b) {\n var aName, bName, aColor, bColor;\n if ('name' in a) {\n // Locally processed annotations\n aName = a.name;\n bName = b.name;\n aColor = a.color;\n bColor = b.color;\n } else {\n // Raw annotations\n [aName, aColor] = [a[0], a[3]];\n [bName, bColor] = [b[0], b[3]];\n }\n\n // Rank red (searched gene) highest\n if (aColor === 'red') return -1;\n if (bColor === 'red') return 1;\n\n // Rank purple (interacting gene) above red (paralogous gene)\n if (aColor === 'purple' && bColor === 'pink') return -1;\n if (bColor === 'purple' && aColor === 'pink') return 1;\n\n return sortGeneNames(aName, bName);\n}\n\nfunction mergeDescriptions(annot, desc, ideo) {\n let mergedDesc;\n const descriptions = ideo.annotDescriptions.annots;\n if (annot.name in descriptions) {\n const otherDesc = descriptions[annot.name];\n mergedDesc = desc;\n if (desc.type === otherDesc.type) return;\n Object.keys(otherDesc).forEach(function(key) {\n if (key in mergedDesc === false) {\n mergedDesc[key] = otherDesc[key];\n }\n });\n // Object.assign({}, descriptions[annot.name]);\n mergedDesc.type += ', ' + otherDesc.type;\n mergedDesc.description += `

    ${otherDesc.description}`;\n } else {\n mergedDesc = desc;\n }\n\n ideo.annotDescriptions.annots[annot.name] = mergedDesc;\n}\n\nfunction mergeAnnots(unmergedAnnots) {\n\n const seenAnnots = {};\n let mergedAnnots = [];\n\n unmergedAnnots.forEach((annot) => {\n if (annot.name in seenAnnots === false) {\n mergedAnnots.push(annot);\n seenAnnots[annot.name] = 1;\n } else {\n if (annot.color === 'purple') {\n mergedAnnots = mergedAnnots.map((mergedAnnot) => {\n return (annot.name === mergedAnnot.name) ? annot : mergedAnnot;\n });\n }\n }\n });\n\n return mergedAnnots;\n}\n\n/** Filter, sort, draw annots. Move legend. */\nfunction finishPlotRelatedGenes(type, ideo) {\n let annots = ideo.relatedAnnots.slice();\n\n annots = applyAnnotsIncludeList(annots, ideo);\n annots = mergeAnnots(annots);\n annots = applyRankCutoff(annots, 40, ideo);\n ideo.relatedAnnots = mergeAnnots(annots);\n ideo.relatedAnnots = applyRankCutoff(annots, 40, ideo);\n annots.sort(sortAnnotsByRelatedStatus);\n ideo.relatedAnnots.sort(sortAnnotsByRelatedStatus);\n\n if (annots.length > 1 && ideo.onFindRelatedGenesCallback) {\n ideo.onFindRelatedGenesCallback();\n }\n\n ideo.drawAnnots(annots);\n\n if (ideo.config.showAnnotLabels) {\n setRelatedAnnotDomIds(ideo);\n ideo.fillAnnotLabels(ideo.relatedAnnots);\n }\n\n moveLegend();\n\n analyzePlotTimes(type, ideo);\n}\n\n/** Fetch position of searched gene, return corresponding annotation */\nasync function processSearchedGene(geneSymbol, ideo) {\n const t0 = performance.now();\n\n const data = await fetchGenes(geneSymbol, 'symbol', ideo);\n\n if (data.hits.length === 0) {\n return;\n }\n const gene = data.hits.find(hit => {\n const genomicPos = getGenomicPos(hit, ideo); // omits alt loci\n return genomicPos && genomicPos.ensemblgene;\n });\n const ensemblId = gene.genomic_pos.ensemblgene;\n\n // Assign tooltip content. Much of the content is often retrieved from\n // the gene cache. In that case, all fields except `name` are fetched\n // from cache. Occasionally, e.g. often upon the very first search, no\n // content is yet available from cache.\n let desc = {description: '', ensemblId, type: 'searched gene'};\n if (gene.symbol in ideo.annotDescriptions.annots) {\n // Most content already set via cache.\n // `name` will be set via non-blocking part of `fetchGenes`.\n const oldDesc = ideo.annotDescriptions.annots[gene.symbol];\n desc = Object.assign(oldDesc, desc);\n } else {\n // No content has been set yet via cache. In this case, `gene` already\n // has all the data needed for the searched gene's tooltip content.\n desc.name = gene.name;\n }\n\n ideo.annotDescriptions.annots[gene.symbol] = desc;\n\n const annot = parseAnnotFromMgiGene(gene, ideo);\n\n ideo.relatedAnnots.push(annot);\n\n ideo.time.rg.searchedGene = timeDiff(t0);\n\n return annot;\n}\n\nfunction adjustPlaceAndVisibility(ideo) {\n var ideoContainerDom = document.querySelector(ideo.config.container);\n\n ideoContainerDom.style.visibility = '';\n ideoContainerDom.style.position = 'absolute';\n ideoContainerDom.style.width = '100%';\n\n var ideoInnerDom = document.querySelector('#_ideogramInnerWrap');\n ideoInnerDom.style.position = 'relative';\n ideoInnerDom.style.marginLeft = 'auto';\n ideoInnerDom.style.marginRight = 'auto';\n ideoInnerDom.style.overflowY = 'hidden';\n document.querySelector('#_ideogramMiddleWrap').style.overflowY = 'hidden';\n\n const legendPad = ideo.config.legendPad;\n\n if (typeof ideo.didAdjustIdeogramLegend === 'undefined') {\n // Accounts for moving legend when external content at left or right\n // is variable upon first rendering plotted genes\n\n var ideoDom = document.querySelector('#_ideogram');\n const legendWidth = 160;\n ideoInnerDom.style.maxWidth =\n (\n parseInt(ideoInnerDom.style.maxWidth) +\n legendWidth +\n legendPad\n ) + 'px';\n\n ideoDom.style.minWidth =\n (parseInt(ideoDom.style.minWidth) + legendPad) + 'px';\n ideoDom.style.maxWidth =\n (parseInt(ideoDom.style.minWidth) + legendPad) + 'px';\n ideoDom.style.position = 'relative';\n ideoDom.style.left = legendWidth + 'px';\n\n ideo.didAdjustIdeogramLegend = true;\n }\n}\n\n/**\n * For given gene, finds and draws interacting genes and paralogs\n *\n * @param geneSymbol {String} Gene symbol, e.g. RAD51\n */\nasync function plotRelatedGenes(geneSymbol=null) {\n\n const ideo = this;\n\n ideo.clearAnnotLabels();\n const legend = document.querySelector('#_ideogramLegend');\n if (legend) legend.remove();\n\n if (!geneSymbol) {\n return plotGeneHints(ideo);\n }\n\n ideo.config = setRelatedDecorPad(ideo.config);\n\n const organism = ideo.getScientificName(ideo.config.taxid);\n const version = Ideogram.version;\n const headers = [\n `# Related genes for ${geneSymbol} in ${organism}`,\n `# Generated by Ideogram.js version ${version}, https://github.com/eweitz/ideogram`,\n `# Generated at ${window.location.href}`\n ].join('\\n');\n\n delete ideo.annotDescriptions;\n ideo.annotDescriptions = {headers, annots: {}};\n\n const ideoSel = ideo.selector;\n const annotSel = ideoSel + ' .annot';\n document.querySelectorAll(annotSel).forEach(el => el.remove());\n\n ideo.startHideAnnotTooltipTimeout();\n\n // Refine style\n document.querySelectorAll('.chromosome').forEach(chromosome => {\n chromosome.style.cursor = '';\n });\n\n adjustPlaceAndVisibility(ideo);\n\n ideo.relatedAnnots = [];\n\n // Fetch positon of searched gene\n const annot = await processSearchedGene(geneSymbol, ideo);\n\n if (typeof annot === 'undefined') throwGeneNotFound(geneSymbol, ideo);\n\n ideo.config.legend = relatedLegend;\n writeLegend(ideo);\n moveLegend();\n\n await Promise.all([\n processInteractions(annot, ideo),\n processParalogs(annot, ideo)\n ]);\n\n ideo.time.rg.total = timeDiff(ideo.time.rg.t0);\n\n analyzeRelatedGenes(ideo);\n\n if (ideo.onPlotRelatedGenesCallback) ideo.onPlotRelatedGenesCallback();\n}\n\nfunction getAnnotByName(annotName, ideo) {\n var annotByName;\n ideo.annots.forEach(annotsByChr => {\n annotsByChr.annots.forEach(annot => {\n if (annotName === annot.name) {\n annotByName = annot;\n }\n });\n });\n return annotByName;\n}\n\n/**\n * Handles click within annotation tooltip\n *\n * Makes clicking link in tooltip behave same as clicking annotation\n */\nfunction handleTooltipClick(ideo) {\n const tooltip = document.querySelector('._ideogramTooltip');\n if (!ideo.addedTooltipClickHandler) {\n tooltip.addEventListener('click', () => {\n const geneDom = document.querySelector('#ideo-related-gene');\n const annotName = geneDom.textContent;\n const annot = getAnnotByName(annotName, ideo);\n ideo.onClickAnnot(annot);\n });\n\n // Ensures handler isn't added redundantly. This is used because\n // addEventListener options like {once: true} don't suffice\n ideo.addedTooltipClickHandler = true;\n }\n}\n\n/**\n * Enhance tooltip shown on hovering over gene annotation\n */\nfunction decorateRelatedGene(annot) {\n const ideo = this;\n const descObj = ideo.annotDescriptions.annots[annot.name];\n\n console.log('annot', annot)\n console.log('descObj')\n console.log(descObj)\n if ('type' in descObj && descObj.type.includes('interacting gene')) {\n const pathwayIds = descObj.pathwayIds;\n const summary = summarizeInteractions(annot.name, pathwayIds, ideo);\n if (summary !== null) {\n const oldSummary = 'Interacts with';\n descObj.description =\n descObj.description.replace(oldSummary, summary);\n }\n }\n\n const description =\n descObj.description.length > 0 ? `
    ${descObj.description}` : '';\n const fullName = descObj.name;\n const style = 'style=\"color: #0366d6; cursor: pointer;\"';\n\n const originalDisplay =\n `${annot.name}
    ` +\n `${fullName}
    ` +\n `${description}` +\n `
    `;\n\n annot.displayName = originalDisplay;\n\n\n handleTooltipClick(ideo);\n\n return annot;\n}\n\nconst shape = 'triangle';\n\nconst legendHeaderStyle =\n `font-size: 14px; font-weight: bold; font-color: #333;`;\nconst relatedLegend = [{\n name: `\n
    \n
    Related genes
    \n Click gene to search\n
    \n `,\n nameHeight: 50,\n rows: [\n {name: 'Interacting gene', color: 'purple', shape: shape},\n {name: 'Paralogous gene', color: 'pink', shape: shape},\n {name: 'Searched gene', color: 'red', shape: shape}\n ]\n}];\n\nconst citedLegend = [{\n name: `\n
    \n
    Highly cited genes
    \n Click gene to search\n
    \n `,\n nameHeight: 30,\n rows: []\n}];\n\n/** Sets legendPad for related genes view */\nfunction setRelatedDecorPad(kitConfig) {\n if (kitConfig.showAnnotLabels) {\n kitConfig.legendPad = 70;\n } else {\n kitConfig.legendPad = 30;\n }\n return kitConfig;\n}\n\n/**\n * Wrapper for Ideogram constructor, with generic \"Related genes\" options\n *\n * This function is made available as a static method on Ideogram.\n *\n * @param {Object} config Ideogram configuration object\n */\nfunction _initRelatedGenes(config, annotsInList) {\n\n if (annotsInList !== 'all') {\n annotsInList = annotsInList.map(name => name.toLowerCase());\n }\n\n const kitDefaults = {\n showFullyBanded: false,\n rotatable: false,\n legend: relatedLegend,\n chrBorderColor: '#333',\n chrLabelColor: '#333',\n onWillShowAnnotTooltip: decorateRelatedGene,\n annotsInList: annotsInList,\n showTools: true,\n showAnnotLabels: true,\n relatedGenesMode: 'related'\n };\n\n if ('onWillShowAnnotTooltip' in config) {\n const key = 'onWillShowAnnotTooltip';\n const clientFn = config[key];\n const defaultFunction = kitDefaults[key];\n const newFunction = function(annot) {\n annot = defaultFunction.bind(this)(annot);\n annot = clientFn.bind(this)(annot);\n return annot;\n };\n kitDefaults[key] = newFunction;\n delete config[key];\n }\n\n // Override kit defaults if client specifies otherwise\n let kitConfig = Object.assign(kitDefaults, config);\n\n kitConfig = setRelatedDecorPad(kitConfig);\n\n const ideogram = new Ideogram(kitConfig);\n\n // Called upon completing last plot, including all related genes\n if (config.onPlotRelatedGenes) {\n ideogram.onPlotRelatedGenesCallback = config.onPlotRelatedGenes;\n }\n\n // Called upon 1) finding paralogs, and 2) finding interacting genes\n if (config.onFindRelatedGenes) {\n ideogram.onFindRelatedGenesCallback = config.onFindRelatedGenes;\n }\n\n ideogram.getTooltipAnalytics = getRelatedGenesTooltipAnalytics;\n\n ideogram.annotSortFunction = sortAnnotsByRelatedStatus;\n\n initAnalyzeRelatedGenes(ideogram);\n\n initGeneCache(ideogram.config.organism, ideogram);\n\n return ideogram;\n}\n\nfunction plotGeneHints() {\n const ideo = this;\n\n if (!ideo || 'annotDescriptions' in ideo) return;\n\n ideo.annotDescriptions = {annots: {}};\n\n ideo.flattenAnnots().map((annot) => {\n let description = [];\n if ('significance' in annot && annot.significance !== 'n/a') {\n description.push(annot.significance);\n }\n if ('citations' in annot && annot.citations !== undefined) {\n description.push(annot.citations);\n }\n description = description.join('

    ');\n ideo.annotDescriptions.annots[annot.name] = {\n description,\n name: annot.fullName\n };\n });\n\n adjustPlaceAndVisibility(ideo);\n moveLegend();\n ideo.fillAnnotLabels();\n const container = ideo.config.container;\n document.querySelector(container).style.visibility = '';\n}\n\n/**\n * Wrapper for Ideogram constructor, with generic \"Related genes\" options\n *\n * This function is made available as a static method on Ideogram.\n *\n * @param {Object} config Ideogram configuration object\n */\nfunction _initGeneHints(config, annotsInList) {\n\n delete config.onPlotRelatedGenes;\n\n if (annotsInList !== 'all') {\n annotsInList = annotsInList.map(name => name.toLowerCase());\n }\n\n const annotsPath =\n getDir('cache/homo-sapiens-top-genes.tsv');\n\n const kitDefaults = {\n showFullyBanded: false,\n rotatable: false,\n legend: citedLegend,\n chrMargin: -4,\n chrBorderColor: '#333',\n chrLabelColor: '#333',\n onWillShowAnnotTooltip: decorateRelatedGene,\n annotsInList: annotsInList,\n showTools: true,\n showAnnotLabels: true,\n onDrawAnnots: plotGeneHints,\n annotationsPath: annotsPath,\n relatedGenesMode: 'hints'\n };\n\n if ('onWillShowAnnotTooltip' in config) {\n const key = 'onWillShowAnnotTooltip';\n const clientFn = config[key];\n const defaultFunction = kitDefaults[key];\n const newFunction = function(annot) {\n annot = defaultFunction.bind(this)(annot);\n annot = clientFn.bind(this)(annot);\n return annot;\n };\n kitDefaults[key] = newFunction;\n delete config[key];\n }\n\n if ('onDrawAnnots' in config) {\n const key = 'onDrawAnnots';\n const clientFn = config[key];\n const defaultFunction = kitDefaults[key];\n const newFunction = function() {\n defaultFunction.bind(this)();\n clientFn.bind(this)();\n };\n kitDefaults[key] = newFunction;\n delete config[key];\n }\n\n // Override kit defaults if client specifies otherwise\n const kitConfig = Object.assign(kitDefaults, config);\n\n if (kitConfig.showAnnotLabels) {\n kitConfig.legendPad = 80;\n } else {\n kitConfig.legendPad = 30;\n }\n\n const ideogram = new Ideogram(kitConfig);\n\n // Called upon completing last plot, including all related genes\n if (config.onPlotRelatedGenes) {\n ideogram.onPlotRelatedGenesCallback = config.onPlotRelatedGenes;\n }\n\n // Called upon 1) finding paralogs, and 2) finding interacting genes\n if (config.onFindRelatedGenes) {\n ideogram.onFindRelatedGenesCallback = config.onFindRelatedGenes;\n }\n\n ideogram.getTooltipAnalytics = getRelatedGenesTooltipAnalytics;\n\n ideogram.annotSortFunction = sortAnnotsByRelatedStatus;\n\n initAnalyzeRelatedGenes(ideogram);\n\n initGeneCache(ideogram.config.organism, ideogram);\n\n return ideogram;\n}\n\nexport {\n _initGeneHints, _initRelatedGenes, plotRelatedGenes, getRelatedGenesByType\n};\n","/**\n * @fileoverview Core module of Ideogram.js, links all other modules\n * This file defines the Ideogram class, its constructor method, and its\n * static methods. All instance methods are defined in other modules.\n *\n */\n\nimport version from './version';\n\nimport {\n configure, initDrawChromosomes, handleRotateOnClick, onLoad,\n init, finishInit, writeContainer\n} from './init/init';\n\nimport {\n onLoadAnnots, onDrawAnnots, processAnnotData, restoreDefaultTracks,\n updateDisplayedTracks, initAnnotSettings, fetchAnnots, drawAnnots,\n getHistogramBars, drawHeatmaps, deserializeAnnotsForHeatmap, fillAnnots,\n drawProcessedAnnots, drawSynteny, startHideAnnotTooltipTimeout,\n showAnnotTooltip, onWillShowAnnotTooltip, setOriginalTrackIndexes,\n afterRawAnnots, onClickAnnot, downloadAnnotations, addAnnotLabel,\n removeAnnotLabel, fillAnnotLabels, clearAnnotLabels, flattenAnnots\n // fadeOutAnnotLabels\n} from './annotations/annotations';\n\nimport {highlight, unhighlight} from './annotations/highlight';\n\nimport {\n esearch, esummary, elink,\n getOrganismFromEutils, getTaxids,\n getAssemblyAndChromosomesFromEutils\n} from './services/services';\n\nimport {\n drawBandLabels, getBandColorGradients, processBandData,\n setBandsToShow, hideUnshownBandLabels, drawBandLabelText, drawBandLabelStalk\n} from './bands/bands';\n\nimport {onBrushMove, onBrushEnd, createBrush} from './brush';\nimport {onCursorMove, createClickCursor} from './cursor';\nimport {drawSexChromosomes, setSexChromosomes} from './sex-chromosomes';\nimport {convertBpToPx, convertPxToBp} from './coordinate-converters';\nimport {\n unpackAnnots, packAnnots, initCrossFilter, filterAnnots\n} from './filter';\n\nimport {\n assemblyIsAccession, getDataDir, round, onDidRotate, getSvg, d3,\n getTaxid, getCommonName, getScientificName, fetch as _fetch,\n isRoman, parseRoman\n} from './lib';\n\nimport {\n getChromosomeModel, getChromosomePixels\n} from './views/chromosome-model';\n\nimport {\n appendHomolog, drawChromosome, rotateAndToggleDisplay, setOverflowScroll\n} from './views/draw-chromosomes';\n\nimport {\n drawChromosomeLabels, rotateChromosomeLabels\n} from './views/chromosome-labels.js';\n\nimport {\n _initGeneHints, _initRelatedGenes, plotRelatedGenes, getRelatedGenesByType\n} from './kit/related-genes';\n\nexport default class Ideogram {\n constructor(config) {\n\n // Functions from init.js\n this.configure = configure;\n this.initDrawChromosomes = initDrawChromosomes;\n this.onLoad = onLoad;\n this.handleRotateOnClick = handleRotateOnClick;\n this.init = init;\n this.finishInit = finishInit;\n this.writeContainer = writeContainer;\n\n // Functions from annotations.js\n this.onLoadAnnots = onLoadAnnots;\n this.onDrawAnnots = onDrawAnnots;\n this.processAnnotData = processAnnotData;\n this.restoreDefaultTracks = restoreDefaultTracks;\n this.updateDisplayedTracks = updateDisplayedTracks;\n this.initAnnotSettings = initAnnotSettings;\n this.fetchAnnots = fetchAnnots;\n this.drawAnnots = drawAnnots;\n this.getHistogramBars = getHistogramBars;\n this.drawHeatmaps = drawHeatmaps;\n this.deserializeAnnotsForHeatmap = deserializeAnnotsForHeatmap;\n this.fillAnnots = fillAnnots;\n this.drawProcessedAnnots = drawProcessedAnnots;\n this.drawSynteny = drawSynteny;\n this.startHideAnnotTooltipTimeout = startHideAnnotTooltipTimeout;\n this.showAnnotTooltip = showAnnotTooltip;\n this.onWillShowAnnotTooltip = onWillShowAnnotTooltip;\n this.onClickAnnot = onClickAnnot;\n this.setOriginalTrackIndexes = setOriginalTrackIndexes;\n this.afterRawAnnots = afterRawAnnots;\n this.downloadAnnotations = downloadAnnotations;\n this.addAnnotLabel = addAnnotLabel;\n this.removeAnnotLabel = removeAnnotLabel;\n // this.fadeOutAnnotLabels = fadeOutAnnotLabels;\n this.fillAnnotLabels = fillAnnotLabels;\n this.clearAnnotLabels = clearAnnotLabels;\n this.flattenAnnots = flattenAnnots;\n\n this.highlight = highlight;\n this.unhighlight = unhighlight;\n\n // Variables and functions from services.js\n this.esearch = esearch;\n this.esummary = esummary;\n this.elink = elink;\n this.getOrganismFromEutils = getOrganismFromEutils;\n this.getTaxids = getTaxids;\n this.getAssemblyAndChromosomesFromEutils =\n getAssemblyAndChromosomesFromEutils;\n\n // Functions from bands.js\n this.drawBandLabels = drawBandLabels;\n this.getBandColorGradients = getBandColorGradients;\n this.processBandData = processBandData;\n this.setBandsToShow = setBandsToShow;\n this.hideUnshownBandLabels = hideUnshownBandLabels;\n this.drawBandLabelText = drawBandLabelText;\n this.drawBandLabelStalk = drawBandLabelStalk;\n\n // Functions from brush.js\n this.onBrushMove = onBrushMove;\n this.onBrushEnd = onBrushEnd;\n this.createBrush = createBrush;\n\n // Functions from cursor.js\n this.createClickCursor = createClickCursor;\n this.onCursorMove = onCursorMove;\n\n // Functions from sex-chromosomes.js\n this.drawSexChromosomes = drawSexChromosomes;\n this.setSexChromosomes = setSexChromosomes;\n\n // Functions from coordinate-converters.js\n this.convertBpToPx = convertBpToPx;\n this.convertPxToBp = convertPxToBp;\n\n // Functions from filter.js\n this.unpackAnnots = unpackAnnots;\n this.packAnnots = packAnnots;\n this.initCrossFilter = initCrossFilter;\n this.filterAnnots = filterAnnots;\n\n // Functions from lib\n this.assemblyIsAccession = assemblyIsAccession;\n this.getDataDir = getDataDir;\n this.round = round;\n this.onDidRotate = onDidRotate;\n this.getSvg = getSvg;\n this.fetch = _fetch;\n this.getTaxid = getTaxid;\n this.getCommonName = getCommonName;\n this.getScientificName = getScientificName;\n\n // Functions from views/chromosome-model.js\n this.getChromosomeModel = getChromosomeModel;\n this.getChromosomePixels = getChromosomePixels;\n\n // Functions from views/chromosome-labels.js\n this.drawChromosomeLabels = drawChromosomeLabels;\n this.rotateChromosomeLabels = rotateChromosomeLabels;\n\n // Functions from views/draw-chromosomes.js\n this.appendHomolog = appendHomolog;\n this.drawChromosome = drawChromosome;\n this.rotateAndToggleDisplay = rotateAndToggleDisplay;\n this.setOverflowScroll = setOverflowScroll;\n\n this.plotRelatedGenes = plotRelatedGenes;\n this.getRelatedGenesByType = getRelatedGenesByType;\n\n this.configure(config);\n }\n\n /**\n * Get the current version of Ideogram.js\n */\n static get version() {\n return version;\n }\n\n /**\n * Enable use of D3 in client apps, via \"d3 = Ideogram.d3\"\n */\n static get d3() {\n return d3;\n }\n\n /**\n * Request data from Ensembl REST API\n * Docs: https://rest.ensembl.org/\n *\n * @param {String} path URL path\n * @param {Object} body POST body\n * @param {String} method HTTP method; 'GET' (default) or 'POST'\n */\n static async fetchEnsembl(path, body = null, method = 'GET') {\n const init = {\n method: method\n };\n if (body !== null) init.body = JSON.stringify(body);\n if (method === 'GET') {\n // Use HTTP parameter, not header, to avoid needless OPTIONS request\n const delimiter = path.includes('&') ? '&' : '?';\n path += delimiter + 'content-type=application/json';\n } else {\n // Method is POST, so content-type must be defined in header\n init.headers = {'Content-Type': 'application/json'};\n }\n\n // const random = Math.random();\n // console.log(random)\n // if (random < 0.5) {\n const response = await fetch(`https://rest.ensembl.org${path}`, init);\n const json = await response.json();\n return json;\n // } else {\n // // Mock error\n // init.headers = {'Content-Type': 'application/json'};\n // const response = await fetch('https://httpstat.us/500/cors', init);\n // const json = await response.json();\n // return json;\n // }\n }\n\n /**\n * Helper for sortChromosomes().\n * Gets names and biological types for diverse chromosome variables\n */\n static getChrSortNamesAndTypes(a, b) {\n var chrAName, chrBName,\n aIsCP, bIsCP, aIsMT, bIsMT, aIsAP, bIsAP, aIsNuclear, bIsNuclear;\n\n if (typeof a === 'string' || 'chr' in a && 'annots' in a) {\n // Chromosome data is from either:\n // - Ideogram static file cache (e.g. homo-sapiens.json)\n // - Ideogram raw annotations\n chrAName = (typeof a === 'string') ? a : a.chr;\n chrBName = (typeof b === 'string') ? b : b.chr;\n\n aIsCP = chrAName === 'CP';\n bIsCP = chrBName === 'CP';\n aIsMT = chrAName === 'MT';\n bIsMT = chrBName === 'MT';\n aIsAP = chrAName === 'AP';\n bIsAP = chrBName === 'AP';\n aIsNuclear = (!aIsCP && !aIsMT && !aIsAP);\n bIsNuclear = (!bIsCP && !bIsMT && !bIsAP);\n } else {\n // Chromosome data is from NCBI E-Utils web API\n chrAName = a.name;\n chrBName = b.name;\n\n aIsCP = a.type === 'chloroplast';\n bIsCP = b.type === 'chloroplast';\n aIsMT = a.type === 'mitochondrion';\n bIsMT = b.type === 'mitochondrion';\n aIsAP = a.type === 'apicoplast';\n bIsAP = b.type === 'apicoplast';\n aIsNuclear = a.type === 'nuclear';\n bIsNuclear = b.type === 'nuclear';\n }\n\n const chrTypes = {\n aIsNuclear, bIsNuclear, aIsCP, bIsCP, aIsMT, bIsMT, aIsAP, bIsAP\n };\n\n return [chrAName, chrBName, chrTypes];\n }\n\n /**\n * Sorts two chromosome objects by type and name\n * - Nuclear chromosomes come before non-nuclear chromosomes.\n * - Among nuclear chromosomes, use \"natural sorting\", e.g.\n * numbers come before letters\n * - Among non-nuclear chromosomes, i.e. \"MT\" (mitochondrial DNA) and\n * \"CP\" (chromoplast DNA), MT comes first\n *\n * @param a Chromosome string or object \"A\"\n * @param b Chromosome string or object \"B\"\n * @returns {Number} JavaScript sort order indicator\n */\n static sortChromosomes(a, b) {\n\n let [chrAName, chrBName, chrTypes] =\n Ideogram.getChrSortNamesAndTypes(a, b);\n\n const {\n aIsNuclear, bIsNuclear, aIsCP, bIsCP, aIsMT, bIsMT, aIsAP, bIsAP\n } = chrTypes;\n\n if (aIsNuclear && bIsNuclear) {\n\n if (isRoman(chrAName) && isRoman(chrBName)) {\n // As in yeast genome\n chrAName = parseRoman(chrAName).toString();\n chrBName = parseRoman(chrBName).toString();\n }\n\n return chrAName.localeCompare(chrBName, 'en', {numeric: true});\n } else if (!aIsNuclear && bIsNuclear) {\n return 1;\n } else if (aIsMT && bIsCP) {\n return 1;\n } else if (aIsCP && bIsMT) {\n return -1;\n } else if (!aIsAP && !aIsMT && !aIsCP && (bIsMT || bIsCP || bIsAP)) {\n return -1;\n }\n }\n\n /**\n * Wrapper for Ideogram constructor, with generic \"Related genes\" options\n *\n * @param {Object} config Ideogram configuration object\n */\n static initRelatedGenes(config, annotsInList='all') {\n return _initRelatedGenes(config, annotsInList);\n }\n\n /**\n * Wrapper for Ideogram constructor, with generic \"Related genes\" options\n *\n * @param {Object} config Ideogram configuration object\n */\n static initGeneHints(config, annotsInList='all') {\n return _initGeneHints(config, annotsInList);\n }\n}\n","var version = '1.34.0';\nexport default version;\n","import Ideogram from './ideogram';\n\n// Enable references to Ideogram when loaded via traditional script tag\nwindow.Ideogram = Ideogram;\n\n// Enable references to Ideogram when imported as an ES6 module\nexport default Ideogram;\n"],"names":["root","factory","exports","module","define","amd","a","i","self","__webpack_require__","definition","key","o","Object","defineProperty","enumerable","get","obj","prop","prototype","hasOwnProperty","call","Symbol","toStringTag","value","none","selector","this","querySelector","x","Array","from","empty","querySelectorAll","matches","childMatcher","node","find","childFirst","firstElementChild","filter","children","update","length","EnterNode","parent","datum","ownerDocument","namespaceURI","_next","_parent","__data__","bindIndex","group","enter","exit","data","groupLength","dataLength","bindKey","keyValue","nodeByKeyValue","Map","keyValues","has","set","delete","ascending","b","NaN","constructor","appendChild","child","insertBefore","next","xhtml","svg","xlink","xml","xmlns","name","prefix","indexOf","slice","namespaces","space","local","attrRemove","removeAttribute","attrRemoveNS","fullname","removeAttributeNS","attrConstant","setAttribute","attrConstantNS","setAttributeNS","attrFunction","v","apply","arguments","attrFunctionNS","defaultView","document","styleRemove","style","removeProperty","styleConstant","priority","setProperty","styleFunction","styleValue","getPropertyValue","getComputedStyle","propertyRemove","propertyConstant","propertyFunction","classArray","string","trim","split","classList","ClassList","_node","_names","getAttribute","classedAdd","names","list","n","add","classedRemove","remove","classedTrue","classedFalse","classedFunction","textRemove","textContent","textConstant","textFunction","htmlRemove","innerHTML","htmlConstant","htmlFunction","raise","nextSibling","parentNode","lower","previousSibling","firstChild","creatorInherit","uri","documentElement","createElement","createElementNS","creatorFixed","namespace","constantNull","removeChild","selection_cloneShallow","clone","cloneNode","selection_cloneDeep","parseTypenames","typenames","map","t","type","onRemove","typename","on","__on","j","m","removeEventListener","listener","options","onAdd","event","contextListener","addEventListener","push","dispatchEvent","params","window","CustomEvent","createEvent","initEvent","bubbles","cancelable","detail","dispatchConstant","dispatchFunction","join","splice","contains","Selection","groups","parents","_groups","_parents","selection","select","subgroups","subnode","subgroup","selectAll","array","arrayAll","selectorAll","selectChild","match","childFind","selectChildren","childrenFilter","matcher","bind","enterGroup","updateGroup","exitGroup","previous","i0","i1","_enter","_exit","sparse","onenter","onupdate","onexit","append","merge","order","Error","groups0","groups1","m0","m1","Math","min","merges","group0","group1","compareDocumentPosition","sort","compare","compareNode","sortgroups","sortgroup","callback","nodes","size","each","attr","getAttributeNS","property","classed","text","html","create","creator","insert","before","deep","dispatch","iterator","responseBlob","response","ok","status","statusText","blob","input","init","fetch","then","responseArrayBuffer","arrayBuffer","EOL","EOF","objectConverter","columns","Function","JSON","stringify","inferColumns","rows","columnSet","forEach","row","column","pad","width","s","delimiter","reFormat","RegExp","DELIMITER","charCodeAt","parseRows","f","N","I","eof","eol","token","c","replace","preformatBody","formatValue","formatRow","Date","date","year","hours","getUTCHours","minutes","getUTCMinutes","seconds","getUTCSeconds","milliseconds","getUTCMilliseconds","isNaN","getUTCFullYear","getUTCMonth","getUTCDate","formatDate","test","parse","convert","object","customConverter","format","concat","formatBody","formatRows","csv","dsv","csvParse","tsv","tsvParse","responseText","dsvParse","undefined","Promise","resolve","reject","image","Image","onerror","onload","src","responseJson","json","parser","DOMParser","parseFromString","noop","_","Dispatch","types","T","copy","that","args","preventDefault","stopImmediatePropagation","view","noevent","__noselect","MozUserSelect","yesdrag","noclick","setTimeout","extend","Color","darker","brighter","reI","reN","reP","reHex","reRgbInteger","reRgbPercent","reRgbaInteger","reRgbaPercent","reHslPercent","reHslaPercent","named","aliceblue","antiquewhite","aqua","aquamarine","azure","beige","bisque","black","blanchedalmond","blue","blueviolet","brown","burlywood","cadetblue","chartreuse","chocolate","coral","cornflowerblue","cornsilk","crimson","cyan","darkblue","darkcyan","darkgoldenrod","darkgray","darkgreen","darkgrey","darkkhaki","darkmagenta","darkolivegreen","darkorange","darkorchid","darkred","darksalmon","darkseagreen","darkslateblue","darkslategray","darkslategrey","darkturquoise","darkviolet","deeppink","deepskyblue","dimgray","dimgrey","dodgerblue","firebrick","floralwhite","forestgreen","fuchsia","gainsboro","ghostwhite","gold","goldenrod","gray","green","greenyellow","grey","honeydew","hotpink","indianred","indigo","ivory","khaki","lavender","lavenderblush","lawngreen","lemonchiffon","lightblue","lightcoral","lightcyan","lightgoldenrodyellow","lightgray","lightgreen","lightgrey","lightpink","lightsalmon","lightseagreen","lightskyblue","lightslategray","lightslategrey","lightsteelblue","lightyellow","lime","limegreen","linen","magenta","maroon","mediumaquamarine","mediumblue","mediumorchid","mediumpurple","mediumseagreen","mediumslateblue","mediumspringgreen","mediumturquoise","mediumvioletred","midnightblue","mintcream","mistyrose","moccasin","navajowhite","navy","oldlace","olive","olivedrab","orange","orangered","orchid","palegoldenrod","palegreen","paleturquoise","palevioletred","papayawhip","peachpuff","peru","pink","plum","powderblue","purple","rebeccapurple","red","rosybrown","royalblue","saddlebrown","salmon","sandybrown","seagreen","seashell","sienna","silver","skyblue","slateblue","slategray","slategrey","snow","springgreen","steelblue","tan","teal","thistle","tomato","turquoise","violet","wheat","white","whitesmoke","yellow","yellowgreen","color_formatHex","rgb","formatHex","color_formatRgb","formatRgb","color","l","toLowerCase","exec","parseInt","rgbn","Rgb","rgba","hsla","r","g","rgbConvert","opacity","rgb_formatHex","hex","rgb_formatRgb","max","round","toString","h","Hsl","hslConvert","hsl2rgb","m2","basis","t1","v0","v1","v2","v3","t2","t3","channels","assign","displayable","formatHsl","k","pow","nogamma","d","linear","rgbGamma","y","exponential","gamma","start","end","rgbSpline","spline","colors","genericArray","nb","na","setTime","values","floor","reA","reB","source","am","bm","bs","bi","lastIndex","q","index","number","one","zero","ArrayBuffer","isView","DataView","isArray","valueOf","sourceEvent","currentTarget","ownerSVGElement","createSVGPoint","point","clientX","clientY","matrixTransform","getScreenCTM","inverse","getBoundingClientRect","rect","left","clientLeft","top","clientTop","pageX","pageY","taskHead","taskTail","timeout","interval","clockLast","clockNow","clockSkew","clock","performance","now","setFrame","requestAnimationFrame","clearNow","Timer","_call","_time","timer","delay","time","restart","wake","e","timerFlush","t0","Infinity","sleep","nap","poke","clearTimeout","clearInterval","setInterval","elapsed","stop","TypeError","emptyOn","emptyTween","id","timing","schedules","__transition","tween","state","tick","duration","ease","schedule","active","svgNode","degrees","PI","identity","translateX","translateY","rotate","skewX","scaleX","scaleY","sqrt","atan2","atan","interpolateTransform","pxComma","pxParen","degParen","pop","xa","ya","xb","yb","translate","scale","interpolateTransformCss","DOMMatrix","WebKitCSSMatrix","isIdentity","decompose","interpolateTransformSvg","transform","baseVal","consolidate","matrix","tweenRemove","tween0","tween1","tweenFunction","tweenValue","transition","_id","interpolate","value1","string00","interpolate0","string1","string0","string10","attrInterpolate","attrInterpolateNS","attrTweenNS","_value","attrTween","delayFunction","delayConstant","durationFunction","durationConstant","easeConstant","onFunction","on0","on1","sit","every","styleInterpolate","styleTween","textInterpolate","textTween","_name","newId","selection_prototype","inherit","id0","id1","styleNull","listener0","styleMaybeRemove","removeFunction","easeVarying","cancel","interrupt","defaultTiming","BrushEvent","target","mode","defineProperties","configurable","MODE_DRAG","MODE_SPACE","MODE_HANDLE","MODE_CENTER","abs","number1","number2","X","handles","output","xy","Y","XY","cursors","overlay","w","nw","ne","se","sw","flipX","flipY","signsX","signsY","defaultFilter","ctrlKey","button","defaultExtent","hasAttribute","viewBox","height","defaultTouchable","navigator","maxTouchPoints","__brush","extent","brushSelection","dim","brushX","brushY","touchending","touchable","keys","listeners","handleSize","brush","initialize","handle","redraw","started","touchmoved","touchended","emitter","clean","emit","Emitter","touches","w0","w1","n0","n1","e0","e1","s0","s1","moving","lockX","lockY","metaKey","altKey","signX","signY","W","E","S","dx","dy","shifting","shiftKey","points","identifier","pointer","point0","pts","move","beforestart","moved","ended","keydowned","keyupped","p","changedTouches","cur","keyCode","selection0","selection1","clear","starting","keyModifiers","formatDecimalParts","toExponential","coefficient","prefixExponent","re","formatSpecifier","specifier","FormatSpecifier","fill","align","sign","symbol","comma","precision","exponent","toFixed","toLocaleString","toPrecision","formatRounded","toUpperCase","formatPrefix","prefixes","locale","grouping","thousands","Number","substring","reverse","currencyPrefix","currency","currencySuffix","decimal","numerals","formatNumerals","String","percent","minus","nan","newFormat","formatTypes","suffix","formatType","maybeSuffix","valuePrefix","valueSuffix","valueNegative","out","formatTrim","padding","defaultLocale","step","e10","e5","e2","tickIncrement","count","power","log","LN10","error","delta","lo","hi","mid","ascendingComparator","center","right","ascendingBisect","bisector","bisectRight","unit","normalize","bimap","domain","range","d0","d1","r0","r1","polymap","bisect","clamp","unknown","continuous","untransform","piecewise","rescale","invert","rangeRound","u","transformer","initRange","linearish","ticks","isFinite","ceil","tickFormat","step0","step1","tickStep","precisionPrefix","precisionRound","precisionFixed","nice","prestep","maxIter","staticColors","organismMetadata","commonName","scientificName","assemblies","default","GRCh38","GRCh37","NCBI36","hasGeneCache","GRCm38","MGSCv37","TAIR10","R64","GCA_000002765","d3","d3fetch","d3brush","d3dispatch","d3format","assemblyIsAccession","config","assembly","getDir","dir","script","tmp","ideogramInLeaf","scripts","version","Ideogram","location","pathname","includes","fetchWithRetry","url","isRetry","getDataDir","coord","onDidRotate","chrModel","onDidRotateCallback","getSvg","fetchWithAuth","contentType","headers","Headers","accessToken","Authorization","getTaxid","organism","taxid","organisms","slug","getCommonName","getScientificName","isRoman","parseRoman","val","M","D","C","L","V","reduce","aa","getFont","ideo","family","fontFamily","annotLabelSize","getTextSize","font","context","canvas","getContext","metrics","measureText","actualBoundingBoxRight","actualBoundingBoxLeft","actualBoundingBoxAscent","actualBoundingBoxDescent","scaleLinear","valueof","configuredCss","configure","chromosomesArray","coordinateSystem","maxLength","bp","iscn","chromosomes","numChromosomes","debug","dataDir","container","resolution","orientation","showChromosomeLabels","showNonNuclearChromosomes","chromosomeScale","showTools","ploidy","sexChromosomes","sex","ancestors","P","ploidyDesc","configurePloidy","showBandLabels","showFullyBanded","bandsToShow","bandData","configureBands","chrHeight","configureHeight","chrWidth","configureWidth","geometry","chrMargin","configureMargin","onLoad","onLoadCallback","onLoadAnnots","onLoadAnnotsCallback","onDrawAnnots","onDrawAnnotsCallback","onBrushMove","onBrushMoveCallback","onBrushEnd","onBrushEndCallback","onCursorMove","onCursorMoveCallback","onWillShowAnnotTooltip","onWillShowAnnotTooltipCallback","onClickAnnot","onClickAnnotCallback","configureCallbacks","organismsWithBands","configureOrganisms","bump","adjustedBump","configureBump","chromosome","rotatable","configureSingleChromosome","chrLabelSize","chrLabelColor","configureTextStyle","initAnnotSettings","annotationsLayout","annotTracksHeight","chrSets","yOffsets","annotLabelHeight","demarcateCollinearChromosomes","prevChr","prevWidth","seenTaxids","getYOffsets","chrSet","chrLabelX","adjustedX","orgIndex","taxids","labelSpan","labelGenomes","rearrangeChromosomes","multiorganism","maxHeight","xOffsets","annotHeight","annotationHeight","numAnnotTracks","getXOffsets","adjustedY","chrLabelY","org","maxWidth","collinearizeVerticalChromosomes","processAnnots","rawAnnots","setOriginalTrackIndexes","annotationsDisplayedTracks","annots","updateDisplayedTracks","processAnnotData","filterable","initCrossFilter","drawProcessedAnnots","finishInit","t0A","getTime","confAnnots","annotations","initDrawChromosomes","annotationsPath","checkAnnotData","waitForAndProcessAnnots","chrID","t0C","t1C","hideUnshownBandLabels","console","rotateChromosomeLabels","drawChromosomeLabels","processLabels","createBrush","cursorPosition","createClickCursor","drawAnnots","afterRawAnnots","t1A","reportDebugTimings","setOverflowScroll","collinearizeChromosomes","Ploidy","_config","_description","_normalize","getChromosomesNumber","setIndex","chrSetCode","description","descValue","normalized","existence","_getexistenceArray","getSetSize","chrSetIndex","getAncestor","chrIndex","exists","armIndex","desc","ChromosomeUtil","getLabel","getSetLabel","_ideo","_ploidy","_translate","chrSetMargin","_tickSize","_isRotated","_getLeftMargin","margin","_getYScale","getChromosomeLabels","chrElement","util","labels","getChromosomeBandLabelTranslate","band","tickSize","px","didRotate","chrName","bands","oldWidth","chrSetElement","getChromosomeModel","drawChromosome","handleRotateOnClick","displayedTrackIndexes","drawBandLabels","otherChrs","ideoBounds","labelSelectors","chrHeightOriginal","chrWidthOriginal","annotationHeightOriginal","rotateBack","_layout","rotateForward","elementLength","windowLength","_class","innerWidth","innerHeight","getChromosomeLabelClass","_getAdditionalOffset","numTracks","annotationsNumTracks","_getChromosomeSetSize","getChromosomeSetLabelAnchor","getChromosomeLabelYPosition","getChromosomeSetLabelYPosition","Layout","super","getChromosomeScale","getChromosomeScaleBack","getChromosomeSetTranslate","getHeight","getWidth","getChromosomeBandTickY1","getChromosomeBandTickY2","getChromosomeSetLabelTranslate","getChromosomeBandLabelAnchor","ideoBox","chrBox","getChromosomeSetYTranslate","barWidth","legendPad","prevTranslate","getChromosomeSetLabelXPosition","getChromosomeLabelXPosition","xOffset","lastSetOffset","setSize","chromosomeSetYTranslate","chrs","numChrs","chrsPerRow","yOffset","additionalPadding","writeContainer","fetchAnnots","setPloidy","perspective","PairedLayout","SmallLayout","VerticalLayout","HorizontalLayout","getLayout","svgClass","getContainerSvgClass","getBandColorGradients","writeContainerDom","isOnlyIdeogram","writeTooltipContainer","lastBandDataUrl","getBandUrl","bandDataFileNames","isHeterogameticChromosome","prepareChromosomes","bandsArray","setCoordinateSystem","chrBands","chr","setSexChromosomes","_gotChrModels","element","rotateAndToggleDisplay","getBandFileName","accession","bandFileName","getBandFileNames","bandFileNames","isCustomOrganism","prepareContainer","bandDataUrl","hasNonGenBankAssembly","shouldFetchBands","numBandDataResponses","rawBands","fileNames","fetchedTaxid","fileName","setBandData","fetchBands","processBandData","ideoNext","ideoQueued","ideoWait","containerId","getOrganismFromEutils","getTaxids","initializeTaxids","organismScientificName","promises","all","taxidsAndBandsArrays","taxidAndBandsArray","getBandsAndPrepareContainer","BedParser","bed","parseBed","componentToHex","parseGenomicCoordinates","ucscStyle","parseAnnotFromTsvLine","tsvLine","annot","label","rgbToHex","parseRawAnnots","bedStartIndex","tsvLines","line","TsvParser","parseTsv","getValueColumnIndex","headerLine","header","fullName","significance","citations","tsvStartIndex","citeIndex","fromTo","annotsByChr","reservedTrackKeys","defaultHeatmapColors","getLabels","heatmaps","metadata","trackLabels","inflateThresholds","thresholds","heatmapThresholds","shouldUseThresholdColor","numThresholds","prevThreshold","threshold","getHeatmapAnnotColor","thresholdList","tvNum","thresholdColor","parseFloat","writeCanvases","chrLeft","trackLeft","trackWidth","contextArray","fillCanvasAnnots","demarcateChrs","trackIndex","fillStyle","startPx","fillRect","fillCanvasAnnotValues","ideoMarginTop","add2dAnnotsForChr","omittedAnnots","ra","stopPx","convertBpToPx","shift","startHideTrackLabelTimeout","showTrackLabel","hideTrackLabelTimeout","ideoHeight","drawHeatmaps","annotContainers","prevX","xBump","showChromosomesLabels","labelContainer","markBump","renderTrackLabels","writeTrackLabels","drawHeatmapsCollinear","writeCanvas","drawHeatmaps2d","writeTrackLabelContainer","trackCanvas","firstTrackId","trackBox","labelBox","getTrackLabelOffsets","getNewRawAnnots","heatmapKeyIndexes","newRa","newRas","deserializeAnnotsForHeatmap","rawAnnotsContainer","newRaContainers","heatmapKey","rawAnnotBoxes","raContainer","getNewRawAnnotContainers","reportPerformance","startHideAnnotTooltipTimeout","showAnnotTooltip","hideAnnotTooltipTimeout","content","tooltip","cx","cy","displayName","getContentAndYOffset","renderTooltip","getAnnotDomLabelId","domId","changeAnnotState","labelId","annotId","triggerAnnotEvent","annotElement","parentElement","prevTooltipOff","prevTooltipAnnotDomId","_ideoActiveTimeout","getAnnotByName","annotName","found","thisAnnot","getAnnotLabelLayout","annotDom","annotRect","ideoRect","bottom","addAnnotLabel","backgroundColor","borderColor","layout","didSetLabelStyle","insertAdjacentHTML","renderLabel","sortAnnotsByRank","ranks","geneCache","interestingNames","rank","applyRankCutoff","cutoff","fillAnnotLabels","sortedAnnots","clearAnnotLabels","spacedAnnots","spacedLayouts","flattenAnnots","some","sl","xOverlap","yOverlap","numLabels","relatedGenesMode","removeAnnotLabel","getHistogramBars","chrModels","bars","isFirstGet","histogramScaling","setIdeoHistogramScaling","maxAnnotsPerBar","lastBand","numBins","bar","convertPxToBp","annotationsColor","getRawBars","chrAnnots","barAnnots","barPx","nextBarPx","assignAnnotsToBars","maxAnnotsPerBarAllChrs","barCount","setIdeoMaxAnnotsPerBar","barCountRatio","ideoIsRotated","setProportionalBarHeight","reportGetHistogramBarPerformance","legendStyle","getIcon","icon","shape","getListItems","nameHeight","lineHeight","getLineHeight","writeLegend","legend","nameStyle","lineHeightCss","friendlyAnnots","rawAnnot","parseFriendlyAnnots","parseFriendlyKeys","chrAnnot","numAnnots","warn","warnIfTooManyAnnots","filledAnnots","getChrAnnotNodes","fillAnnots","shapes","triangle","circle","rectangle","getShapes","determineShape","writeTrackAnnots","x1","x2","writeOverlayAnnots","chrWidths","y1","y2","thisChrWidth","getHistogramPoints","writeHistogramAnnots","drawAnnotsByLayoutType","writeSyntenicRegion","syntenies","regionID","activeRegion","others","writeSyntenicRegionPolygons","syntenicRegion","r2","regions","writeSyntenicRegionPolygonsHorizontal","getRegionsR1AndR2","r1Offset","r2Offset","r1ChrDom","r1GenomeHorizontalXOffset","getCTM","r1GenomeVerticalXOffset","r2ChrDom","r2GenomeHorizontalXOffset","r2GenomeVerticalXOffset","writeSyntenicRegionLines","stroke","writeSyntenicRegionLabels","regionId","rangeIds","r1Width","drawSynteny","syntenicRegions","writeSyntenicRegions","drawSyntenyCollinear","drawSyntenyCollinearHorizontal","restoreDefaultTracks","trackIndexes","displayedRawAnnotsByChr","displayedAnnots","getDisplayedRawAnnotsByChr","setAnnotsByChr","setAnnots","trackIndexOriginal","numAvailTracks","getSetAnnotsByChr","colorMap","addAnnot","annotationTracks","annotTrack","addClientAnnot","addSparseServerAnnot","addBasicClientAnnot","getAnnotDomId","annotIndex","addAnnotsForChr","shouldAssignDomId","annotSortFunction","warnOfUndefinedChromosome","addAnnots","unorderedAnnots","orderAnnotContainers","numOmittedTracks","sendTrackAndAnnotWarnings","ExpressionMatrixParser","setRawAnnots","fetchCoordinates","coordinates","parseExpressionMatrix","ensemblData","gene","expressions","cells","downloadAnnotations","annotDescriptions","ensemblId","annotsTsv","annotsHref","encodeURIComponent","evt","MouseEvent","body","initAnnotHeight","localAnnotationsPath","initNumTracksAndBarWidth","initTooltip","onWillAddAnnotLabel","onWillAddAnnotLabelCallback","initAnnotLabel","sortChromosomes","displayedTracks","inflateHeatmaps","seen","duplicates","detectDuplicateChrsInRawAnnots","accumulator","annotsUrl","is2dHeatmap","extension","alert","validateAnnotsUrl","rawAnnotsResponse","chrArray","highlight","chrNames","highlightsHtml","chrId","chrDom","unhighlight","highlightsSelector","getTaxidFromEutils","orgName","taxonomySearch","esearch","esearchresult","idlist","esummary","result","commonname","setAssemblyAndChromosomes","originalChrs","filteredChrs","urlOrg","getAssemblyAndChromosomesFromEutils","chromosomesUrl","promise2","catch","errorMessage","splitBand","asmAndChrTaxidsArray","seenChrs","setTaxidData","asmChrTaxidsArray","isOrganismSupported","ideoOrg","getTaxidsForOrganismsInConfig","tmpChrs","chrsOrgSlugs","orgs","promise","getTaxidFromEutilsPromises","augmentedOrganismMetadata","orgNameAndTaxid","warning","customMetadata","populateNonNativeOrg","orgMetadata","orgFields","prepareTmpChrsAndTaxids","asmAccs","asmAndChrPromises","configOrganisms","sortedTaxids","sortTaxidsByOriginalOrganismOption","taxidInit","getIsMultiorganism","getTaxidsForOrganismsNotInConfig","parseChromosome","genome","cnIndex","subtype","subname","parseMitochondrion","parseChloroplastOrPlastid","parseApicoplast","substr","parseNuclear","getChrNameAndType","slen","assemblyAccession","asmSearchUrl","termStem","getAssemblySearchUrl","asmUid","asmSummaryUrl","fetchAssemblySummary","uids","qs","elink","webenv","linksets","getESearchUrlForChromosomes","esearchUrl","ids","ntSummary","fetchNucleotideSummary","results","seenChrId","parseChromosomes","rejectedReason","getPrevRight","prevLabelXRight","prevHiddenBoxIndex","textOffsets","updateShown","indexesToShow","overlapRight","prevRight","isBefore","hiddenIndex","doSkip","getIndexesToShow","offsets","textsLength","setBandsToShow","selectorsToShow","ithLength","drawBandLabelText","bandsToLabel","drawBandLabelStalk","getChrModels","getStainAndColors","gradients","stain","color1","color2","color3","getGradients","updateLines","lines","getStain","getLineObject","shouldSkipBand","chrsAreList","chrNotInList","thisChr","getBandsArray","bandsByChr","chrLength","setChromosomesByTaxid","chrBandsArray","updateChromosomes","getDelimiterTsvLinesAndInit","parseBands","setChrsByTaxidsWithBands","to","chrLengthBp","bpDomain","pxRange","nameSplit","fromToSplit","refineGenomicCoordinates","cm","getChrModel","getBasePairDomainAndPixelRange","xScale","selectedRegion","setBrush","setSelectedRegion","x0","writeBrush","position","cursorBrush","setCursorPosition","newPosition","offsetX","setCursor","drawSexChromosomes","sexChromosomeIndexes","sciLength","sci","homologIndex","appendHomolog","sexChrs","iscnStart","iscnLength","bpStart","bpStop","bpLength","pxStart","pxLength","getPx","throwBpToPxError","getBp","iscnStop","pxStop","throwPxToBpError","array8","arrayUntyped","array16","array32","arrayLengthen","arrayLengthenUntyped","arrayWiden","arrayWidenUntyped","bitarray","subarrays","masks","Uint8Array","Uint16Array","Uint32Array","lengthen","len","offset","dest","truncate","zeroExcept","zeroExceptMask","mask","only","onlyExcept","onlyOffset","onlyOne","heap_by","heap","sift","by","heapselect_by","queue","bisect_by","reg","path","REMOVED_INDEX","crossfilter","heapselect","permute","filters","removeData","dimension","groupAll","allFiltered","onChange","isElementFiltered","filterListeners","dataListeners","removeDataListeners","callbacks","newData","triggerOnChange","predicate","newIndex","removed","usePred","shouldRemove","index1","index2","index3","index4","maskForDimensions","dimensions","ignore_dimensions","iterable","accessorPath","newValues","iterablesIndexCount","iterablesIndexFilterStatus","refilterFunction","filterValue","filterValuePresent","filterAll","filterRange","filterFunction","filterExact","currentFilter","hasCurrentFilter","top_offset","hi0","toSkip","lo0","iterablesEmptyRows","bottom_offset","orderNatural","dispose","accessor","sortRange","cr_range","A","B","refilter","indexListeners","dimensionGroups","unshift","preAdd","postAdd","newIterablesIndexCount","newIterablesIndexFilterStatus","cr_index","unsortedIndex","sortMap","bounds","lo1","hi1","old_n0","oldValues","oldIndex","oldIterablesIndexFilterStatus","oldiiclength","index5","reIndex","oldDataIndex","filterIndexBounds","filterIndexFunction","added","valueIndexAdded","valueIndexRemoved","newAdded","newRemoved","indexLength","reduceCount","reduceSum","groupIndex","reduceAdd","reduceRemove","reduceInitial","n0old","groupWidth","groupCapacity","capacity","reset","resetNeeded","g0","oldGroups","initial","k0","groupIncrement","updateMany","resetMany","updateOne","resetOne","oldK","seenGroups","filterOne","filterOffset","notFilter","reduceValue","cb","eventName","unpackAnnots","unpackedAnnots","packAnnots","facet","annotsByFacet","facets","filterAnnots","filterSelections","filteredAnnots","selections","counts","fn","getFilteredResults","getChromosomePixels","hasBands","csLength","cs","pcenIndex","getPixelAndOtherData","getChrScale","getChrModelScaffold","fullChromosomeLabels","centromerePosition","firstBand","smallLength","getCentromerePosition","deleteExtraneousBands","deactivate","items","item","closeTools","display","handleToolClick","toolHeaders","toolHeader","trigger","getTrigger","tool","panel","getPanel","toElement","toId","panelElement","handleHideForHoverables","ideoSvg","canvasId","ideoSvgClone","getElementById","ctx","setTransform","imageSmoothingEnabled","XMLSerializer","serializeToString","domUrl","URL","webkitURL","img","svgBlob","Blob","createObjectURL","imgUrl","drawImage","revokeObjectURL","toDataURL","downloadPng","closeButton","initTools","elements","outsideClickListener","clickedOutsideCount","removeClickListener","hideOnClickOutside","handleGearClick","gear","showGearOnIdeogramHover","ModelAdapter","model","_model","ModelNoBandsAdapter","getModel","getCssClass","isMT","getArmColor","armColors","_getPolyploidArmColor","getBorderColor","chrBorderColor","getFillColor","chrFillColor","arm","centromere","ancestor","Range","_data","getColor","_getColor","Chromosome","adapter","_adapter","_color","_bumpCoefficient","TelocentricPChromosome","TelocentricQChromosome","MetacentricChromosome","_addPArmShape","clipPath","isPArmRendered","_getPArmShape","_addQArmShape","isQArmRendered","_getQArmShape","render","isFullyBanded","centromereFill","_renderArm","_renderRangeSet","fillColor","class","strokeWidth","rangeSet","rangesContainer","_getShapeData","firstQBand","rightTerminalPosition","x3","x2b","_renderBands","Boolean","_pArmOffset","_qArmOffset","homologOffset","defs","getInstance","numChrsInSet","chrSetSelector","ideoWidth","ideoInnerWrap","ideoMiddleWrap","ploidyPad","textElement","getChrSetLabelLines","fullLabels","renderChromosomeSetLabel","appendChromosomeSetLabels","appendChromosomeLabels","labelPosAttrs","scaleSvg","getLabelPositionAttrs","chrMargin2","updateChrIndex","rotateVerticalChromosomeLabels","tracksHeight","rotateHorizontalChromosomeLabels","u8","u16","u32","fleb","fdeb","clim","freb","eb","_a","fl","revfl","_b","fd","rev","hMap","cd","mb","co","le","rvb","sv","r_1","flt","fdt","bits","bits16","slc","BYTES_PER_ELEMENT","subarray","ec","err","ind","msg","nt","code","captureStackTrace","inflt","dat","buf","st","noBuf","noSt","cbuf","bl","nbuf","final","pos","bt","lm","dm","lbt","dbt","tbts","flrm","fdrm","hLit","hcLen","tl","ldt","clt","clb","clbmsk","clm","lt","dt","lms","dms","lpos","sym","dsym","et","gunzipSync","flg","zs","gzs","unzlibSync","decompressSync","inflateSync","td","TextDecoder","decode","stream","strFromU8","latin1","fromCharCode","dutf8","timeDiff","initAnalyzeRelatedGenes","rg","_didRelatedGenesFirstPlot","getRelatedGenesByType","relatedGenes","related","paralogous","interacting","searched","entries","entry","getRelatedGenesTooltipAnalytics","timeSincePrevTooltip","prevAnnotDomId","tooltipGene","tooltipRelatedType","countsByType","getCountsByType","numRelatedGenes","numParalogs","numInteractingGenes","searchedGene","perfTimes","getEnsemblId","ensemblPrefix","slimEnsemblId","padLength","padStart","async","initGeneCache","cacheDir","startTime","getEarlyTaxid","parseOrgMetadata","cache","caches","open","cacheUrl","splitDataDir","dataIndex","baseDir","getCacheUrl","fetchStartTime","cacheFetch","fetchEndTime","nameCaseMap","namesById","idsByName","lociByName","lociById","rawTsv","preAnnots","rawTsvSplit","rawStart","rawLength","locus","parseCacheLoop","annotsSortedByPosition","parseAnnots","parseCache","total","queueMicrotask","interactionArrowMap","getIxnTypeReference","ixnsByPwid","ixns","ixnType","getMatches","gpml","genes","matchedLabel","textLabel","graphId","groupRef","geneGraphIds","groupSelectors","ggr","geneGroups","groupId","geneGroupGraphIds","fetchMyGeneInfo","queryString","parseNameAndEnsemblIdFromMgiGene","genomic_pos","ensemblgene","throwGeneNotFound","geneSymbol","fetchGenes","queryStringBase","hits","isSymbol","locusMap","nameMap","nameLc","hit","fetchGenesFromCache","fromGeneCache","getGenomicPos","genomicPos","parseAnnotFromMgiGene","moveLegend","ideoInnerDom","setRelatedDecorPad","prepend","processInteractions","interactions","seenNameIds","orgNameSimple","uint8Array","interaction","species","fields","rawIxns","sortedRawIxns","rawIxn","nameId","isRelevant","isGeneSymbol","ixn","maybeGeneSymbol","isInteractionRelevant","pathwayId","fetchInteractions","symbols","descriptionObj","pathwayIds","pathwayNames","ixnsDescription","pathwaysBase","links","describeInteractions","mergeDescriptions","pathwayIdsByInteractingGene","descObj","gpmlsByInteractingGene","ixnGene","gpmlUrl","rawGpml","fetchGpmls","fetchInteractionAnnots","relatedAnnots","finishPlotRelatedGenes","processParalogs","homologs","fetchEnsembl","homologies","ensemblIds","homolog","fetchParalogPositionsFromMyGeneInfo","fetchParalogs","paralogs","sortAnnotsByRelatedStatus","aName","bName","aColor","bColor","sortGeneNames","mergedDesc","descriptions","otherDesc","mergeAnnots","unmergedAnnots","seenAnnots","mergedAnnots","mergedAnnot","annotsInList","includedAnnots","applyAnnotsIncludeList","onFindRelatedGenesCallback","showAnnotLabels","updated","sortedChrNames","relevanceSortedAnnotsNamesByChr","annotNames","setRelatedAnnotDomIds","otherType","numThisRelated","numOtherRelated","timestampFirstPlot","totalLastPlotDiff","totalFirstPlot","_relatedGenesFirstPlotType","analyzePlotTimes","adjustPlaceAndVisibility","ideoContainerDom","visibility","marginLeft","marginRight","overflowY","didAdjustIdeogramLegend","ideoDom","legendWidth","minWidth","plotRelatedGenes","plotGeneHints","href","annotSel","el","cursor","oldDesc","processSearchedGene","relatedLegend","timeTotal","timeTotalFirstPlot","timeTotalLastPlotDiff","timeParalogs","timeInteractingGenes","timeSearchedGene","firstPlotType","analytics","relatedGenesAnalytics","analyzeRelatedGenes","onPlotRelatedGenesCallback","decorateRelatedGene","summary","interactingGene","searchedGeneGraphIds","interactingGeneGraphIds","ie","matchingGraphIds","graphIds","graphicsXml","graphic","endGraphRefs","numMatchingPoints","isConnectedToSourceGene","searchedGeneIndex","nodeName","graphRef","arrowHead","isStart","parseInteractionGraphic","detailInteractions","detailAllInteractions","enrichedIxns","isSameByPwid","isSame","isDirectionSameByPwid","isDirectionSame","directionsByPwid","ixnTypeReference","pwid","isRefMatch","thisIsSame","thisIxnTypeReference","determineIxnsInPathwayAreSame","setIsSame","leftTypes","rightTypes","directedTypes","firstIxnType","directionReference","isPwDirectionSame","pwFirstIxnType","pwDirectionReference","direction","summarizeByDirection","summarizeInteractions","oldSummary","originalDisplay","addedTooltipClickHandler","annotByName","handleTooltipClick","legendHeaderStyle","citedLegend","kitConfig","eutils","_fetch","method","chrAName","chrBName","aIsCP","bIsCP","aIsMT","bIsMT","aIsAP","bIsAP","aIsNuclear","bIsNuclear","chrTypes","getChrSortNamesAndTypes","localeCompare","numeric","kitDefaults","clientFn","defaultFunction","newFunction","ideogram","onPlotRelatedGenes","onFindRelatedGenes","getTooltipAnalytics","_initRelatedGenes","annotsPath","_initGeneHints"],"sourceRoot":""}