From 4cf32aace29255d80a3e4e55c72f1b77b5a52069 Mon Sep 17 00:00:00 2001 From: Lucandia Date: Fri, 24 May 2024 15:32:23 +0200 Subject: [PATCH 1/9] updated utils and rnagraphs to support multstrand structures without removing the first three nucleotides of the second structure --- src/rnagraph.js | 31 ++++++++++++++++--------------- src/rnautils.js | 2 ++ 2 files changed, 18 insertions(+), 15 deletions(-) diff --git a/src/rnagraph.js b/src/rnagraph.js index ab3a4d7..a2fd615 100644 --- a/src/rnagraph.js +++ b/src/rnagraph.js @@ -85,26 +85,26 @@ export function RNAGraph(seq = '', dotbracket = '', structName = '', startNumber }; self.removeBreaks = function(targetString) { - // Remove all chain breaks (denoted with a '&', which indicate - // that the input represents more than one strand) + // Collect the indexes of the chain breaks in the targetString + // chain breaks are indicated by '&' var breaks = []; - var breakIndex = -1; - - while ((breakIndex = targetString.indexOf('&')) >= 0) { - breaks.push(breakIndex); - targetString = targetString.substring(0, breakIndex) + targetString.substring(breakIndex+1, targetString.length); - + for (var i = 0; i < targetString.length; i++) { + if (targetString[i] === '&') { + breaks.push(i); + } } return {targetString: targetString, breaks: breaks}; }; var ret = self.removeBreaks(self.dotbracket); - self.dotbracket = ret.targetString; + // commented out to avoid removing the break node, let's keep it in the dotbracket + // self.dotbracket = ret.targetString; self.dotBracketBreaks = ret.breaks; ret = self.removeBreaks(self.seq); - self.seq = ret.targetString; + // commented out to avoid removing the break node, let's keep it in the sequence + // self.seq = ret.targetString; self.seqBreaks = ret.breaks; self.rnaLength = self.dotbracket.length; @@ -135,7 +135,8 @@ export function RNAGraph(seq = '', dotbracket = '', structName = '', startNumber for (let i = 0; i < labelNodes.length; i++) { if (self.dotBracketBreaks.indexOf(i) >= 0) { labelNodes[i].nodeType = 'middle'; - labelNodes[i+1].nodeType = 'middle'; + // commented out to avoid removing the node after the break + // labelNodes[i+1].nodeType = 'middle'; } } @@ -444,8 +445,8 @@ export function RNAGraph(seq = '', dotbracket = '', structName = '', startNumber for (let i = 1; i <= pt[0]; i++) { var nodeName = self.seq[i-1]; - if (self.dotBracketBreaks.indexOf(i-1) >= 0 || - self.dotBracketBreaks.indexOf(i-2) >= 0) { + // remove only the breaks that are in the sequence + if (self.dotBracketBreaks.indexOf(i-1) >= 0) { nodeName = ''; } @@ -488,9 +489,9 @@ export function RNAGraph(seq = '', dotbracket = '', structName = '', startNumber if (i > 1) { // backbone links + // unlink only the break and the nucleotide before it if (self.dotBracketBreaks.indexOf(i-1) === -1 && - self.dotBracketBreaks.indexOf(i-2) == -1 && - self.dotBracketBreaks.indexOf(i-3) == -1) { + self.dotBracketBreaks.indexOf(i-2) == -1) { // there is no break in the strands here // we can add a backbone link self.links.push({'source': self.nodes[i-2], diff --git a/src/rnautils.js b/src/rnautils.js index 0c6c54c..444d8b2 100644 --- a/src/rnautils.js +++ b/src/rnautils.js @@ -149,6 +149,8 @@ export function RNAUtilities() { pt[ni] = j; pt[j] = ni; + } else if (a == '&'){ + // there is a sequence break here, ignore it } else { throw "Unknown symbol in dotbracket string"; } From 7ee9f21ac7566ca93cd5a41e55d5c9e35a10b80f Mon Sep 17 00:00:00 2001 From: Lucandia Date: Fri, 24 May 2024 17:52:56 +0200 Subject: [PATCH 2/9] updated dist --- dist/02188894d5236b1517df3210b79c2a7f.svg | 8 ++++++++ dist/fornac.css.map | 2 +- dist/fornac.js | 2 +- dist/fornac.js.LICENSE.txt | 8 ++++++++ dist/fornac.js.map | 2 +- 5 files changed, 19 insertions(+), 3 deletions(-) create mode 100644 dist/02188894d5236b1517df3210b79c2a7f.svg create mode 100644 dist/fornac.js.LICENSE.txt diff --git a/dist/02188894d5236b1517df3210b79c2a7f.svg b/dist/02188894d5236b1517df3210b79c2a7f.svg new file mode 100644 index 0000000..b516e2c --- /dev/null +++ b/dist/02188894d5236b1517df3210b79c2a7f.svg @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/dist/fornac.css.map b/dist/fornac.css.map index 9034438..b8e7878 100644 --- a/dist/fornac.css.map +++ b/dist/fornac.css.map @@ -1 +1 @@ -{"version":3,"sources":["webpack://[name]/./src/fornac.css","webpack://[name]/./src/d3-context-menu.css"],"names":[],"mappings":"AAAA;EACE,YAAY;EAEZ,iBAA6B;EAC7B,UAAU;EACV,WAAW;AACb;;AAEA;EACE,UAAU;EAGV,YAAY;EACZ,mBAAmB;AACrB;;AAEA;IACI,4BAA4B;AAChC;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;KACK,oBAAoB;CACxB;;AAED;IACI,mBAAmB;IACnB,eAAe;IACf,WAAW;IACX,eAAe;AACnB;;AAEA;IACI,UAAU;IACV,iBAAiB;IACjB,eAAe;AACnB;;AAEA;IACI,WAAW;AACf;;AAEA;IACI,iBAAiB;IACjB,uCAAuC;IACvC,gBAAgB;IAChB,uBAAuB;IACvB,mBAAmB;IACnB,0BAA0B;IAC1B,0BAA0B;IAC1B,oBAAoB;IACpB,2BAA2B;IAC3B,yBAAyB;IACzB,wBAAwB;IACxB,sBAAsB;IACtB,qBAAqB;IACrB,iBAAiB;AACrB;;AAEA;EACE,YAAY;EACZ,mBAAmB;EACnB,eAAe;AACjB;;AAEA;IACI,WAAW;AACf;;AAEA;EACE,WAAW;AACb;;AAEA;EACE,YAAY;AACd;;AAEA;EACE,qBAAqB;AACvB;;AAEA;EACE,aAAa;AACf;;AAEA;IACI,uCAAuC;IACvC,mBAAmB;IACnB,gBAAgB;IAChB,8BAA8B;IAC9B,mBAAmB;IACnB,2BAA2B;AAC/B;;AAEA;IACI,iBAAiB;IACjB,eAAe;IACf,iBAAiB;IACjB,UAAU;IACV,kBAAkB;IAClB,oBAAoB;AACxB;;AAEA;EACE,YAAY;EACZ,eAAe;EACf,oBAAoB;AACtB;;AAEA;EACE,gBAAgB;EAChB,YAAY;EACZ,2BAA2B;AAC7B;;AChIA;CACC,kBAAkB;CAClB,aAAa;CACb,yBAAyB;CACzB,kBAAkB;;CAElB,8BAA8B;CAC9B,eAAe;CACf,gBAAgB;CAChB,yBAAyB;;CAEzB,YAAY;AACb;;AAEA;CACC,qBAAqB;CACrB,eAAe;CACf,YAAY;CACZ,eAAe;AAChB;;AAEA;CACC,iBAAiB;;CAEjB,2BAA2B,EAAE,eAAe;CAC5C,yBAAyB,IAAI,wBAAwB;CACrD,wBAAwB,KAAK,cAAc;CAC3C,sBAAsB,OAAO,YAAY;CACzC,qBAAqB,QAAQ,2BAA2B;CACxD,iBAAiB;AAClB;;AAEA;CACC,yBAAyB;CACzB,cAAc;AACf;;AAEA;CACC,yBAAyB;CACzB,cAAc;AACf;;AAEA;;CAEC;;AAED;;CAEC,yBAAyB;CACzB,WAAW;CACX,iBAAiB;CACjB,kBAAkB;AACnB;;AAEA;;CAEC;;AAED;;CAEC,yBAAyB;CACzB,WAAW;CACX,mBAAmB;AACpB;;AAEA;;CAEC;;AAED;CACC,gBAAgB;AACjB;;AAEA;CACC,yBAAyB;AAC1B;;AAEA;CACC,SAAS;IACN,SAAS;IACT,wCAAwC;IACxC,iDAAiD;AACrD,C","file":"fornac.css","sourcesContent":["circle.node, polygon.node {\n stroke: #ccc;\n @value nodeStrokeWidth: 0.8;\n stroke-width: nodeStrokeWidth;\n opacity: 1;\n fill: white;\n}\n\npath.directionArrow {\n fill: #777;\n @value directionArrowSize: 6;\n @value directionArrowWidth: 0.7;\n stroke: none;\n stroke-width: 0.8px;\n}\n\ng.plot {\n /* outline: 1px solid red; */\n}\n\ncircle.node[base_type=\"a\"] {\n fill: #dbdb8d;\n}\n\ncircle.node[base_type=\"c\"] {\n fill: #98df8a;\n}\n\ncircle.node[base_type=\"g\"] {\n fill: #ff9896;\n}\n\ncircle.node[base_type=\"u\"], circle.node[base_type=\"t\"] {\n fill: #aec7e8;\n}\n\n.node > text {\n pointer-events: none;\n }\n\ncircle.node[node_type=\"label\"] {\n stroke: transparent;\n stroke-width: 0;\n fill: white;\n display: inline;\n}\n\ncircle.node[node_type=\"protein\"] {\n fill: gray;\n fill-opacity: 0.5;\n stroke-width: 4;\n}\n\n.selectedNode > circle.node {\n stroke: red;\n}\n\ntext.nodeLabel {\n font-weight: bold;\n font-family: Tahoma, Geneva, sans-serif;\n font-size: 0.4em;\n color: rgb(100,100,100);\n text-anchor: middle;\n alignment-baseline: middle;\n dominant-baseline: central;\n pointer-events: none;\n -webkit-touch-callout: none;\n -webkit-user-select: none;\n -khtml-user-select: none;\n -moz-user-select: none;\n -ms-user-select: none;\n user-select: none;\n}\n\nline.link {\n stroke: #999;\n stroke-opacity: 0.8;\n stroke-width: 2;\n}\n\nline.link[link_type=\"pseudoknot\"] {\n stroke: red;\n}\n\nline.link[link_type=\"basepair\"] {\n stroke: red;\n}\n\nline.link[link_type=\"intermolecule\"] {\n stroke: blue;\n}\n\nline.link[link_type=\"chain_chain\"] {\n stroke-dasharray: 3,3;\n}\n\nline.link[link_type=\"fake\"] {\n stroke: green;\n}\n\ntext.plotLabel {\n font-family: Tahoma, Geneva, sans-serif;\n font-weight: bolder;\n font-size: 1.2em;\n fill: rgba(200, 200, 200, 0.5);\n text-anchor: middle;\n alignment-baseline: central;\n}\n\n.transparent {\n fill: transparent;\n stroke-width: 0;\n stroke-opacity: 0;\n opacity: 0;\n visibility: hidden;\n pointer-events: none;\n}\n\n.dragLine {\n stroke: #999;\n stroke-width: 2;\n pointer-events: none;\n}\n\n.mouseEventHelper > :global(.extent) {\n fill-opacity: .1;\n stroke: #fff;\n shape-rendering: crispEdges;\n}\n",":global(.d3-context-menu) {\n\tposition: absolute;\n\tdisplay: none;\n\tbackground-color: #f2f2f2;\n\tborder-radius: 4px;\n\n\tfont-family: Arial, sans-serif;\n\tfont-size: 14px;\n\tmin-width: 150px;\n\tborder: 1px solid #d4d4d4;\n\n\tz-index:1200;\n}\n\n:global(.d3-context-menu ul) {\n\tlist-style-type: none;\n\tmargin: 4px 0px;\n\tpadding: 0px;\n\tcursor: default;\n}\n\n:global(.d3-context-menu ul li) {\n\tpadding: 4px 16px;\n\n\t-webkit-touch-callout: none; /* iOS Safari */\n\t-webkit-user-select: none; /* Chrome/Safari/Opera */\n\t-khtml-user-select: none; /* Konqueror */\n\t-moz-user-select: none; /* Firefox */\n\t-ms-user-select: none; /* Internet Explorer/Edge */\n\tuser-select: none;\n}\n\n:global(.d3-context-menu ul li:hover) {\n\tbackground-color: #4677f8;\n\tcolor: #fefefe;\n}\n\n:global(.d3-context-menu-selected) {\n\tbackground-color: #4677f8;\n\tcolor: #fefefe;\n}\n\n/*\n\tHeader\n*/\n\n:global(.d3-context-menu ul li.is-header,\n.d3-context-menu ul li.is-header:hover) {\n\tbackground-color: #f2f2f2;\n\tcolor: #444;\n\tfont-weight: bold;\n\tfont-style: italic;\n}\n\n/*\n\tDisabled\n*/\n\n:global(.d3-context-menu ul li.is-disabled,\n.d3-context-menu ul li.is-disabled:hover) {\n\tbackground-color: #f2f2f2;\n\tcolor: #888;\n\tcursor: not-allowed;\n}\n\n/*\n\tDivider\n*/\n\n:global(.d3-context-menu ul li.is-divider) {\n\tpadding: 0px 0px;\n}\n\n:global(.d3-context-menu ul li.is-divider:hover) {\n\tbackground-color: #f2f2f2;\n}\n\n:global(.d3-context-menu ul hr) {\n\tborder: 0;\n height: 0;\n border-top: 1px solid rgba(0, 0, 0, 0.1);\n border-bottom: 1px solid rgba(255, 255, 255, 0.3);\n}"],"sourceRoot":""} \ No newline at end of file +{"version":3,"sources":["webpack://fornac/./src/fornac.css","webpack://fornac/./src/d3-context-menu.css"],"names":[],"mappings":"AAAA;EACE,YAAY;EAEZ,iBAA6B;EAC7B,UAAU;EACV,WAAW;AACb;;AAEA;EACE,UAAU;EAGV,YAAY;EACZ,mBAAmB;AACrB;;AAEA;IACI,4BAA4B;AAChC;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;KACK,oBAAoB;CACxB;;AAED;IACI,mBAAmB;IACnB,eAAe;IACf,WAAW;IACX,eAAe;AACnB;;AAEA;IACI,UAAU;IACV,iBAAiB;IACjB,eAAe;AACnB;;AAEA;IACI,WAAW;AACf;;AAEA;IACI,iBAAiB;IACjB,uCAAuC;IACvC,gBAAgB;IAChB,uBAAuB;IACvB,mBAAmB;IACnB,0BAA0B;IAC1B,0BAA0B;IAC1B,oBAAoB;IACpB,2BAA2B;IAC3B,yBAAyB;IACzB,wBAAwB;IACxB,sBAAsB;IACtB,qBAAqB;IACrB,iBAAiB;AACrB;;AAEA;EACE,YAAY;EACZ,mBAAmB;EACnB,eAAe;AACjB;;AAEA;IACI,WAAW;AACf;;AAEA;EACE,WAAW;AACb;;AAEA;EACE,YAAY;AACd;;AAEA;EACE,qBAAqB;AACvB;;AAEA;EACE,aAAa;AACf;;AAEA;IACI,uCAAuC;IACvC,mBAAmB;IACnB,gBAAgB;IAChB,8BAA8B;IAC9B,mBAAmB;IACnB,2BAA2B;AAC/B;;AAEA;IACI,iBAAiB;IACjB,eAAe;IACf,iBAAiB;IACjB,UAAU;IACV,kBAAkB;IAClB,oBAAoB;AACxB;;AAEA;EACE,YAAY;EACZ,eAAe;EACf,oBAAoB;AACtB;;AAEA;EACE,gBAAgB;EAChB,YAAY;EACZ,2BAA2B;AAC7B;;AChIA;CACC,kBAAkB;CAClB,aAAa;CACb,yBAAyB;CACzB,kBAAkB;;CAElB,8BAA8B;CAC9B,eAAe;CACf,gBAAgB;CAChB,yBAAyB;;CAEzB,YAAY;AACb;;AAEA;CACC,qBAAqB;CACrB,eAAe;CACf,YAAY;CACZ,eAAe;AAChB;;AAEA;CACC,iBAAiB;;CAEjB,2BAA2B,EAAE,eAAe;CAC5C,yBAAyB,IAAI,wBAAwB;CACrD,wBAAwB,KAAK,cAAc;CAC3C,sBAAsB,OAAO,YAAY;CACzC,qBAAqB,QAAQ,2BAA2B;CACxD,iBAAiB;AAClB;;AAEA;CACC,yBAAyB;CACzB,cAAc;AACf;;AAEA;CACC,yBAAyB;CACzB,cAAc;AACf;;AAEA;;CAEC;;AAED;;CAEC,yBAAyB;CACzB,WAAW;CACX,iBAAiB;CACjB,kBAAkB;AACnB;;AAEA;;CAEC;;AAED;;CAEC,yBAAyB;CACzB,WAAW;CACX,mBAAmB;AACpB;;AAEA;;CAEC;;AAED;CACC,gBAAgB;AACjB;;AAEA;CACC,yBAAyB;AAC1B;;AAEA;CACC,SAAS;IACN,SAAS;IACT,wCAAwC;IACxC,iDAAiD;AACrD,C","file":"fornac.css","sourcesContent":["circle.node, polygon.node {\n stroke: #ccc;\n @value nodeStrokeWidth: 0.8;\n stroke-width: nodeStrokeWidth;\n opacity: 1;\n fill: white;\n}\n\npath.directionArrow {\n fill: #777;\n @value directionArrowSize: 6;\n @value directionArrowWidth: 0.7;\n stroke: none;\n stroke-width: 0.8px;\n}\n\ng.plot {\n /* outline: 1px solid red; */\n}\n\ncircle.node[base_type=\"a\"] {\n fill: #dbdb8d;\n}\n\ncircle.node[base_type=\"c\"] {\n fill: #98df8a;\n}\n\ncircle.node[base_type=\"g\"] {\n fill: #ff9896;\n}\n\ncircle.node[base_type=\"u\"], circle.node[base_type=\"t\"] {\n fill: #aec7e8;\n}\n\n.node > text {\n pointer-events: none;\n }\n\ncircle.node[node_type=\"label\"] {\n stroke: transparent;\n stroke-width: 0;\n fill: white;\n display: inline;\n}\n\ncircle.node[node_type=\"protein\"] {\n fill: gray;\n fill-opacity: 0.5;\n stroke-width: 4;\n}\n\n.selectedNode > circle.node {\n stroke: red;\n}\n\ntext.nodeLabel {\n font-weight: bold;\n font-family: Tahoma, Geneva, sans-serif;\n font-size: 0.4em;\n color: rgb(100,100,100);\n text-anchor: middle;\n alignment-baseline: middle;\n dominant-baseline: central;\n pointer-events: none;\n -webkit-touch-callout: none;\n -webkit-user-select: none;\n -khtml-user-select: none;\n -moz-user-select: none;\n -ms-user-select: none;\n user-select: none;\n}\n\nline.link {\n stroke: #999;\n stroke-opacity: 0.8;\n stroke-width: 2;\n}\n\nline.link[link_type=\"pseudoknot\"] {\n stroke: red;\n}\n\nline.link[link_type=\"basepair\"] {\n stroke: red;\n}\n\nline.link[link_type=\"intermolecule\"] {\n stroke: blue;\n}\n\nline.link[link_type=\"chain_chain\"] {\n stroke-dasharray: 3,3;\n}\n\nline.link[link_type=\"fake\"] {\n stroke: green;\n}\n\ntext.plotLabel {\n font-family: Tahoma, Geneva, sans-serif;\n font-weight: bolder;\n font-size: 1.2em;\n fill: rgba(200, 200, 200, 0.5);\n text-anchor: middle;\n alignment-baseline: central;\n}\n\n.transparent {\n fill: transparent;\n stroke-width: 0;\n stroke-opacity: 0;\n opacity: 0;\n visibility: hidden;\n pointer-events: none;\n}\n\n.dragLine {\n stroke: #999;\n stroke-width: 2;\n pointer-events: none;\n}\n\n.mouseEventHelper > :global(.extent) {\n fill-opacity: .1;\n stroke: #fff;\n shape-rendering: crispEdges;\n}\n",":global(.d3-context-menu) {\n\tposition: absolute;\n\tdisplay: none;\n\tbackground-color: #f2f2f2;\n\tborder-radius: 4px;\n\n\tfont-family: Arial, sans-serif;\n\tfont-size: 14px;\n\tmin-width: 150px;\n\tborder: 1px solid #d4d4d4;\n\n\tz-index:1200;\n}\n\n:global(.d3-context-menu ul) {\n\tlist-style-type: none;\n\tmargin: 4px 0px;\n\tpadding: 0px;\n\tcursor: default;\n}\n\n:global(.d3-context-menu ul li) {\n\tpadding: 4px 16px;\n\n\t-webkit-touch-callout: none; /* iOS Safari */\n\t-webkit-user-select: none; /* Chrome/Safari/Opera */\n\t-khtml-user-select: none; /* Konqueror */\n\t-moz-user-select: none; /* Firefox */\n\t-ms-user-select: none; /* Internet Explorer/Edge */\n\tuser-select: none;\n}\n\n:global(.d3-context-menu ul li:hover) {\n\tbackground-color: #4677f8;\n\tcolor: #fefefe;\n}\n\n:global(.d3-context-menu-selected) {\n\tbackground-color: #4677f8;\n\tcolor: #fefefe;\n}\n\n/*\n\tHeader\n*/\n\n:global(.d3-context-menu ul li.is-header,\n.d3-context-menu ul li.is-header:hover) {\n\tbackground-color: #f2f2f2;\n\tcolor: #444;\n\tfont-weight: bold;\n\tfont-style: italic;\n}\n\n/*\n\tDisabled\n*/\n\n:global(.d3-context-menu ul li.is-disabled,\n.d3-context-menu ul li.is-disabled:hover) {\n\tbackground-color: #f2f2f2;\n\tcolor: #888;\n\tcursor: not-allowed;\n}\n\n/*\n\tDivider\n*/\n\n:global(.d3-context-menu ul li.is-divider) {\n\tpadding: 0px 0px;\n}\n\n:global(.d3-context-menu ul li.is-divider:hover) {\n\tbackground-color: #f2f2f2;\n}\n\n:global(.d3-context-menu ul hr) {\n\tborder: 0;\n height: 0;\n border-top: 1px solid rgba(0, 0, 0, 0.1);\n border-bottom: 1px solid rgba(255, 255, 255, 0.3);\n}"],"sourceRoot":""} \ No newline at end of file diff --git a/dist/fornac.js b/dist/fornac.js index 59bc866..dd8e1e0 100644 --- a/dist/fornac.js +++ b/dist/fornac.js @@ -1,3 +1,3 @@ /*! For license information please see fornac.js.LICENSE.txt */ -!function(t,e){"object"==typeof exports&&"object"==typeof module?module.exports=e(require("d3")):"function"==typeof define&&define.amd?define(["d3"],e):"object"==typeof exports?exports.fornac=e(require("d3")):t.fornac=e(t.d3)}(self,(function(t){return(()=>{var e={953:(t,e,n)=>{"use strict";n.r(e),n.d(e,{Connection:()=>i});var r=n(724),o=n(75);function i(){this.loop=new r.r,this.region=new o.y,this.start=null,this.end=null,this.xrad=null,this.yrad=null,this.angle=null,this.extruded=null,this.broken=null,this._isNull=!1}i.prototype.isNull=function(){return this._isNull},i.prototype.setNull=function(t){this._isNull=t},i.prototype.getLoop=function(){return this.loop},i.prototype.setLoop=function(t){this.loop=t},i.prototype.getRegion=function(){return this.region},i.prototype.setRegion=function(t){this.region=t},i.prototype.getStart=function(){return this.start},i.prototype.setStart=function(t){this.start=t},i.prototype.getEnd=function(){return this.end},i.prototype.setEnd=function(t){this.end=t},i.prototype.getXrad=function(){return this.xrad},i.prototype.setXrad=function(t){this.xrad=t},i.prototype.getYrad=function(){return this.yrad},i.prototype.setYrad=function(t){this.yrad=t},i.prototype.getAngle=function(){return this.angle},i.prototype.setAngle=function(t){this.angle=t},i.prototype.isExtruded=function(){return this.extruded},i.prototype.setExtruded=function(t){this.extruded=t},i.prototype.isBroken=function(){return this.broken},i.prototype.setBroken=function(t){this.broken=t}},724:(t,e,n)=>{"use strict";n.d(e,{r:()=>o});var r=n(953);function o(){this.nconnection=null,this.connections=[],this._connections=[],this.number=null,this.depth=null,this.mark=null,this.x=null,this.y=null,this.radius=null}o.prototype.getNconnection=function(){return this.nconnection},o.prototype.setNconnection=function(t){this.nconnection=t},o.prototype.setConnection=function(t,e){null!=e?this._connections[t]=e:(this._connections[t]||(this._connections[t]=new r.Connection),this._connections[t].setNull(!0))},o.prototype.getConnection=function(t){var e=n(953);this._connections[t]||(this._connections[t]=new e);var r=this._connections[t];return r.isNull()?null:r},o.prototype.addConnection=function(t,e){this._connections.push(e)},o.prototype.getNumber=function(){return this.number},o.prototype.setNumber=function(t){this.number=t},o.prototype.getDepth=function(){return this.depth},o.prototype.setDepth=function(t){this.depth=t},o.prototype.isMark=function(){return this.mark},o.prototype.setMark=function(t){this.mark=t},o.prototype.getX=function(){return this.x},o.prototype.setX=function(t){this.x=t},o.prototype.getY=function(){return this.y},o.prototype.setY=function(t){this.y=t},o.prototype.getRadius=function(){return this.radius},o.prototype.setRadius=function(t){this.radius=t}},75:(t,e,n)=>{"use strict";function r(){this._start1=null,this._end1=null,this._start2=null,this._end2=null}n.d(e,{y:()=>r}),r.prototype.getStart1=function(){return this._start1},r.prototype.setStart1=function(t){this._start1=t},r.prototype.getEnd1=function(){return this._end1},r.prototype.setEnd1=function(t){this._end1=t},r.prototype.getStart2=function(){return this._start2},r.prototype.setStart2=function(t){this._start2=t},r.prototype.getEnd2=function(){return this._end2},r.prototype.setEnd2=function(t){this._end2=t}},742:(t,e)=>{"use strict";e.byteLength=function(t){var e=u(t),n=e[0],r=e[1];return 3*(n+r)/4-r},e.toByteArray=function(t){var e,n,i=u(t),s=i[0],a=i[1],l=new o(function(t,e,n){return 3*(e+n)/4-n}(0,s,a)),c=0,f=a>0?s-4:s;for(n=0;n>16&255,l[c++]=e>>8&255,l[c++]=255&e;return 2===a&&(e=r[t.charCodeAt(n)]<<2|r[t.charCodeAt(n+1)]>>4,l[c++]=255&e),1===a&&(e=r[t.charCodeAt(n)]<<10|r[t.charCodeAt(n+1)]<<4|r[t.charCodeAt(n+2)]>>2,l[c++]=e>>8&255,l[c++]=255&e),l},e.fromByteArray=function(t){for(var e,r=t.length,o=r%3,i=[],s=16383,a=0,u=r-o;au?u:a+s));return 1===o?(e=t[r-1],i.push(n[e>>2]+n[e<<4&63]+"==")):2===o&&(e=(t[r-2]<<8)+t[r-1],i.push(n[e>>10]+n[e>>4&63]+n[e<<2&63]+"=")),i.join("")};for(var n=[],r=[],o="undefined"!=typeof Uint8Array?Uint8Array:Array,i="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/",s=0,a=i.length;s0)throw new Error("Invalid string. Length must be a multiple of 4");var n=t.indexOf("=");return-1===n&&(n=e),[n,n===e?0:4-n%4]}function l(t,e,r){for(var o,i,s=[],a=e;a>18&63]+n[i>>12&63]+n[i>>6&63]+n[63&i]);return s.join("")}r["-".charCodeAt(0)]=62,r["_".charCodeAt(0)]=63},764:(t,e,n)=>{"use strict";const r=n(742),o=n(645),i="function"==typeof Symbol&&"function"==typeof Symbol.for?Symbol.for("nodejs.util.inspect.custom"):null;e.Buffer=u,e.SlowBuffer=function(t){return+t!=t&&(t=0),u.alloc(+t)},e.INSPECT_MAX_BYTES=50;const s=2147483647;function a(t){if(t>s)throw new RangeError('The value "'+t+'" is invalid for option "size"');const e=new Uint8Array(t);return Object.setPrototypeOf(e,u.prototype),e}function u(t,e,n){if("number"==typeof t){if("string"==typeof e)throw new TypeError('The "string" argument must be of type string. Received type number');return f(t)}return l(t,e,n)}function l(t,e,n){if("string"==typeof t)return function(t,e){if("string"==typeof e&&""!==e||(e="utf8"),!u.isEncoding(e))throw new TypeError("Unknown encoding: "+e);const n=0|g(t,e);let r=a(n);const o=r.write(t,e);return o!==n&&(r=r.slice(0,o)),r}(t,e);if(ArrayBuffer.isView(t))return function(t){if(J(t,Uint8Array)){const e=new Uint8Array(t);return h(e.buffer,e.byteOffset,e.byteLength)}return d(t)}(t);if(null==t)throw new TypeError("The first argument must be one of type string, Buffer, ArrayBuffer, Array, or Array-like Object. Received type "+typeof t);if(J(t,ArrayBuffer)||t&&J(t.buffer,ArrayBuffer))return h(t,e,n);if("undefined"!=typeof SharedArrayBuffer&&(J(t,SharedArrayBuffer)||t&&J(t.buffer,SharedArrayBuffer)))return h(t,e,n);if("number"==typeof t)throw new TypeError('The "value" argument must not be of type number. Received type number');const r=t.valueOf&&t.valueOf();if(null!=r&&r!==t)return u.from(r,e,n);const o=function(t){if(u.isBuffer(t)){const e=0|p(t.length),n=a(e);return 0===n.length||t.copy(n,0,0,e),n}return void 0!==t.length?"number"!=typeof t.length||H(t.length)?a(0):d(t):"Buffer"===t.type&&Array.isArray(t.data)?d(t.data):void 0}(t);if(o)return o;if("undefined"!=typeof Symbol&&null!=Symbol.toPrimitive&&"function"==typeof t[Symbol.toPrimitive])return u.from(t[Symbol.toPrimitive]("string"),e,n);throw new TypeError("The first argument must be one of type string, Buffer, ArrayBuffer, Array, or Array-like Object. Received type "+typeof t)}function c(t){if("number"!=typeof t)throw new TypeError('"size" argument must be of type number');if(t<0)throw new RangeError('The value "'+t+'" is invalid for option "size"')}function f(t){return c(t),a(t<0?0:0|p(t))}function d(t){const e=t.length<0?0:0|p(t.length),n=a(e);for(let r=0;r=s)throw new RangeError("Attempt to allocate Buffer larger than maximum size: 0x"+s.toString(16)+" bytes");return 0|t}function g(t,e){if(u.isBuffer(t))return t.length;if(ArrayBuffer.isView(t)||J(t,ArrayBuffer))return t.byteLength;if("string"!=typeof t)throw new TypeError('The "string" argument must be one of type string, Buffer, or ArrayBuffer. Received type '+typeof t);const n=t.length,r=arguments.length>2&&!0===arguments[2];if(!r&&0===n)return 0;let o=!1;for(;;)switch(e){case"ascii":case"latin1":case"binary":return n;case"utf8":case"utf-8":return $(t).length;case"ucs2":case"ucs-2":case"utf16le":case"utf-16le":return 2*n;case"hex":return n>>>1;case"base64":return W(t).length;default:if(o)return r?-1:$(t).length;e=(""+e).toLowerCase(),o=!0}}function y(t,e,n){let r=!1;if((void 0===e||e<0)&&(e=0),e>this.length)return"";if((void 0===n||n>this.length)&&(n=this.length),n<=0)return"";if((n>>>=0)<=(e>>>=0))return"";for(t||(t="utf8");;)switch(t){case"hex":return S(this,e,n);case"utf8":case"utf-8":return L(this,e,n);case"ascii":return _(this,e,n);case"latin1":case"binary":return M(this,e,n);case"base64":return N(this,e,n);case"ucs2":case"ucs-2":case"utf16le":case"utf-16le":return B(this,e,n);default:if(r)throw new TypeError("Unknown encoding: "+t);t=(t+"").toLowerCase(),r=!0}}function m(t,e,n){const r=t[e];t[e]=t[n],t[n]=r}function b(t,e,n,r,o){if(0===t.length)return-1;if("string"==typeof n?(r=n,n=0):n>2147483647?n=2147483647:n<-2147483648&&(n=-2147483648),H(n=+n)&&(n=o?0:t.length-1),n<0&&(n=t.length+n),n>=t.length){if(o)return-1;n=t.length-1}else if(n<0){if(!o)return-1;n=0}if("string"==typeof e&&(e=u.from(e,r)),u.isBuffer(e))return 0===e.length?-1:v(t,e,n,r,o);if("number"==typeof e)return e&=255,"function"==typeof Uint8Array.prototype.indexOf?o?Uint8Array.prototype.indexOf.call(t,e,n):Uint8Array.prototype.lastIndexOf.call(t,e,n):v(t,[e],n,r,o);throw new TypeError("val must be string, number or Buffer")}function v(t,e,n,r,o){let i,s=1,a=t.length,u=e.length;if(void 0!==r&&("ucs2"===(r=String(r).toLowerCase())||"ucs-2"===r||"utf16le"===r||"utf-16le"===r)){if(t.length<2||e.length<2)return-1;s=2,a/=2,u/=2,n/=2}function l(t,e){return 1===s?t[e]:t.readUInt16BE(e*s)}if(o){let r=-1;for(i=n;ia&&(n=a-u),i=n;i>=0;i--){let n=!0;for(let r=0;ro&&(r=o):r=o;const i=e.length;let s;for(r>i/2&&(r=i/2),s=0;s>8,o=n%256,i.push(o),i.push(r);return i}(e,t.length-n),t,n,r)}function N(t,e,n){return 0===e&&n===t.length?r.fromByteArray(t):r.fromByteArray(t.slice(e,n))}function L(t,e,n){n=Math.min(t.length,n);const r=[];let o=e;for(;o239?4:e>223?3:e>191?2:1;if(o+s<=n){let n,r,a,u;switch(s){case 1:e<128&&(i=e);break;case 2:n=t[o+1],128==(192&n)&&(u=(31&e)<<6|63&n,u>127&&(i=u));break;case 3:n=t[o+1],r=t[o+2],128==(192&n)&&128==(192&r)&&(u=(15&e)<<12|(63&n)<<6|63&r,u>2047&&(u<55296||u>57343)&&(i=u));break;case 4:n=t[o+1],r=t[o+2],a=t[o+3],128==(192&n)&&128==(192&r)&&128==(192&a)&&(u=(15&e)<<18|(63&n)<<12|(63&r)<<6|63&a,u>65535&&u<1114112&&(i=u))}}null===i?(i=65533,s=1):i>65535&&(i-=65536,r.push(i>>>10&1023|55296),i=56320|1023&i),r.push(i),o+=s}return function(t){const e=t.length;if(e<=T)return String.fromCharCode.apply(String,t);let n="",r=0;for(;rr.length?(u.isBuffer(e)||(e=u.from(e)),e.copy(r,o)):Uint8Array.prototype.set.call(r,e,o);else{if(!u.isBuffer(e))throw new TypeError('"list" argument must be an Array of Buffers');e.copy(r,o)}o+=e.length}return r},u.byteLength=g,u.prototype._isBuffer=!0,u.prototype.swap16=function(){const t=this.length;if(t%2!=0)throw new RangeError("Buffer size must be a multiple of 16-bits");for(let e=0;en&&(t+=" ... "),""},i&&(u.prototype[i]=u.prototype.inspect),u.prototype.compare=function(t,e,n,r,o){if(J(t,Uint8Array)&&(t=u.from(t,t.offset,t.byteLength)),!u.isBuffer(t))throw new TypeError('The "target" argument must be one of type Buffer or Uint8Array. Received type '+typeof t);if(void 0===e&&(e=0),void 0===n&&(n=t?t.length:0),void 0===r&&(r=0),void 0===o&&(o=this.length),e<0||n>t.length||r<0||o>this.length)throw new RangeError("out of range index");if(r>=o&&e>=n)return 0;if(r>=o)return-1;if(e>=n)return 1;if(this===t)return 0;let i=(o>>>=0)-(r>>>=0),s=(n>>>=0)-(e>>>=0);const a=Math.min(i,s),l=this.slice(r,o),c=t.slice(e,n);for(let t=0;t>>=0,isFinite(n)?(n>>>=0,void 0===r&&(r="utf8")):(r=n,n=void 0)}const o=this.length-e;if((void 0===n||n>o)&&(n=o),t.length>0&&(n<0||e<0)||e>this.length)throw new RangeError("Attempt to write outside buffer bounds");r||(r="utf8");let i=!1;for(;;)switch(r){case"hex":return k(this,t,e,n);case"utf8":case"utf-8":return x(this,t,e,n);case"ascii":case"latin1":case"binary":return w(this,t,e,n);case"base64":return E(this,t,e,n);case"ucs2":case"ucs-2":case"utf16le":case"utf-16le":return A(this,t,e,n);default:if(i)throw new TypeError("Unknown encoding: "+r);r=(""+r).toLowerCase(),i=!0}},u.prototype.toJSON=function(){return{type:"Buffer",data:Array.prototype.slice.call(this._arr||this,0)}};const T=4096;function _(t,e,n){let r="";n=Math.min(t.length,n);for(let o=e;or)&&(n=r);let o="";for(let r=e;rn)throw new RangeError("Trying to access beyond buffer length")}function P(t,e,n,r,o,i){if(!u.isBuffer(t))throw new TypeError('"buffer" argument must be a Buffer instance');if(e>o||et.length)throw new RangeError("Index out of range")}function R(t,e,n,r,o){F(e,r,o,t,n,7);let i=Number(e&BigInt(4294967295));t[n++]=i,i>>=8,t[n++]=i,i>>=8,t[n++]=i,i>>=8,t[n++]=i;let s=Number(e>>BigInt(32)&BigInt(4294967295));return t[n++]=s,s>>=8,t[n++]=s,s>>=8,t[n++]=s,s>>=8,t[n++]=s,n}function C(t,e,n,r,o){F(e,r,o,t,n,7);let i=Number(e&BigInt(4294967295));t[n+7]=i,i>>=8,t[n+6]=i,i>>=8,t[n+5]=i,i>>=8,t[n+4]=i;let s=Number(e>>BigInt(32)&BigInt(4294967295));return t[n+3]=s,s>>=8,t[n+2]=s,s>>=8,t[n+1]=s,s>>=8,t[n]=s,n+8}function U(t,e,n,r,o,i){if(n+r>t.length)throw new RangeError("Index out of range");if(n<0)throw new RangeError("Index out of range")}function O(t,e,n,r,i){return e=+e,n>>>=0,i||U(t,0,n,4),o.write(t,e,n,r,23,4),n+4}function X(t,e,n,r,i){return e=+e,n>>>=0,i||U(t,0,n,8),o.write(t,e,n,r,52,8),n+8}u.prototype.slice=function(t,e){const n=this.length;(t=~~t)<0?(t+=n)<0&&(t=0):t>n&&(t=n),(e=void 0===e?n:~~e)<0?(e+=n)<0&&(e=0):e>n&&(e=n),e>>=0,e>>>=0,n||I(t,e,this.length);let r=this[t],o=1,i=0;for(;++i>>=0,e>>>=0,n||I(t,e,this.length);let r=this[t+--e],o=1;for(;e>0&&(o*=256);)r+=this[t+--e]*o;return r},u.prototype.readUint8=u.prototype.readUInt8=function(t,e){return t>>>=0,e||I(t,1,this.length),this[t]},u.prototype.readUint16LE=u.prototype.readUInt16LE=function(t,e){return t>>>=0,e||I(t,2,this.length),this[t]|this[t+1]<<8},u.prototype.readUint16BE=u.prototype.readUInt16BE=function(t,e){return t>>>=0,e||I(t,2,this.length),this[t]<<8|this[t+1]},u.prototype.readUint32LE=u.prototype.readUInt32LE=function(t,e){return t>>>=0,e||I(t,4,this.length),(this[t]|this[t+1]<<8|this[t+2]<<16)+16777216*this[t+3]},u.prototype.readUint32BE=u.prototype.readUInt32BE=function(t,e){return t>>>=0,e||I(t,4,this.length),16777216*this[t]+(this[t+1]<<16|this[t+2]<<8|this[t+3])},u.prototype.readBigUInt64LE=Z((function(t){z(t>>>=0,"offset");const e=this[t],n=this[t+7];void 0!==e&&void 0!==n||V(t,this.length-8);const r=e+256*this[++t]+65536*this[++t]+this[++t]*2**24,o=this[++t]+256*this[++t]+65536*this[++t]+n*2**24;return BigInt(r)+(BigInt(o)<>>=0,"offset");const e=this[t],n=this[t+7];void 0!==e&&void 0!==n||V(t,this.length-8);const r=e*2**24+65536*this[++t]+256*this[++t]+this[++t],o=this[++t]*2**24+65536*this[++t]+256*this[++t]+n;return(BigInt(r)<>>=0,e>>>=0,n||I(t,e,this.length);let r=this[t],o=1,i=0;for(;++i=o&&(r-=Math.pow(2,8*e)),r},u.prototype.readIntBE=function(t,e,n){t>>>=0,e>>>=0,n||I(t,e,this.length);let r=e,o=1,i=this[t+--r];for(;r>0&&(o*=256);)i+=this[t+--r]*o;return o*=128,i>=o&&(i-=Math.pow(2,8*e)),i},u.prototype.readInt8=function(t,e){return t>>>=0,e||I(t,1,this.length),128&this[t]?-1*(255-this[t]+1):this[t]},u.prototype.readInt16LE=function(t,e){t>>>=0,e||I(t,2,this.length);const n=this[t]|this[t+1]<<8;return 32768&n?4294901760|n:n},u.prototype.readInt16BE=function(t,e){t>>>=0,e||I(t,2,this.length);const n=this[t+1]|this[t]<<8;return 32768&n?4294901760|n:n},u.prototype.readInt32LE=function(t,e){return t>>>=0,e||I(t,4,this.length),this[t]|this[t+1]<<8|this[t+2]<<16|this[t+3]<<24},u.prototype.readInt32BE=function(t,e){return t>>>=0,e||I(t,4,this.length),this[t]<<24|this[t+1]<<16|this[t+2]<<8|this[t+3]},u.prototype.readBigInt64LE=Z((function(t){z(t>>>=0,"offset");const e=this[t],n=this[t+7];void 0!==e&&void 0!==n||V(t,this.length-8);const r=this[t+4]+256*this[t+5]+65536*this[t+6]+(n<<24);return(BigInt(r)<>>=0,"offset");const e=this[t],n=this[t+7];void 0!==e&&void 0!==n||V(t,this.length-8);const r=(e<<24)+65536*this[++t]+256*this[++t]+this[++t];return(BigInt(r)<>>=0,e||I(t,4,this.length),o.read(this,t,!0,23,4)},u.prototype.readFloatBE=function(t,e){return t>>>=0,e||I(t,4,this.length),o.read(this,t,!1,23,4)},u.prototype.readDoubleLE=function(t,e){return t>>>=0,e||I(t,8,this.length),o.read(this,t,!0,52,8)},u.prototype.readDoubleBE=function(t,e){return t>>>=0,e||I(t,8,this.length),o.read(this,t,!1,52,8)},u.prototype.writeUintLE=u.prototype.writeUIntLE=function(t,e,n,r){t=+t,e>>>=0,n>>>=0,r||P(this,t,e,n,Math.pow(2,8*n)-1,0);let o=1,i=0;for(this[e]=255&t;++i>>=0,n>>>=0,r||P(this,t,e,n,Math.pow(2,8*n)-1,0);let o=n-1,i=1;for(this[e+o]=255&t;--o>=0&&(i*=256);)this[e+o]=t/i&255;return e+n},u.prototype.writeUint8=u.prototype.writeUInt8=function(t,e,n){return t=+t,e>>>=0,n||P(this,t,e,1,255,0),this[e]=255&t,e+1},u.prototype.writeUint16LE=u.prototype.writeUInt16LE=function(t,e,n){return t=+t,e>>>=0,n||P(this,t,e,2,65535,0),this[e]=255&t,this[e+1]=t>>>8,e+2},u.prototype.writeUint16BE=u.prototype.writeUInt16BE=function(t,e,n){return t=+t,e>>>=0,n||P(this,t,e,2,65535,0),this[e]=t>>>8,this[e+1]=255&t,e+2},u.prototype.writeUint32LE=u.prototype.writeUInt32LE=function(t,e,n){return t=+t,e>>>=0,n||P(this,t,e,4,4294967295,0),this[e+3]=t>>>24,this[e+2]=t>>>16,this[e+1]=t>>>8,this[e]=255&t,e+4},u.prototype.writeUint32BE=u.prototype.writeUInt32BE=function(t,e,n){return t=+t,e>>>=0,n||P(this,t,e,4,4294967295,0),this[e]=t>>>24,this[e+1]=t>>>16,this[e+2]=t>>>8,this[e+3]=255&t,e+4},u.prototype.writeBigUInt64LE=Z((function(t,e=0){return R(this,t,e,BigInt(0),BigInt("0xffffffffffffffff"))})),u.prototype.writeBigUInt64BE=Z((function(t,e=0){return C(this,t,e,BigInt(0),BigInt("0xffffffffffffffff"))})),u.prototype.writeIntLE=function(t,e,n,r){if(t=+t,e>>>=0,!r){const r=Math.pow(2,8*n-1);P(this,t,e,n,r-1,-r)}let o=0,i=1,s=0;for(this[e]=255&t;++o>0)-s&255;return e+n},u.prototype.writeIntBE=function(t,e,n,r){if(t=+t,e>>>=0,!r){const r=Math.pow(2,8*n-1);P(this,t,e,n,r-1,-r)}let o=n-1,i=1,s=0;for(this[e+o]=255&t;--o>=0&&(i*=256);)t<0&&0===s&&0!==this[e+o+1]&&(s=1),this[e+o]=(t/i>>0)-s&255;return e+n},u.prototype.writeInt8=function(t,e,n){return t=+t,e>>>=0,n||P(this,t,e,1,127,-128),t<0&&(t=255+t+1),this[e]=255&t,e+1},u.prototype.writeInt16LE=function(t,e,n){return t=+t,e>>>=0,n||P(this,t,e,2,32767,-32768),this[e]=255&t,this[e+1]=t>>>8,e+2},u.prototype.writeInt16BE=function(t,e,n){return t=+t,e>>>=0,n||P(this,t,e,2,32767,-32768),this[e]=t>>>8,this[e+1]=255&t,e+2},u.prototype.writeInt32LE=function(t,e,n){return t=+t,e>>>=0,n||P(this,t,e,4,2147483647,-2147483648),this[e]=255&t,this[e+1]=t>>>8,this[e+2]=t>>>16,this[e+3]=t>>>24,e+4},u.prototype.writeInt32BE=function(t,e,n){return t=+t,e>>>=0,n||P(this,t,e,4,2147483647,-2147483648),t<0&&(t=4294967295+t+1),this[e]=t>>>24,this[e+1]=t>>>16,this[e+2]=t>>>8,this[e+3]=255&t,e+4},u.prototype.writeBigInt64LE=Z((function(t,e=0){return R(this,t,e,-BigInt("0x8000000000000000"),BigInt("0x7fffffffffffffff"))})),u.prototype.writeBigInt64BE=Z((function(t,e=0){return C(this,t,e,-BigInt("0x8000000000000000"),BigInt("0x7fffffffffffffff"))})),u.prototype.writeFloatLE=function(t,e,n){return O(this,t,e,!0,n)},u.prototype.writeFloatBE=function(t,e,n){return O(this,t,e,!1,n)},u.prototype.writeDoubleLE=function(t,e,n){return X(this,t,e,!0,n)},u.prototype.writeDoubleBE=function(t,e,n){return X(this,t,e,!1,n)},u.prototype.copy=function(t,e,n,r){if(!u.isBuffer(t))throw new TypeError("argument should be a Buffer");if(n||(n=0),r||0===r||(r=this.length),e>=t.length&&(e=t.length),e||(e=0),r>0&&r=this.length)throw new RangeError("Index out of range");if(r<0)throw new RangeError("sourceEnd out of bounds");r>this.length&&(r=this.length),t.length-e>>=0,n=void 0===n?this.length:n>>>0,t||(t=0),"number"==typeof t)for(o=e;o=r+4;n-=3)e=`_${t.slice(n-3,n)}${e}`;return`${t.slice(0,n)}${e}`}function F(t,e,n,r,o,i){if(t>n||t3?0===e||e===BigInt(0)?`>= 0${r} and < 2${r} ** ${8*(i+1)}${r}`:`>= -(2${r} ** ${8*(i+1)-1}${r}) and < 2 ** ${8*(i+1)-1}${r}`:`>= ${e}${r} and <= ${n}${r}`,new Y.ERR_OUT_OF_RANGE("value",o,t)}!function(t,e,n){z(e,"offset"),void 0!==t[e]&&void 0!==t[e+n]||V(e,t.length-(n+1))}(r,o,i)}function z(t,e){if("number"!=typeof t)throw new Y.ERR_INVALID_ARG_TYPE(e,"number",t)}function V(t,e,n){if(Math.floor(t)!==t)throw z(t,n),new Y.ERR_OUT_OF_RANGE(n||"offset","an integer",t);if(e<0)throw new Y.ERR_BUFFER_OUT_OF_BOUNDS;throw new Y.ERR_OUT_OF_RANGE(n||"offset",`>= ${n?1:0} and <= ${e}`,t)}q("ERR_BUFFER_OUT_OF_BOUNDS",(function(t){return t?`${t} is outside of buffer bounds`:"Attempt to access memory outside buffer bounds"}),RangeError),q("ERR_INVALID_ARG_TYPE",(function(t,e){return`The "${t}" argument must be of type number. Received type ${typeof e}`}),TypeError),q("ERR_OUT_OF_RANGE",(function(t,e,n){let r=`The value of "${t}" is out of range.`,o=n;return Number.isInteger(n)&&Math.abs(n)>2**32?o=D(String(n)):"bigint"==typeof n&&(o=String(n),(n>BigInt(2)**BigInt(32)||n<-(BigInt(2)**BigInt(32)))&&(o=D(o)),o+="n"),r+=` It must be ${e}. Received ${o}`,r}),RangeError);const j=/[^+/0-9A-Za-z-_]/g;function $(t,e){let n;e=e||1/0;const r=t.length;let o=null;const i=[];for(let s=0;s55295&&n<57344){if(!o){if(n>56319){(e-=3)>-1&&i.push(239,191,189);continue}if(s+1===r){(e-=3)>-1&&i.push(239,191,189);continue}o=n;continue}if(n<56320){(e-=3)>-1&&i.push(239,191,189),o=n;continue}n=65536+(o-55296<<10|n-56320)}else o&&(e-=3)>-1&&i.push(239,191,189);if(o=null,n<128){if((e-=1)<0)break;i.push(n)}else if(n<2048){if((e-=2)<0)break;i.push(n>>6|192,63&n|128)}else if(n<65536){if((e-=3)<0)break;i.push(n>>12|224,n>>6&63|128,63&n|128)}else{if(!(n<1114112))throw new Error("Invalid code point");if((e-=4)<0)break;i.push(n>>18|240,n>>12&63|128,n>>6&63|128,63&n|128)}}return i}function W(t){return r.toByteArray(function(t){if((t=(t=t.split("=")[0]).trim().replace(j,"")).length<2)return"";for(;t.length%4!=0;)t+="=";return t}(t))}function G(t,e,n,r){let o;for(o=0;o=e.length||o>=t.length);++o)e[o+n]=t[o];return o}function J(t,e){return t instanceof e||null!=t&&null!=t.constructor&&null!=t.constructor.name&&t.constructor.name===e.name}function H(t){return t!=t}const K=function(){const t="0123456789abcdef",e=new Array(256);for(let n=0;n<16;++n){const r=16*n;for(let o=0;o<16;++o)e[r+o]=t[n]+t[o]}return e}();function Z(t){return"undefined"==typeof BigInt?Q:t}function Q(){throw new Error("BigInt not supported")}},274:t=>{t.exports={}},977:t=>{t.exports={nodeStrokeWidth:"0.8",directionArrowSize:"6",directionArrowWidth:"0.7",node:"fornac-node",directionArrow:"fornac-directionArrow",plot:"fornac-plot",selectedNode:"fornac-selectedNode",nodeLabel:"fornac-nodeLabel",link:"fornac-link",plotLabel:"fornac-plotLabel",transparent:"fornac-transparent",dragLine:"fornac-dragLine",mouseEventHelper:"fornac-mouseEventHelper"}},645:(t,e)=>{e.read=function(t,e,n,r,o){var i,s,a=8*o-r-1,u=(1<>1,c=-7,f=n?o-1:0,d=n?-1:1,h=t[e+f];for(f+=d,i=h&(1<<-c)-1,h>>=-c,c+=a;c>0;i=256*i+t[e+f],f+=d,c-=8);for(s=i&(1<<-c)-1,i>>=-c,c+=r;c>0;s=256*s+t[e+f],f+=d,c-=8);if(0===i)i=1-l;else{if(i===u)return s?NaN:1/0*(h?-1:1);s+=Math.pow(2,r),i-=l}return(h?-1:1)*s*Math.pow(2,i-r)},e.write=function(t,e,n,r,o,i){var s,a,u,l=8*i-o-1,c=(1<>1,d=23===o?Math.pow(2,-24)-Math.pow(2,-77):0,h=r?0:i-1,p=r?1:-1,g=e<0||0===e&&1/e<0?1:0;for(e=Math.abs(e),isNaN(e)||e===1/0?(a=isNaN(e)?1:0,s=c):(s=Math.floor(Math.log(e)/Math.LN2),e*(u=Math.pow(2,-s))<1&&(s--,u*=2),(e+=s+f>=1?d/u:d*Math.pow(2,1-f))*u>=2&&(s++,u/=2),s+f>=c?(a=0,s=c):s+f>=1?(a=(e*u-1)*Math.pow(2,o),s+=f):(a=e*Math.pow(2,f-1)*Math.pow(2,o),s=0));o>=8;t[n+h]=255&a,h+=p,a/=256,o-=8);for(s=s<0;t[n+h]=255&s,h+=p,s/=256,l-=8);t[n+h-p]|=128*g}},386:(t,e,n)=>{t.exports=n(861)},861:(t,e,n)=>{var r=n(764).Buffer,o=n(614);e.encode=function(t){var e=o.parse(t);return r.from(e).toString("base64").replace(/\+/g,"-").replace(/\//g,"_").substring(0,22)},e.decode=function(t){var e=t.replace(/-/g,"+").replace(/_/g,"/")+"==";return o.stringify(r.from(e,"base64"))},e.v4=function(){return o.v4(null,r.alloc(16)).toString("base64").replace(/\+/g,"-").replace(/\//g,"_").substring(0,22)},e.nice=function(){var t=o.v4(null,r.alloc(16));return t[0]=127&t[0],t.toString("base64").replace(/\+/g,"-").replace(/\//g,"_").substring(0,22)}},614:(t,e,n)=>{"use strict";var r;n.r(e),n.d(e,{NIL:()=>S,parse:()=>y,stringify:()=>c,v1:()=>g,v3:()=>N,v4:()=>L,v5:()=>M,validate:()=>a,version:()=>B});var o=new Uint8Array(16);function i(){if(!r&&!(r="undefined"!=typeof crypto&&crypto.getRandomValues&&crypto.getRandomValues.bind(crypto)||"undefined"!=typeof msCrypto&&"function"==typeof msCrypto.getRandomValues&&msCrypto.getRandomValues.bind(msCrypto)))throw new Error("crypto.getRandomValues() not supported. See https://github.com/uuidjs/uuid#getrandomvalues-not-supported");return r(o)}const s=/^(?:[0-9a-f]{8}-[0-9a-f]{4}-[1-5][0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}|00000000-0000-0000-0000-000000000000)$/i,a=function(t){return"string"==typeof t&&s.test(t)};for(var u=[],l=0;l<256;++l)u.push((l+256).toString(16).substr(1));const c=function(t){var e=arguments.length>1&&void 0!==arguments[1]?arguments[1]:0,n=(u[t[e+0]]+u[t[e+1]]+u[t[e+2]]+u[t[e+3]]+"-"+u[t[e+4]]+u[t[e+5]]+"-"+u[t[e+6]]+u[t[e+7]]+"-"+u[t[e+8]]+u[t[e+9]]+"-"+u[t[e+10]]+u[t[e+11]]+u[t[e+12]]+u[t[e+13]]+u[t[e+14]]+u[t[e+15]]).toLowerCase();if(!a(n))throw TypeError("Stringified UUID is invalid");return n};var f,d,h=0,p=0;const g=function(t,e,n){var r=e&&n||0,o=e||new Array(16),s=(t=t||{}).node||f,a=void 0!==t.clockseq?t.clockseq:d;if(null==s||null==a){var u=t.random||(t.rng||i)();null==s&&(s=f=[1|u[0],u[1],u[2],u[3],u[4],u[5]]),null==a&&(a=d=16383&(u[6]<<8|u[7]))}var l=void 0!==t.msecs?t.msecs:Date.now(),g=void 0!==t.nsecs?t.nsecs:p+1,y=l-h+(g-p)/1e4;if(y<0&&void 0===t.clockseq&&(a=a+1&16383),(y<0||l>h)&&void 0===t.nsecs&&(g=0),g>=1e4)throw new Error("uuid.v1(): Can't create more than 10M uuids/sec");h=l,p=g,d=a;var m=(1e4*(268435455&(l+=122192928e5))+g)%4294967296;o[r++]=m>>>24&255,o[r++]=m>>>16&255,o[r++]=m>>>8&255,o[r++]=255&m;var b=l/4294967296*1e4&268435455;o[r++]=b>>>8&255,o[r++]=255&b,o[r++]=b>>>24&15|16,o[r++]=b>>>16&255,o[r++]=a>>>8|128,o[r++]=255&a;for(var v=0;v<6;++v)o[r+v]=s[v];return e||c(o)},y=function(t){if(!a(t))throw TypeError("Invalid UUID");var e,n=new Uint8Array(16);return n[0]=(e=parseInt(t.slice(0,8),16))>>>24,n[1]=e>>>16&255,n[2]=e>>>8&255,n[3]=255&e,n[4]=(e=parseInt(t.slice(9,13),16))>>>8,n[5]=255&e,n[6]=(e=parseInt(t.slice(14,18),16))>>>8,n[7]=255&e,n[8]=(e=parseInt(t.slice(19,23),16))>>>8,n[9]=255&e,n[10]=(e=parseInt(t.slice(24,36),16))/1099511627776&255,n[11]=e/4294967296&255,n[12]=e>>>24&255,n[13]=e>>>16&255,n[14]=e>>>8&255,n[15]=255&e,n};function m(t,e,n){function r(t,r,o,i){if("string"==typeof t&&(t=function(t){t=unescape(encodeURIComponent(t));for(var e=[],n=0;n>>9<<4)+1}function v(t,e){var n=(65535&t)+(65535&e);return(t>>16)+(e>>16)+(n>>16)<<16|65535&n}function k(t,e,n,r,o,i){return v((s=v(v(e,t),v(r,i)))<<(a=o)|s>>>32-a,n);var s,a}function x(t,e,n,r,o,i,s){return k(e&n|~e&r,t,e,o,i,s)}function w(t,e,n,r,o,i,s){return k(e&r|n&~r,t,e,o,i,s)}function E(t,e,n,r,o,i,s){return k(e^n^r,t,e,o,i,s)}function A(t,e,n,r,o,i,s){return k(n^(e|~r),t,e,o,i,s)}const N=m("v3",48,(function(t){if("string"==typeof t){var e=unescape(encodeURIComponent(t));t=new Uint8Array(e.length);for(var n=0;n>5]>>>o%32&255,s=parseInt(r.charAt(i>>>4&15)+r.charAt(15&i),16);e.push(s)}return e}(function(t,e){t[e>>5]|=128<>5]|=(255&t[r/8])<>>32-e}const M=m("v5",80,(function(t){var e=[1518500249,1859775393,2400959708,3395469782],n=[1732584193,4023233417,2562383102,271733878,3285377520];if("string"==typeof t){var r=unescape(encodeURIComponent(t));t=[];for(var o=0;o>>0;v=b,b=m,m=_(y,30)>>>0,y=g,g=w}n[0]=n[0]+g>>>0,n[1]=n[1]+y>>>0,n[2]=n[2]+m>>>0,n[3]=n[3]+b>>>0,n[4]=n[4]+v>>>0}return[n[0]>>24&255,n[0]>>16&255,n[0]>>8&255,255&n[0],n[1]>>24&255,n[1]>>16&255,n[1]>>8&255,255&n[1],n[2]>>24&255,n[2]>>16&255,n[2]>>8&255,255&n[2],n[3]>>24&255,n[3]>>16&255,n[3]>>8&255,255&n[3],n[4]>>24&255,n[4]>>16&255,n[4]>>8&255,255&n[4]]})),S="00000000-0000-0000-0000-000000000000",B=function(t){if(!a(t))throw TypeError("Invalid UUID");return parseInt(t.substr(14,1),16)}},990:e=>{"use strict";e.exports=t}},n={};function o(t){var r=n[t];if(void 0!==r)return r.exports;var i=n[t]={exports:{}};return e[t](i,i.exports,o),i.exports}o.n=t=>{var e=t&&t.__esModule?()=>t.default:()=>t;return o.d(e,{a:e}),e},o.d=(t,e)=>{for(var n in e)o.o(e,n)&&!o.o(t,n)&&Object.defineProperty(t,n,{enumerable:!0,get:e[n]})},o.g=function(){if("object"==typeof globalThis)return globalThis;try{return this||new Function("return this")()}catch(t){if("object"==typeof window)return window}}(),o.o=(t,e)=>Object.prototype.hasOwnProperty.call(t,e),o.r=t=>{"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(t,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(t,"__esModule",{value:!0})},(()=>{var t;o.g.importScripts&&(t=o.g.location+"");var e=o.g.document;if(!t&&e&&(e.currentScript&&(t=e.currentScript.src),!t)){var n=e.getElementsByTagName("script");n.length&&(t=n[n.length-1].src)}if(!t)throw new Error("Automatic publicPath is not supported in this browser");t=t.replace(/#.*$/,"").replace(/\?.*$/,"").replace(/\/[^\/]+$/,"/"),o.p=t})();var i={};return(()=>{"use strict";o.r(i),o.d(i,{ColorScheme:()=>p,FornaContainer:()=>L,RNAUtilities:()=>d,rnaPlot:()=>T,rnaTreemap:()=>_});var t=o(977),e=o.n(t),n=o(990),s=o.n(n),a=o(386);o(274);const u=o.p+"02188894d5236b1517df3210b79c2a7f.svg";function l(t,e){var n,r,o=!1,i=a.nice(),c=null,f="right",d=null,h=null;return"function"==typeof e?n=e:(n=(e=e||{}).onOpen,r=e.onClose),"rootElement"in e&&(c=e.rootElement),"pos"in e&&(d=e.pos),"orientation"in e&&(f=e.orientation),"parentStart"in e&&(h=e.parentStart),s().selectAll(".d3-context-menu-"+i).data([1]).enter().append("div").classed("d3-context-menu",!0).classed("d3-context-menu-"+i,!0),s().select("body").on("click.d3-context-menu-"+i,(function(){o?o=!1:(console.log("body click close"),s().select(".d3-context-menu-"+i).style("display","none"),f="right",r&&r())})),function(e,a){var p=arguments.length>2&&void 0!==arguments[2]&&arguments[2],g=this,y=null,m=this;y=null==c?s().mouse(this):s().mouse(c);var b=null;o=p,s().selectAll(".d3-context-menu-"+i).html("");var v=s().selectAll(".d3-context-menu-"+i).on("contextmenu",(function(t){console.log("context-menu close"),s().select(".d3-context-menu-"+i).style("display","none"),f="right",s().event.preventDefault(),s().event.stopPropagation()})).append("ul");if(v.selectAll("li").data("function"==typeof t?t(e):t).enter().append("li").attr("class",(function(t){console.log("d:",t);var e="";return t.divider&&(e+=" is-divider"),t.disabled&&(e+=" is-disabled"),t.action||(e+=" is-header"),"children"in t&&(e+=" d3-context-menu-recursive"),e})).html((function(t){return t.divider?"
":(t.title||console.error("No title attribute set. Check the spelling of your options."),"string"==typeof t.title?t.title:t.title(e))})).on("click",(function(t,n){t.disabled||t.action&&(t.action(g,e,a,y),console.log("click close"),s().selectAll(".d3-context-menu").style("display","none"),f="right",r&&r())})).on("mouseenter",(function(t,n){if(s().select(this).classed("d3-context-menu-selected",!0),null!=b){if(s().select(".d3-context-menu-"+i).selectAll("li").classed("d3-context-menu-selected",!1),void 0===t.children)return console.log("no children close"),s().select(".d3-context-menu-"+b).style("display","none"),void(b=null);if(t.childUid==b)return;console.log("open different child menu close"),s().select(".d3-context-menu-"+b).style("display","none"),b=null}if(void 0!==t.children){var r=this.getBoundingClientRect(),o=null;o=l(t.children,"left"==f?{rootElement:m,pos:[r.left+window.pageXOffset,r.top-2+window.pageYOffset],orientation:"left"}:{pos:[r.left+r.width+window.pageXOffset,r.top-2+window.pageYOffset],rootElement:m,parentStart:[r.left+window.pageXOffset,r.top-2+window.pageYOffset]}),t.childUid=o.apply(this,[e,n,!0,function(){}]),b=t.childUid}s().select(this).classed("d3-context-menu-selected",!0)})).on("mouseleave",(function(t,e){null==b&&s().select(this).classed("d3-context-menu-selected",!1)})),v.selectAll(".d3-context-menu-recursive").append("img").attr("src",u).attr("width","14px").attr("height","14px").style("position","absolute").style("right","5px"),n&&!1===n(e,a))return i;var k=s().select(".d3-context-menu-"+i).style("display","block");null==d?s().select(".d3-context-menu-"+i).style("left",s().event.pageX-2+"px").style("top",s().event.pageY-2+"px"):s().select(".d3-context-menu-"+i).style("left",d[0]+"px").style("top",d[1]+"px");var x=k.node().getBoundingClientRect();return(x.left+x.width>window.innerWidth||"left"==f)&&(f="left",null==d?s().select(".d3-context-menu-"+i).style("left",s().event.pageX-2-x.width+"px").style("top",s().event.pageY-2+"px"):null!=h?s().select(".d3-context-menu-"+i).style("left",h[0]-x.width+"px").style("top",h[1]+"px"):s().select(".d3-context-menu-"+i).style("left",d[0]-x.width+"px").style("top",d[1]+"px")),o||(s().event.preventDefault(),s().event.stopPropagation()),i}}var c=function(t,e){return t-e};function f(t,e){if(t===e)return!0;if(null===t||null===e)return!1;if(t.length!=e.length)return!1;for(var n=0;nabcdefghijklmnopqrstuvwxyz".split(""),t.inverseBrackets=function(t){for(var e={},n=0;n0;r--)for(o=r+0+1;o<=e;o++){i=n[r][o-1];for(var s=o-0-1;s>=r;s--)t[s]===o&&(i=Math.max(i,(s>r?n[r][s-1]:0)+1+(o-s-1>0?n[s+1][o-1]:0)));n[r][o]=i}return i=n[1][e],n},t.backtrackMaximumMatching=function(e,n){var r=Array.apply(null,Array(e.length)).map((function(){return 0}));return t.mmBt(e,r,n,1,e.length-1),r},t.mmBt=function(e,n,r,o,i){var s=e[o][i];if(!(i-o-1<0))if(e[o][i-1]!=s){for(var a=i-0-1;a>=o;a--)if(r[i]===a&&(a>o?e[o][a-1]:0)+(i-a-1>0?e[a+1][i-1]:0)+1==s)return n[a]=i,n[i]=a,o0)throw"Unmatched base at position "+r[c][0];return n},t.insertIntoStack=function(t,e,n){for(var r=0;t[r].length>0&&t[r][t[r].length-1]r?i+=t.bracketLeft[t.insertIntoStack(n,r,e[r])]:i+=t.bracketRight[t.deleteFromStack(n,r)]}return i},t.findUnmatched=function(e,n,r){for(var o=[],i=[],s=n,a=r,u=n;u<=r;u++)0!==e[u]&&(e[u]r)&&i.push([u,e[u]]);for(u=s;u<=a;u++){for(;0===e[u]&&u<=a;)u++;for(r=e[u];e[u]===r;)u++,r--;o=o.concat(t.findUnmatched(e,u,r))}return i.length>0&&o.push(i),o},t.removePseudoknotsFromPairtable=function(e){for(var n=t.maximumMatching(e),r=t.backtrackMaximumMatching(n,e),o=[],i=1;io)return[];for(;0===e[r];r++)a.push(r);for(;0===e[o];o--)u.push(o);if(r>o){if(a.push(r),0===n)return[["e",n,a.sort(c)]];for(var l=!1,f=[],d=[],h=0;h=0&&(l=!0);return[["h",n,a.sort(c)]]}if(e[r]!=o){var p=a;for(h=r,p.push(h);h<=o;){for(s=s.concat(t.ptToElements(e,n,h,e[h],i)),p.push(e[h]),h=e[h]+1;0===e[h]&&h<=o;h++)p.push(h);p.push(h)}return p.pop(),(p=p.concat(u)).length>0&&(0===n?s.push(["e",n,p.sort(c)]):s.push(["m",n,p.sort(c)])),s}if(e[r]===o){a.push(r),u.push(o);var g=a.concat(u);g.length>4&&(0===n?s.push(["e",n,a.concat(u).sort(c)]):s.push(["i",n,a.concat(u).sort(c)]))}for(var y=[];e[r]===o&&r"!=n[a][0])for(var u=n[a].trim().split(/[\s]+/),l=0;lo&&(o=t));for(i in e.colorsJson.colorValues[n])"number"==typeof(t=e.colorsJson.colorValues[n][i])&&(e.colorsJson.colorValues[n][i]=(t-r)/(o-r))}return e},e.parseColorText(e.colorsText),e}var g=function(t,e){return t-e};function y(){var t=arguments.length>0&&void 0!==arguments[0]?arguments[0]:"",e=arguments.length>1&&void 0!==arguments[1]?arguments[1]:"",n=arguments.length>2&&void 0!==arguments[2]?arguments[2]:"",r=arguments.length>3&&void 0!==arguments[3]?arguments[3]:1,o=this;o.type="rna",o.circularizeExternal=!1,o.seq=t,o.dotbracket=e,o.structName=n,o.circular=!1,"*"==o.dotbracket.slice(-1)&&(o.dotbracket=o.dotbracket.slice(0,-1),o.circular=!0),o.uid=a.nice(),o.elements=[],o.pseudoknotPairs=[],o.nucsToNodes={},o.addUids=function(t){for(var e=o.nodes.filter((function(t){return"nucleotide"==t.nodeType})),n=0;n=0;)e.push(n),t=t.substring(0,n)+t.substring(n+1,t.length);return{targetString:t,breaks:e}};var i=o.removeBreaks(o.dotbracket);o.dotbracket=i.targetString,o.dotBracketBreaks=i.breaks,i=o.removeBreaks(o.seq),o.seq=i.targetString,o.seqBreaks=i.breaks,o.rnaLength=o.dotbracket.length,f(o.dotBracketBreaks,o.seqBreaks)||(console.log("WARNING: Sequence and structure breaks not equal"),console.log("WARNING: Using the breaks in the structure")),o.computePairtable(),o.addPositions=function(t,e){for(var n=o.nodes.filter((function(e){return e.nodeType==t})),r=0;r=0&&(t[e].nodeType="middle",t[e+1].nodeType="middle");for(var n=function(t){i=!1;for(var e=0;e=0&&(i=!0);i?o.elements[t][2].map((function(t){0!=t&&(o.nodes[t-1].elemType="e")})):o.elements[t][2].map((function(e){0!=e&&(o.nodes[e-1].elemType=o.elements[t][0])}))},r=0;r=4})),n=0;no.dotbracket.length)){o.links.push({source:o.nodes[t[f]-1],target:o.nodes[o.nodes.length-1],linkType:"fake",value:n,uid:a.nice()}),t.length>4&&o.links.push({source:o.nodes[t[f]-1],target:o.nodes[t[(f+Math.floor(t.length/2))%t.length]-1],linkType:"fake",value:2*n,uid:a.nice()});var d=3.14159*(t.length-2)/t.length,h=2*Math.cos(1.570795-d/2);o.links.push({source:o.nodes[t[f]-1],target:o.nodes[t[(f+2)%t.length]-1],linkType:"fake",value:h});var p=o.nodes[t[f]-1];"x"in p&&(u+=p.x,l+=p.y,c+=1)}return c>0&&(s.x=u/c,s.y=l/c,s.px=s.x,s.py=s.y),o},o.connectFakeNodes=function(){for(var t={},e=o.nodes.filter((function(t){return"middle"==t.nodeType})),n={},r=1;r<=o.nodes.length;r++)t[r]=[];for(r=0;r=0||o.dotBracketBreaks.indexOf(u-2)>=0)&&(l=""),o.nodes.push({name:l,num:r+u-1,radius:5,rna:o,nodeType:"nucleotide",structName:o.structName,elemType:e[u],uid:a.nice(),linked:!1})}for(var c=0;c1&&-1===o.dotBracketBreaks.indexOf(f-1)&&-1==o.dotBracketBreaks.indexOf(f-2)&&-1==o.dotBracketBreaks.indexOf(f-3)&&(o.links.push({source:o.nodes[f-2],target:o.nodes[f-1],linkType:"backbone",value:1,uid:a.nice()}),o.nodes[f-1].linked=!0);for(var d=0;dr)return[];for(;0===t[n];n++)s.push(n);for(;0===t[r];r--)a.push(r);if(n>r){if(s.push(n),0===e)return[["e",e,s.sort(g)]];for(var u=!1,l=[],c=[],f=0;f=0&&(u=!0);return[["h",e,s.sort(g)]]}if(t[n]!=r){var d=s;for(f=n,d.push(f);f<=r;){for(i=i.concat(o.ptToElements(t,e,f,t[f])),d.push(t[f]),f=t[f]+1;0===t[f]&&f<=r;f++)d.push(f);d.push(f)}return d.pop(),(d=d.concat(a)).length>0&&(0===e?i.push(["e",e,d.sort(g)]):i.push(["m",e,d.sort(g)])),i}t[n]===r&&(s.push(n),a.push(r),s.concat(a).length>4&&(0===e?i.push(["e",e,s.concat(a).sort(g)]):i.push(["i",e,s.concat(a).sort(g)])));for(var h=[];t[n]===r&&n0&&void 0!==arguments[0]?arguments[0]:1,e=arguments.length>1&&void 0!==arguments[1]?arguments[1]:10;if(0===e)return o;for(var n=1;n<=o.rnaLength;n++)if(n%e==0){var r=void 0,i=void 0,s=o.nodes[n-1],u=void 0,l=void 0,c=void 0,f=void 0;1==o.rnaLength?(f=[s.x-15,s.y],c=[s.x-15,s.y]):(u=1==n?o.nodes[o.rnaLength-1]:o.nodes[n-2],l=n==o.rnaLength?o.nodes[0]:o.nodes[n],0!==o.pairtable[l.num-t+1]&&0!==o.pairtable[u.num-t+1]&&0!==o.pairtable[s.num-t+1]&&(u=l=o.nodes[o.pairtable[s.num-t+1]-1]),0===o.pairtable[s.num-t+1]||0!==o.pairtable[l.num-t+1]&&0!==o.pairtable[u.num-t+1]?(f=[l.x-s.x,l.y-s.y],c=[u.x-s.x,u.y-s.y]):(f=[s.x-l.x,s.y-l.y],c=[s.x-u.x,s.y-u.y]));var d=[f[0]+c[0],f[1]+c[1]],h=Math.sqrt(d[0]*d[0]+d[1]*d[1]),p=[d[0]/h,d[1]/h],g=[-15*p[0],-15*p[1]];r=o.nodes[n-1].x+g[0],i=o.nodes[n-1].y+g[1];var y={name:n+t-1,num:-1,radius:6,rna:o,nodeType:"label",structName:o.structName,elemType:"l",x:r,y:i,px:r,py:i,uid:a.nice()},m={source:o.nodes[n-1],target:y,value:1,linkType:"label_link",uid:a.nice()};o.nodes.push(y),o.links.push(m)}return o},o.recalculateElements=function(){if(o.removePseudoknots(),o.elements=o.ptToElements(o.pairtable,0,1,o.dotbracket.length),o.circular){var t=o.elements.filter((function(t){if("e"==t[0])return!0}));if(t.length>0){eloop=t[0],nucs=eloop[2].sort(g),prev=nucs[0],hloop=!0,numGreater=0;for(var e=1;e1&&(numGreater+=1),prev=nucs[e];1==numGreater?eloop[0]="h":2==numGreater?eloop[0]="i":eloop[0]="m"}}return o},o.reassignLinkUids=function(){for(var t=0;t1&&(o.pseudoknotPairs=o.pseudoknotPairs.concat(h.removePseudoknotsFromPairtable(o.pairtable))),o},o.addPseudoknots=function(){for(var t=o.pairtable,e=o.pseudoknotPairs,n=0;n0&&o.recalculateElements(),o.getNodeFromNucleotides=function(t){if("[object Array]"===Object.prototype.toString.call(t)){for(var e=0;ed);if(y=m-2,m>=2&&(s[p+1+y]+=f,s[g-1-y]+=f,s[p]+=f,s[g]+=f,m>2))for(;y>=1;y--)s[p+y]=Math.PI,s[g-y]=Math.PI;u[++c]=m,d<=h&&t(d,h,r)}else e++,w++,A++;for(x=Math.PI*(w-2)/w,N[++E]=n,b=o<0?0:o,v=1;v<=E;v++){for(k=N[v]-b,y=0;y<=k;y++)s[b+y]+=x;if(v>E)break;b=N[++v]}a[++l]=A}(0,n+1,t),a[l]-=2,r=0,o[0]=100,i[0]=100;var d=[];for(d.push([o[0],i[0]]),e=1;e=0&&(1==++e||n>r)&&(n=r);return t.setMark(!1),n+1}function L(t){var n=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{},o=this,i={editable:!1,zoomable:!0,animation:!0,displayAllLinks:!1,labelInterval:10,chargeDistance:110,friction:.35,middleCharge:-30,otherCharge:-30,linkDistanceMultiplier:15,initialSize:null,layout:"standard-polygonal",transitionDuration:500,maxNodeRadius:80};o.options=Object.assign(i,n),null!==o.options.initialSize?(o.options.svgW=o.options.initialSize[0],o.options.svgH=o.options.initialSize[1]):(o.options.svgW=300,o.options.svgH=300),o.linkStrengths={pseudoknot:0,proteinChain:0,chainChain:0,intermolecule:10,external:0,other:10},o.displayParameters={displayNumbering:!0,displayNodeOutline:!0,displayNodeLabel:!0,displayLinks:!0,displayPseudoknotLinks:!0,displayProteinLinks:!0,displayDirectionArrows:!0},o.colorScheme="structure",o.customColors={},o.rnas={},o.extraLinks=[];var u=null,c=null,f=!1,d=function(){u=null,c=null},g=o.graph={nodes:[],links:[]};if(Array.prototype.equals=function(t){if(!t)return!1;if(this.length!=t.length)return!1;for(var e=0,n=this.length;e1&&void 0!==arguments[1]?arguments[1]:{},n={sequence:"",name:"empty",positions:[],labelInterval:o.options.labelInterval,avoidOthers:!0,uids:[],circularizeExternal:!0},r=new y((n=Object.assign(n,e)).sequence,t,n.name);r.circularizeExternal=n.circularizeExternal;var i=r.recalculateElements();if(0===n.positions.length)if("naview"==o.options.layout){var s=new E,a=s.naview_xy_coordinates(r.pairtable);n.positions=[];for(var u=0;ur||ui||l0&&void 0!==arguments[0]?arguments[0]:0,e=G();null!==e&&(T.transition().attr("transform","translate("+e.translate+") scale("+e.scale+")").duration(t),o.zoomer.translate(e.translate),o.zoomer.scale(e.scale))},o.setSize=function(){var e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:s().select(t).node().offsetWidth,n=arguments.length>1&&void 0!==arguments[1]?arguments[1]:s().select(t).node().offsetHeight;o.options.svgW=e,o.options.svgH=n,N.attr("viewBox","0 0 "+e+" "+n),B.range([0,e]).domain([0,e]),I.range([0,n]).domain([0,n]),o.zoomer.x(B).y(I),o.brusher.x(B).y(I),N.select(".background").attr("width",e).attr("height",n),o.centerView()},o.setOutlineColor=function(t){M.selectAll("g.gnode").select("[node_type=nucleotide]").style("fill",t)},o.addCustomColors=function(t){o.customColors=t,o.changeColorScheme("custom")},o.addCustomColorsText=function(t){var e=new p(t);o.customColors=e.colorsJson,o.changeColorScheme("custom")},o.changeColorScheme=function(t){M.selectAll("[node_type=protein]").classed(e().node,!0).attr("r",(function(t){return t.radius})),M.selectAll("g.gnode"),M.selectAll("g.gnode").selectAll("circle");var n=M.selectAll("g.gnode").select("[node_type=nucleotide]");if(o.colorScheme=t,"sequence"==t){var r=s().scale.ordinal().range(["#dbdb8d","#98df8a","#ff9896","#aec7e8","#aec7e8"]).domain(["A","C","G","U","T"]);n.style("fill",(function(t){return r(t.name)}))}else if("structure"==t)r=s().scale.category10().domain(["s","m","i","e","t","h","x"]).range(["lightgreen","#ff9896","#dbdb8d","lightsalmon","lightcyan","lightblue","transparent"]),n.style("fill",(function(t){return r(t.elemType)}));else if("positions"==t)n.style("fill",(function(t){return s().scale.linear().range(["#98df8a","#dbdb8d","#ff9896"]).interpolate(s().interpolateLab).domain([1,1+(t.rna.rnaLength-1)/2,t.rna.rnaLength])(t.num)}));else if("custom"==t){void 0!==o.customColors&&"domain"in o.customColors&&"range"in o.customColors&&(r=s().scale.linear().interpolate(s().interpolateLab).domain(o.customColors.domain).range(o.customColors.range));var i=function(t,e,n){if(t.hasOwnProperty(e.num)){var r=parseFloat(t[e.num]);return isNaN(r)?t[e.num]:n(r)}return"white"};n.style("fill",(function(t){if(void 0===o.customColors||!o.customColors.hasOwnProperty("colorValues"))return"white";if(o.customColors.colorValues.hasOwnProperty(t.structName)&&o.customColors.colorValues[t.structName].hasOwnProperty(t.num)){var e=o.customColors.colorValues[t.structName];return i(e,t,r)}if(o.customColors.colorValues.hasOwnProperty("")){var n=o.customColors.colorValues[""];return i(n,t,r)}return"white"}))}};var J=function(){M.selectAll("[node_type=label]").classed(e().transparent,!o.displayParameters.displayNumbering),M.selectAll("[label_type=label]").classed(e().transparent,!o.displayParameters.displayNumbering),_.selectAll("[link_type=label_link]").classed(e().transparent,!o.displayParameters.displayNumbering),N.selectAll("[node_type=nucleotide]").classed(e().transparent,!o.displayParameters.displayNodeOutline),M.selectAll("[label_type=nucleotide]").classed(e().transparent,!o.displayParameters.displayNodeLabel),N.selectAll("[link_type=real],[link_type=basepair],[link_type=backbone],[link_type=pseudoknot],[link_type=protein_chain],[link_type=chain_chain],[link_type=external]").classed(e().transparent,!o.displayParameters.displayLinks),N.selectAll("[link_type=pseudoknot]").classed(e().transparent,!o.displayParameters.displayPseudoknotLinks),N.selectAll("[link_type=protein_chain]").classed(e().transparent,!o.displayParameters.displayProteinLinks),_.selectAll("[link_type=fake]").classed(e().transparent,!o.options.displayAllLinks),_.selectAll("[link_type=fake_fake]").classed(e().transparent,!o.options.displayAllLinks),N.selectAll("."+e().directionArrow).classed(e().transparent,!o.displayParameters.displayDirectionArrows)},H=function(t,e){var n=e.rna,r=h.pairtableToDotbracket(n.pairtable),i=n.getPositions("nucleotide"),s=n.seq,u=n.getUids(),l=e.num,c=r,f=s.slice(0,l-1)+t+s.slice(l);console.log("newSequence:",f),console.log("uids:",u),u.splice(l-1,1,a.nice());var d=i;delete o.rnas[n.uid],o.addRNA(c,{sequence:f,positions:d,uids:u,centerView:!1})},K=function(t,e,n){var r=e.rna,i=h.pairtableToDotbracket(r.pairtable),s=r.getPositions("nucleotide"),u=r.seq,l=r.getUids(),c=e.num+n,f=i.slice(0,c)+"."+i.slice(c),d=u.slice(0,c)+t+u.slice(c);console.log("newSequence:",d),l.splice(c,0,a.nice()),s.splice(c,0,s[c-n-1]);var p=l,g=s;console.log("positions:",s),console.log("new node positions:",g),delete o.rnas[r.uid],o.addRNA(f,{sequence:d,positions:g,uids:p,centerView:!1})},Z=function(t){console.log("deleting...",t);var e=t.rna,n=e.pairtable[t.num];0!=n&&(e.pairtable[t.num]=0,e.pairtable[n]=0);var r=h.pairtableToDotbracket(e.pairtable),i=e.getPositions("nucleotide"),s=e.seq,a=e.getUids(),u=r.slice(0,t.num-1)+r.slice(t.num),l=i.slice(0,t.num-1).concat(i.slice(t.num)),c=s.slice(0,t.num-1)+s.slice(t.num),f=a.slice(0,t.num-1).concat(a.slice(t.num));delete o.rnas[e.uid],o.addRNA(u,{sequence:c,positions:l,uids:f,centerView:!1}),console.log("new dotbracket:",u)},Q=function(t){return t.uid},tt=function(t){var e=t.getPositions("nucleotide"),n=t.getPositions("label"),r=t.getUids();t.recalculateElements().elementsToJson().addPseudoknots().addPositions("nucleotide",e).addUids(r).addLabels(1,o.options.labelInterval).addPositions("label",n).reinforceStems().reinforceLoops().updateLinkUids()},et=function(t){if(t.target.num-t.source.num==1){for(var e=t.target.rna,n=[],r=0;r=t.target.num&&(console.log("crossing basepair",i),n.push(i))}console.log("toRemove:",n);for(var s=0;s-1){if(t.source.rna==t.target.rna){if("backbone"==t.linkType)return console.log("trying to remove a backbone link",t.source.num,t.target.num),void et(t);var n=t.source.rna;n.addPseudoknots(),n.pairtable[t.source.num]=0,n.pairtable[t.target.num]=0,tt(n)}else{var r=o.extraLinks.indexOf(t);o.extraLinks.splice(r,1)}W()}o.update()},rt=function(t){var e=t.target.rna,n=t.source.rna;1==t.target.num&&(e=t.source.rna,n=t.target.rna);for(var r=h.pairtableToDotbracket(e.pairtable),i=h.pairtableToDotbracket(n.pairtable),s=e.seq,u=n.seq,l=e.getPositions("nucleotide"),c=n.getPositions("nucleotide"),f=r+i,d=s+u,p=l.concat(c),g=[],y={},m=0;m1&&void 0!==arguments[1]?arguments[1]:{},n=F(t,e);if("extraLinks"in e){var r=o.addExternalLinks(n,e.extraLinks);o.extraLinks=o.extraLinks.concat(r)}return"centerPos"in e?o.addRNAJSON(n,{centerPos:e.centerPos,centerView:!1}):"avoidOthers"in e?o.addRNAJSON(n,{avoidOthers:e.avoidOthers}):o.addRNAJSON(n,{centerView:e.centerView}),n},o.addRNAJSON=function(t,e){var n,r,i=e.avoidOthers,a=void 0!==i&&i,u=e.centerPos,l=void 0===u?null:u,c=e.centerView,f=void 0===c||c;if(null!=l){var d=0,h=0,p=0;t.nodes.forEach((function(t){d+=t.x,h+=t.y,p+=1})),p>0&&t.nodes.forEach((function(t){t.x=t.x+l[0]-d/p,t.y=t.y+l[1]-h/p,t.px=t.x,t.py=t.y}))}return a&&(n=o.graph.nodes.length>0?s().max(o.graph.nodes.map((function(t){return t.x}))):0,r=s().min(t.nodes.map((function(t){return t.x}))),t.nodes.forEach((function(t){t.x+=n-r+20,t.px+=n-r}))),t.nodes.forEach((function(e){e.rna=t})),o.rnas[t.uid]=t,W(),o.update(),f&&o.centerView(),t},o.addNodes=function(t){t.links.forEach((function(e){"number"==typeof e.source&&(e.source=t.nodes[e.source]),"number"==typeof e.target&&(e.target=t.nodes[e.target])})),o.graph.nodes.length>0?(maxX=s().max(o.graph.nodes.map((function(t){return t.x}))),maxY=s().max(o.graph.nodes.map((function(t){return t.y})))):(maxX=0,maxY=0),t.nodes.forEach((function(t){t.rna.uid in o.rnas||(o.rnas[t.rna.uid]=t.rna),t.x+=maxX,t.px+=maxX})),r=new y("",""),r.nodes=t.nodes,r.links=t.links,W(),o.update(),o.centerView()},o.clearNodes=function(){o.graph.nodes=[],o.graph.links=[],o.rnas={},o.extraLinks=[],o.update()},o.addLink=function(t){if(console.log("adding new link"),t.source.rna==t.target.rna){var e=t.source.rna;e.pairtable[t.source.num]=t.target.num,e.pairtable[t.target.num]=t.source.num,tt(e)}else console.log("intermolecule"),t.linkType="intermolecule",o.extraLinks.push(t);W(),o.update()},o.addExternalLinks=function(t,e){for(var n=[],r=0;r0&&void 0!==arguments[0]?arguments[0]:{},o={width:300,height:300,nucleotideRadius:5,rnaEdgePadding:1,labelInterval:10,showNucleotideLabels:!0,startNucleotideNumber:1,bundleExternalLinks:!1,rnaLayout:"simple",namePosition:"0 0"};function i(e,r){var i=d3.extent(e),s=d3.extent(r);i[0]-=o.nucleotideRadius+o.rnaEdgePadding,s[0]-=o.nucleotideRadius+o.rnaEdgePadding,i[1]+=o.nucleotideRadius+o.rnaEdgePadding,s[1]+=o.nucleotideRadius+o.rnaEdgePadding;var a,u=i[1]-i[0],l=s[1]-s[0];function c(t,e,n){var r=(t.range()[1]-t.range()[0])/(t.domain()[1]-t.domain()[0]),o=(e[1]-e[0])*r,i=(n[1]-n[0]-o)/2;return{scaleFactor:r,scale:d3.scale.linear().domain(e).range([n[0]+i,n[1]-i])}}return u-o.width>l-o.height?(a=c(t=d3.scale.linear().domain(i).range([0,o.width]),s,[0,o.height]),n=a.scale):(a=c(n=d3.scale.linear().domain(s).range([0,o.height]),i,[0,o.width]),t=a.scale),t.range()[0],t.domain()[0],n.range()[0],n.domain()[0],"translate("+-(t.domain()[0]*a.scaleFactor-t.range()[0])+","+-(n.domain()[0]*a.scaleFactor-n.range()[0])+")scale("+a.scaleFactor+")"}function s(t,n){var r=t.selectAll(".gnode").data(n).enter().append("svg:g").classed("gnode",!0).attr("transform",(function(t){return"translate("+t.x+","+t.y+")"}));r.append("svg:circle").classed(e().node,!0).attr("node_type","nucleotide").attr("base_type",(function(t){if(t.name)return t.name.toLowerCase()})).attr("r",o.nucleotideRadius),o.showNucleotideLabels&&r.append("svg:text").text((function(t){return t.name})).classed(e().nodeLabel,!0).append("svg:title").text((function(t){return t.struct_name+":"+t.num}))}function a(t,n){var r=t.selectAll().data(n).enter().append("svg:g").classed("gnode",!0).attr("transform",(function(t){return"translate("+t.x+","+t.y+")"}));r.append("svg:circle").classed(e().node,!0).attr("node_type","label").attr("r",o.nucleotideRadius),r.append("svg:text").classed(e().nodeLabel,!0).text((function(t){return t.name}))}function u(t,n){var r=t.append("svg:text").classed(e().plotLabel,!0).text(n),i=o.namePosition.split(" ",2),s=[],a=r.node().getBBox(),u=[a.width,a.height],l=[o.width,o.height];for(var c in[0,1])switch(i[c]){case"0":s[c]=u[c]/2;break;case"1":s[c]=l[c]-u[c]/2;break;case"0.5":s[c]=l[c]/2}r.attr("x",s[0]).attr("y",s[1])}function l(t,e){var n={},r=[];e=e.filter((function(t){return"correct"==t.linkType||"incorrect"==t.linkType||"extra"==t.linkType})),t.selectAll("[link-type=extra]").remove();for(var o=0;o0&&void 0!==arguments[0]?arguments[0]:{},e={width:300,height:300,nucleotideRadius:5,rnaEdgePadding:1,labelInterval:10,showNucleotideLabels:!0,startNucleotideNumber:1,bundleExternalLinks:!1,rnaLayout:"simple",namePosition:"0 0"};function n(t){t.each((function(t){d3.select(this).attr("transform",(function(t){return"translate("+t.x+","+t.y+")"})).append("rect").attr("fill","transparent").attr("width",(function(t){return Math.max(0,t.dx)})).attr("height",(function(t){return Math.max(0,t.dy)}));var n=T(e).width(Math.max(0,t.dx)).height(Math.max(0,t.dy));"structure"in t&&d3.select(this).call(n)}))}e=Object.assign(e,t);var r=function(t){t.each((function(t){console.log("data:",t);var r=d3.layout.treemap().size([e.width,e.height]).sticky(!1).value((function(t){return t.size}));d3.select(this).append("g").classed("rnatreemap",!0).datum(t).selectAll(".treemapnode").data(r.nodes).enter().append("g").classed("treemapnode",!0).call(n)}))};return r.width=function(t){return arguments.length?(e.width=t,r):e.width},r.height=function(t){return arguments.length?(e.height=t,r):e.height},r.showNucleotideLabels=function(t){return arguments.length?(e.showNucleotideLabels=t,r):e.showNucleotideLabels},r.rnaEdgePadding=function(t){return arguments.length?(e.rnaEdgePadding=t,r):e.rnaEdgePadding},r.nucleotideRadius=function(t){return arguments.length?(e.nucleotideRadius=t,r):e.nucleotideRadius},r.labelInterval=function(t){return arguments.length?(e.labelInterval=t,r):e.labelInterval},r.showNucleotideLabels=function(t){return arguments.length?(e.showNucleotideLabels=t,r):e.showNucleotideLabels},r.startNucleotideNumber=function(t){return arguments.length?(e.startNucleotideNumber=t,r):e.startNucleotideNumber},r.bundleExternalLinks=function(t){return arguments.length?(e.bundleExternalLinks=t,r):e.bundleExternalLinks},r.rnaLayout=function(t){return arguments.length?(e.rnaLayout=t,r):e.rnaLayout},r.namePosition=function(t){return arguments.length?(e.namePosition=t,r):e.namePosition},r.zoom=function(t){return arguments.length?(e.zoom=t,r):e.zoom},r}E.prototype.naview_xy_coordinates=function(t){var e,n=[],r=[];if(0===t.length||0===t[0])return 0;this.nbase=t[0],this.bases=[];for(var o=0;oe&&n++;0==n&&(this.bases[1].setMate(this.nbase),this.bases[this.nbase].setMate(1))},E.prototype.find_regions=function(){var t,e=null,n=null;t=this.nbase+1;var r=[];for(e=0;ethis.nbase&&(e=0)}while(e!=t);return r},E.prototype.find_central_loop=function(){var t=new w.r,e=null,n=null,r=null;for(A.bind(this)(),e=0,n=-1,r=0;re?(n=t.getDepth(),e=t.getNconnection(),this.root=t):t.getDepth()>n&&t.getNconnection()==e&&(n=t.getDepth(),this.root=t)},E.prototype.traverse_loop=function(t,e){var n,r,o,i,s,a,u,l,c,f,d,h,p,g,y,m,b,v,k,x,w,E,A,N,L,T,_,M,S,B,I,P,R,C,U,O,X,Y,q,D,F,z,V,j,$,W,G,J,H,K,Z,Q,tt,et,nt,rt,ot,it,st,at,ut,lt,ct,ft,dt,ht,pt,gt,yt,mt=0;a=2*Math.PI/(this.nbase+1),v=null,B=-1;var bt=0;for(A=0;null!=(m=t.getConnection(bt));bt++,A++)n=-Math.sin(a*m.getStart()),r=Math.cos(a*m.getStart()),o=-Math.sin(a*m.getEnd()),i=Math.cos(a*m.getEnd())-r,s=n-o,u=Math.sqrt(i*i+s*s),m.setXrad(i/u),m.setYrad(s/u),m.setAngle(Math.atan2(s,i)),m.getAngle()<0&&m.setAngle(m.getAngle()+2*Math.PI),null!=e&&e.getRegion()==m.getRegion()&&(v=m,B=A);t:for(;;){this.determine_radius(t,this.lencut),l=t.getRadius()/this.RADIUS_REDUCTION_FACTOR,null==e?c=f=0:(d=(this.bases[v.getStart()].getX()+this.bases[v.getEnd()].getX())/2,h=(this.bases[v.getStart()].getY()+this.bases[v.getEnd()].getY())/2,c=d-l*v.getXrad(),f=h-l*v.getYrad()),_=-1==B?0:B,m=t.getConnection(_),T=0,I=!1;do{if((w=_-1)<0&&(w=t.getNconnection()-1),k=t.getConnection(w),this.connected_connection(k,m)?(_=w,m=k):I=!0,++T>t.getNconnection()){for(L=-1,A=0;A=t.getNconnection()&&(w=0),m=t.getConnection(A),(dt=(b=t.getConnection(w)).getAngle()-m.getAngle())<0&&(dt+=2*Math.PI),dt>L&&(L=dt,mt=A);M=mt,(_=mt+1)>=t.getNconnection()&&(_=0),(m=t.getConnection(M)).setBroken(!0),I=!0}}while(!I);for(P=!1,W=_;!P;){for(T=0,I=!1,M=_,R=!1;!I;)if(m=t.getConnection(M),M==B&&(R=!0),(w=M+1)>=t.getNconnection()&&(w=0),b=t.getConnection(w),this.connected_connection(m,b)){if(++T>=t.getNconnection())break;M=w}else I=!0;for(A=G=J=S=this.find_ic_middle(_,M,e,v,t),I=!1,K=0;!I;)(A=K<0?G:0==K?S:J)>=0&&(m=t.getConnection(A),null!=e&&v==m||(0==K?(p=m.getAngle()-Math.asin(.5/l),g=m.getAngle()+Math.asin(.5/l),this.bases[m.getStart()].setX(c+l*Math.cos(p)),this.bases[m.getStart()].setY(f+l*Math.sin(p)),this.bases[m.getEnd()].setX(c+l*Math.cos(g)),this.bases[m.getEnd()].setY(f+l*Math.sin(g))):K<0?((w=A+1)>=t.getNconnection()&&(w=0),m=t.getConnection(A),b=t.getConnection(w),nt=m.getXrad(),rt=m.getYrad(),dt=(m.getAngle()+b.getAngle())/2,m.getAngle()>b.getAngle()&&(dt-=Math.PI),st=Math.cos(dt),lt=Math.sin(dt),ct=-st,(N=b.getAngle()-m.getAngle())<0&&(N+=2*Math.PI),ft=m.isExtruded()?N<=Math.PI/2?2:1.5:1,this.bases[m.getEnd()].setX(this.bases[b.getStart()].getX()+ft*lt),this.bases[m.getEnd()].setY(this.bases[b.getStart()].getY()+ft*ct),this.bases[m.getStart()].setX(this.bases[m.getEnd()].getX()+rt),this.bases[m.getStart()].setY(this.bases[m.getEnd()].getY()-nt)):((w=A-1)<0&&(w=t.getNconnection()-1),m=t.getConnection(w),ot=(b=t.getConnection(A)).getXrad(),it=b.getYrad(),dt=(m.getAngle()+b.getAngle())/2,m.getAngle()>b.getAngle()&&(dt-=Math.PI),st=Math.cos(dt),lt=-Math.sin(dt),ct=st,(N=b.getAngle()-m.getAngle())<0&&(N+=2*Math.PI),ft=m.isExtruded()?N<=Math.PI/2?2:1.5:1,this.bases[b.getStart()].setX(this.bases[m.getEnd()].getX()+ft*lt),this.bases[b.getStart()].setY(this.bases[m.getEnd()].getY()+ft*ct),this.bases[b.getEnd()].setX(this.bases[b.getStart()].getX()-it),this.bases[b.getEnd()].setY(this.bases[b.getStart()].getY()+ot)))),K<0?(J==M?J=-1:J>=0&&++J>=t.getNconnection()&&(J=0),K=1):(G==_?G=-1:G>=0&&--G<0&&(G=t.getNconnection()-1),K=-1),I=-1==G&&-1==J;if((H=M+1)>=t.getNconnection()&&(H=0),M!=_&&(_!=W||H!=W))if(m=t.getConnection(_),b=t.getConnection(M),Q=this.bases[b.getEnd()].getX()-this.bases[m.getStart()].getX(),tt=this.bases[b.getEnd()].getY()-this.bases[m.getStart()].getY(),U=this.bases[m.getStart()].getX()+Q/2,O=this.bases[m.getStart()].getY()+tt/2,q=Q/(et=Math.sqrt(Q*Q+tt*tt)),D=tt/et,F=c-U,z=f-O,X=(V=(F/=et=Math.sqrt(Q*Q+tt*tt))*q+(z/=et)*D)*q-F,Y=V*D-z,X/=et=Math.sqrt(X*X+Y*Y),Y/=et,Q=this.bases[m.getStart()].getX()-c,tt=this.bases[m.getStart()].getY()-f,(dt=Math.atan2(tt,Q))<0&&(dt+=2*Math.PI),Q=this.bases[b.getEnd()].getX()-c,tt=this.bases[b.getEnd()].getY()-f,(ht=Math.atan2(tt,Q))<0&&(ht+=2*Math.PI),htMath.PI?-1:1)*l*X,$=f+C*l*Y,R)c-=j-U,f-=$-O;else for(A=_;x=(m=t.getConnection(A)).getStart(),this.bases[x].setX(this.bases[x].getX()+j-U),this.bases[x].setY(this.bases[x].getY()+$-O),x=m.getEnd(),this.bases[x].setX(this.bases[x].getX()+j-U),this.bases[x].setY(this.bases[x].getY()+$-O),A!=M;)++A>=t.getNconnection()&&(A=0);P=(_=H)==W}for(A=0;A=t.getNconnection()&&(w=0),b=t.getConnection(w),Q=this.bases[m.getEnd()].getX()-c,tt=this.bases[m.getEnd()].getY()-f,ut=Math.sqrt(Q*Q+tt*tt),(dt=Math.atan2(tt,Q))<0&&(dt+=2*Math.PI),Q=this.bases[b.getStart()].getX()-c,tt=this.bases[b.getStart()].getY()-f,at=Math.sqrt(Q*Q+tt*tt),(ht=Math.atan2(tt,Q))<0&&(ht+=2*Math.PI),htMath.PI)if(m.isExtruded())console.log("Warning from traverse_loop. Loop "+t.getNumber()+" has crossed regions\n");else if(b.getStart()-m.getEnd()!=1){m.setExtruded(!0);continue t}if(m.isExtruded())this.construct_extruded_segment(m,b);else for((E=b.getStart()-m.getEnd())<0&&(E+=this.nbase+1),a=Z/E,w=1;wthis.nbase&&(x-=this.nbase+1),et=ut+(at-ut)*((y=dt+w*a)-dt)/Z,this.bases[x].setX(c+et*Math.cos(y)),this.bases[x].setY(f+et*Math.sin(y))}break}for(A=0;A=t.getNconnection()&&(w=0),m=t.getConnection(A),b=t.getConnection(w),E+=2,pt+=this.bases[m.getStart()].getX()+this.bases[m.getEnd()].getX(),gt+=this.bases[m.getStart()].getY()+this.bases[m.getEnd()].getY(),!m.isExtruded())for(w=m.getEnd()+1;w!=b.getStart();w++)w>this.nbase&&(w-=this.nbase+1),E++,pt+=this.bases[w].getX(),gt+=this.bases[w].getY();t.setX(pt/E),t.setY(gt/E)},E.prototype.determine_radius=function(t,e){var n,r,o,i,s,a,u,l,c,f,d,h=0,p=new v.Connection,g=new v.Connection,y=.7071068;do{for(n=1e10,s=0,i=0,l=0;l=t.getNconnection()&&(c=0),g=t.getConnection(c),f=p.getEnd(),(d=g.getStart())1&&(n=u,h=l);(a=i/s)0?a=t.getRadius():t.setRadius(a)},E.prototype.find_ic_middle=function(t,e,n,r,o){var i,s,a,u,l;for(i=0,s=-1,a=t,l=!1;!l;)i++>2*o.getNconnection()&&console.log("Infinite loop in 'find_ic_middle'"),null!=n&&o.getConnection(a)==r&&(s=a),l=a==e,++a>=o.getNconnection()&&(a=0);if(-1==s){for(u=1,a=t;u<(i+1)/2;u++)++a>=o.getNconnection()&&(a=0);s=a}return s},E.prototype.construct_extruded_segment=function(t,e){var n,r,o,i,s,a,u,l,c,f,d,h,p,g,y,m,b,v;if(n=t.getAngle(),(o=r=e.getAngle())=1.5&&d<=Math.PI/2&&((m=p+1)>this.nbase&&(m-=this.nbase+1),(b=g-1)<0&&(b+=this.nbase+1),this.bases[m].setX(this.bases[p].getX()+.5*s),this.bases[m].setY(this.bases[p].getY()+.5*a),this.bases[b].setX(this.bases[g].getX()-.5*s),this.bases[b].setY(this.bases[g].getY()-.5*a),p=m,g=b);do{v=!1,this.construct_circle_segment(p,g),(m=p+1)>this.nbase&&(m-=this.nbase+1),s=this.bases[m].getX()-this.bases[p].getX(),a=this.bases[m].getY()-this.bases[p].getY(),(u=Math.atan2(a,s))<0&&(u+=2*Math.PI),(h=u-n)<0&&(h+=2*Math.PI),h>Math.PI&&(v=!0),(b=g-1)<0&&(b+=this.nbase+1),s=this.bases[b].getX()-this.bases[g].getX(),a=this.bases[b].getY()-this.bases[g].getY(),(l=Math.atan2(a,s))<0&&(l+=2*Math.PI),(h=r-l)<0&&(h+=2*Math.PI),h>Math.PI&&(v=!0),v&&(c=this.minf2(i,n+.5),this.bases[m].setX(this.bases[p].getX()+Math.cos(c)),this.bases[m].setY(this.bases[p].getY()+Math.sin(c)),p=m,c=this.maxf2(i,o-.5),this.bases[b].setX(this.bases[g].getX()+Math.cos(c)),this.bases[b].setY(this.bases[g].getY()+Math.sin(c)),g=b,y-=2)}while(v&&y>1)}},E.prototype.construct_circle_segment=function(t,e){var n,r,o,i,s,a,u,l,c,f,d,h,p,g,y;if(n=this.bases[e].getX()-this.bases[t].getX(),r=this.bases[e].getY()-this.bases[t].getY(),o=Math.sqrt(n*n+r*r),(p=e-t)<0&&(p+=this.nbase+1),o>=p)for(n/=o,r/=o,g=1;gthis.nbase&&(y-=this.nbase+1),this.bases[y].setX(this.bases[t].getX()+n*g/p),this.bases[y].setY(this.bases[t].getY()+r*g/p);else for(this.find_center_for_arc(p-1,o),n/=o,r/=o,i=this.bases[t].getX()+n*o/2,s=this.bases[t].getY()+r*o/2,a=r,u=-n,l=i+this._h*a,c=s+this._h*u,f=this.bases[t].getX()-l,d=this.bases[t].getY()-c,o=Math.sqrt(f*f+d*d),h=Math.atan2(d,f),g=1;gthis.nbase&&(y-=this.nbase+1),this.bases[y].setX(l+o*Math.cos(h+g*this.angleinc)),this.bases[y].setY(c+o*Math.sin(h+g*this.angleinc))},E.prototype.find_center_for_arc=function(t,e){var n,r,o,i,s,a,u,l;o=-(r=(t+1)/Math.PI)-e/(t+1.000001-e),e<1&&(o=0),l=0;do{n=(r+o)/2,s=1-.5/((i=Math.sqrt(n*n+e*e/4))*i),Math.abs(s)>1&&console.log("Unexpected large magnitude discriminant = "+s+" "+i),(u=(a=Math.acos(s))*(t+1)+2*Math.acos(n/i)-2*Math.PI)>0?o=n:r=n}while(Math.abs(u)>1e-4&&++l=this.MAXITER&&(noIterationFailureYet&&(console.log("Iteration failed in find_center_for_arc"),noIterationFailureYet=!1),n=0,a=0),this._h=n,this.angleinc=a},E.prototype.generate_region=function(t){var e,n,r,o,i,s;for(s=t.getRegion(),e=0,t.getStart()==s.getStart1()?(n=s.getStart1(),r=s.getEnd1()):(n=s.getStart2(),r=s.getEnd2()),(this.bases[t.getStart()].getX()>this.ANUM-100||this.bases[t.getEnd()].getX()>this.ANUM-100)&&console.log("Bad region passed to generate_region. Coordinates not defined."),o=n+1;o<=r;o++)e++,this.bases[o].setX(this.bases[t.getStart()].getX()+this.HELIX_FACTOR*e*t.getXrad()),this.bases[o].setY(this.bases[t.getStart()].getY()+this.HELIX_FACTOR*e*t.getYrad()),i=this.bases[o].getMate(),this.bases[i].setX(this.bases[t.getEnd()].getX()+this.HELIX_FACTOR*e*t.getXrad()),this.bases[i].setY(this.bases[t.getEnd()].getY()+this.HELIX_FACTOR*e*t.getYrad())},E.prototype.minf2=function(t,e){return te?t:e},E.prototype.connected_connection=function(t,e){return!!t.isExtruded()||t.getEnd()+1==e.getStart()}})(),i})()})); +!function(t,e){"object"==typeof exports&&"object"==typeof module?module.exports=e(require("d3")):"function"==typeof define&&define.amd?define(["d3"],e):"object"==typeof exports?exports.fornac=e(require("d3")):t.fornac=e(t.d3)}(self,(t=>(()=>{var e={332:(t,e,n)=>{"use strict";n.r(e),n.d(e,{Connection:()=>i});var r=n(326),o=n(980);function i(){this.loop=new r.F,this.region=new o.T,this.start=null,this.end=null,this.xrad=null,this.yrad=null,this.angle=null,this.extruded=null,this.broken=null,this._isNull=!1}i.prototype.isNull=function(){return this._isNull},i.prototype.setNull=function(t){this._isNull=t},i.prototype.getLoop=function(){return this.loop},i.prototype.setLoop=function(t){this.loop=t},i.prototype.getRegion=function(){return this.region},i.prototype.setRegion=function(t){this.region=t},i.prototype.getStart=function(){return this.start},i.prototype.setStart=function(t){this.start=t},i.prototype.getEnd=function(){return this.end},i.prototype.setEnd=function(t){this.end=t},i.prototype.getXrad=function(){return this.xrad},i.prototype.setXrad=function(t){this.xrad=t},i.prototype.getYrad=function(){return this.yrad},i.prototype.setYrad=function(t){this.yrad=t},i.prototype.getAngle=function(){return this.angle},i.prototype.setAngle=function(t){this.angle=t},i.prototype.isExtruded=function(){return this.extruded},i.prototype.setExtruded=function(t){this.extruded=t},i.prototype.isBroken=function(){return this.broken},i.prototype.setBroken=function(t){this.broken=t}},326:(t,e,n)=>{"use strict";n.d(e,{F:()=>o});var r=n(332);function o(){this.nconnection=null,this.connections=[],this._connections=[],this.number=null,this.depth=null,this.mark=null,this.x=null,this.y=null,this.radius=null}o.prototype.getNconnection=function(){return this.nconnection},o.prototype.setNconnection=function(t){this.nconnection=t},o.prototype.setConnection=function(t,e){null!=e?this._connections[t]=e:(this._connections[t]||(this._connections[t]=new r.Connection),this._connections[t].setNull(!0))},o.prototype.getConnection=function(t){var e=n(332);this._connections[t]||(this._connections[t]=new e);var r=this._connections[t];return r.isNull()?null:r},o.prototype.addConnection=function(t,e){this._connections.push(e)},o.prototype.getNumber=function(){return this.number},o.prototype.setNumber=function(t){this.number=t},o.prototype.getDepth=function(){return this.depth},o.prototype.setDepth=function(t){this.depth=t},o.prototype.isMark=function(){return this.mark},o.prototype.setMark=function(t){this.mark=t},o.prototype.getX=function(){return this.x},o.prototype.setX=function(t){this.x=t},o.prototype.getY=function(){return this.y},o.prototype.setY=function(t){this.y=t},o.prototype.getRadius=function(){return this.radius},o.prototype.setRadius=function(t){this.radius=t}},980:(t,e,n)=>{"use strict";function r(){this._start1=null,this._end1=null,this._start2=null,this._end2=null}n.d(e,{T:()=>r}),r.prototype.getStart1=function(){return this._start1},r.prototype.setStart1=function(t){this._start1=t},r.prototype.getEnd1=function(){return this._end1},r.prototype.setEnd1=function(t){this._end1=t},r.prototype.getStart2=function(){return this._start2},r.prototype.setStart2=function(t){this._start2=t},r.prototype.getEnd2=function(){return this._end2},r.prototype.setEnd2=function(t){this._end2=t}},526:(t,e)=>{"use strict";e.byteLength=function(t){var e=a(t),n=e[0],r=e[1];return 3*(n+r)/4-r},e.toByteArray=function(t){var e,n,i=a(t),s=i[0],u=i[1],l=new o(function(t,e,n){return 3*(e+n)/4-n}(0,s,u)),c=0,f=u>0?s-4:s;for(n=0;n>16&255,l[c++]=e>>8&255,l[c++]=255&e;return 2===u&&(e=r[t.charCodeAt(n)]<<2|r[t.charCodeAt(n+1)]>>4,l[c++]=255&e),1===u&&(e=r[t.charCodeAt(n)]<<10|r[t.charCodeAt(n+1)]<<4|r[t.charCodeAt(n+2)]>>2,l[c++]=e>>8&255,l[c++]=255&e),l},e.fromByteArray=function(t){for(var e,r=t.length,o=r%3,i=[],s=16383,a=0,l=r-o;al?l:a+s));return 1===o?(e=t[r-1],i.push(n[e>>2]+n[e<<4&63]+"==")):2===o&&(e=(t[r-2]<<8)+t[r-1],i.push(n[e>>10]+n[e>>4&63]+n[e<<2&63]+"=")),i.join("")};for(var n=[],r=[],o="undefined"!=typeof Uint8Array?Uint8Array:Array,i="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/",s=0;s<64;++s)n[s]=i[s],r[i.charCodeAt(s)]=s;function a(t){var e=t.length;if(e%4>0)throw new Error("Invalid string. Length must be a multiple of 4");var n=t.indexOf("=");return-1===n&&(n=e),[n,n===e?0:4-n%4]}function u(t,e,r){for(var o,i,s=[],a=e;a>18&63]+n[i>>12&63]+n[i>>6&63]+n[63&i]);return s.join("")}r["-".charCodeAt(0)]=62,r["_".charCodeAt(0)]=63},287:(t,e,n)=>{"use strict";const r=n(526),o=n(251),i="function"==typeof Symbol&&"function"==typeof Symbol.for?Symbol.for("nodejs.util.inspect.custom"):null;e.hp=u,e.IS=50;const s=2147483647;function a(t){if(t>s)throw new RangeError('The value "'+t+'" is invalid for option "size"');const e=new Uint8Array(t);return Object.setPrototypeOf(e,u.prototype),e}function u(t,e,n){if("number"==typeof t){if("string"==typeof e)throw new TypeError('The "string" argument must be of type string. Received type number');return f(t)}return l(t,e,n)}function l(t,e,n){if("string"==typeof t)return function(t,e){if("string"==typeof e&&""!==e||(e="utf8"),!u.isEncoding(e))throw new TypeError("Unknown encoding: "+e);const n=0|g(t,e);let r=a(n);const o=r.write(t,e);return o!==n&&(r=r.slice(0,o)),r}(t,e);if(ArrayBuffer.isView(t))return function(t){if(J(t,Uint8Array)){const e=new Uint8Array(t);return h(e.buffer,e.byteOffset,e.byteLength)}return d(t)}(t);if(null==t)throw new TypeError("The first argument must be one of type string, Buffer, ArrayBuffer, Array, or Array-like Object. Received type "+typeof t);if(J(t,ArrayBuffer)||t&&J(t.buffer,ArrayBuffer))return h(t,e,n);if("undefined"!=typeof SharedArrayBuffer&&(J(t,SharedArrayBuffer)||t&&J(t.buffer,SharedArrayBuffer)))return h(t,e,n);if("number"==typeof t)throw new TypeError('The "value" argument must not be of type number. Received type number');const r=t.valueOf&&t.valueOf();if(null!=r&&r!==t)return u.from(r,e,n);const o=function(t){if(u.isBuffer(t)){const e=0|p(t.length),n=a(e);return 0===n.length||t.copy(n,0,0,e),n}return void 0!==t.length?"number"!=typeof t.length||H(t.length)?a(0):d(t):"Buffer"===t.type&&Array.isArray(t.data)?d(t.data):void 0}(t);if(o)return o;if("undefined"!=typeof Symbol&&null!=Symbol.toPrimitive&&"function"==typeof t[Symbol.toPrimitive])return u.from(t[Symbol.toPrimitive]("string"),e,n);throw new TypeError("The first argument must be one of type string, Buffer, ArrayBuffer, Array, or Array-like Object. Received type "+typeof t)}function c(t){if("number"!=typeof t)throw new TypeError('"size" argument must be of type number');if(t<0)throw new RangeError('The value "'+t+'" is invalid for option "size"')}function f(t){return c(t),a(t<0?0:0|p(t))}function d(t){const e=t.length<0?0:0|p(t.length),n=a(e);for(let r=0;r=s)throw new RangeError("Attempt to allocate Buffer larger than maximum size: 0x"+s.toString(16)+" bytes");return 0|t}function g(t,e){if(u.isBuffer(t))return t.length;if(ArrayBuffer.isView(t)||J(t,ArrayBuffer))return t.byteLength;if("string"!=typeof t)throw new TypeError('The "string" argument must be one of type string, Buffer, or ArrayBuffer. Received type '+typeof t);const n=t.length,r=arguments.length>2&&!0===arguments[2];if(!r&&0===n)return 0;let o=!1;for(;;)switch(e){case"ascii":case"latin1":case"binary":return n;case"utf8":case"utf-8":return $(t).length;case"ucs2":case"ucs-2":case"utf16le":case"utf-16le":return 2*n;case"hex":return n>>>1;case"base64":return W(t).length;default:if(o)return r?-1:$(t).length;e=(""+e).toLowerCase(),o=!0}}function y(t,e,n){let r=!1;if((void 0===e||e<0)&&(e=0),e>this.length)return"";if((void 0===n||n>this.length)&&(n=this.length),n<=0)return"";if((n>>>=0)<=(e>>>=0))return"";for(t||(t="utf8");;)switch(t){case"hex":return I(this,e,n);case"utf8":case"utf-8":return L(this,e,n);case"ascii":return _(this,e,n);case"latin1":case"binary":return M(this,e,n);case"base64":return N(this,e,n);case"ucs2":case"ucs-2":case"utf16le":case"utf-16le":return S(this,e,n);default:if(r)throw new TypeError("Unknown encoding: "+t);t=(t+"").toLowerCase(),r=!0}}function m(t,e,n){const r=t[e];t[e]=t[n],t[n]=r}function b(t,e,n,r,o){if(0===t.length)return-1;if("string"==typeof n?(r=n,n=0):n>2147483647?n=2147483647:n<-2147483648&&(n=-2147483648),H(n=+n)&&(n=o?0:t.length-1),n<0&&(n=t.length+n),n>=t.length){if(o)return-1;n=t.length-1}else if(n<0){if(!o)return-1;n=0}if("string"==typeof e&&(e=u.from(e,r)),u.isBuffer(e))return 0===e.length?-1:v(t,e,n,r,o);if("number"==typeof e)return e&=255,"function"==typeof Uint8Array.prototype.indexOf?o?Uint8Array.prototype.indexOf.call(t,e,n):Uint8Array.prototype.lastIndexOf.call(t,e,n):v(t,[e],n,r,o);throw new TypeError("val must be string, number or Buffer")}function v(t,e,n,r,o){let i,s=1,a=t.length,u=e.length;if(void 0!==r&&("ucs2"===(r=String(r).toLowerCase())||"ucs-2"===r||"utf16le"===r||"utf-16le"===r)){if(t.length<2||e.length<2)return-1;s=2,a/=2,u/=2,n/=2}function l(t,e){return 1===s?t[e]:t.readUInt16BE(e*s)}if(o){let r=-1;for(i=n;ia&&(n=a-u),i=n;i>=0;i--){let n=!0;for(let r=0;ro&&(r=o):r=o;const i=e.length;let s;for(r>i/2&&(r=i/2),s=0;s>8,o=n%256,i.push(o),i.push(r);return i}(e,t.length-n),t,n,r)}function N(t,e,n){return 0===e&&n===t.length?r.fromByteArray(t):r.fromByteArray(t.slice(e,n))}function L(t,e,n){n=Math.min(t.length,n);const r=[];let o=e;for(;o239?4:e>223?3:e>191?2:1;if(o+s<=n){let n,r,a,u;switch(s){case 1:e<128&&(i=e);break;case 2:n=t[o+1],128==(192&n)&&(u=(31&e)<<6|63&n,u>127&&(i=u));break;case 3:n=t[o+1],r=t[o+2],128==(192&n)&&128==(192&r)&&(u=(15&e)<<12|(63&n)<<6|63&r,u>2047&&(u<55296||u>57343)&&(i=u));break;case 4:n=t[o+1],r=t[o+2],a=t[o+3],128==(192&n)&&128==(192&r)&&128==(192&a)&&(u=(15&e)<<18|(63&n)<<12|(63&r)<<6|63&a,u>65535&&u<1114112&&(i=u))}}null===i?(i=65533,s=1):i>65535&&(i-=65536,r.push(i>>>10&1023|55296),i=56320|1023&i),r.push(i),o+=s}return function(t){const e=t.length;if(e<=T)return String.fromCharCode.apply(String,t);let n="",r=0;for(;rr.length?(u.isBuffer(e)||(e=u.from(e)),e.copy(r,o)):Uint8Array.prototype.set.call(r,e,o);else{if(!u.isBuffer(e))throw new TypeError('"list" argument must be an Array of Buffers');e.copy(r,o)}o+=e.length}return r},u.byteLength=g,u.prototype._isBuffer=!0,u.prototype.swap16=function(){const t=this.length;if(t%2!=0)throw new RangeError("Buffer size must be a multiple of 16-bits");for(let e=0;en&&(t+=" ... "),""},i&&(u.prototype[i]=u.prototype.inspect),u.prototype.compare=function(t,e,n,r,o){if(J(t,Uint8Array)&&(t=u.from(t,t.offset,t.byteLength)),!u.isBuffer(t))throw new TypeError('The "target" argument must be one of type Buffer or Uint8Array. Received type '+typeof t);if(void 0===e&&(e=0),void 0===n&&(n=t?t.length:0),void 0===r&&(r=0),void 0===o&&(o=this.length),e<0||n>t.length||r<0||o>this.length)throw new RangeError("out of range index");if(r>=o&&e>=n)return 0;if(r>=o)return-1;if(e>=n)return 1;if(this===t)return 0;let i=(o>>>=0)-(r>>>=0),s=(n>>>=0)-(e>>>=0);const a=Math.min(i,s),l=this.slice(r,o),c=t.slice(e,n);for(let t=0;t>>=0,isFinite(n)?(n>>>=0,void 0===r&&(r="utf8")):(r=n,n=void 0)}const o=this.length-e;if((void 0===n||n>o)&&(n=o),t.length>0&&(n<0||e<0)||e>this.length)throw new RangeError("Attempt to write outside buffer bounds");r||(r="utf8");let i=!1;for(;;)switch(r){case"hex":return k(this,t,e,n);case"utf8":case"utf-8":return x(this,t,e,n);case"ascii":case"latin1":case"binary":return w(this,t,e,n);case"base64":return E(this,t,e,n);case"ucs2":case"ucs-2":case"utf16le":case"utf-16le":return A(this,t,e,n);default:if(i)throw new TypeError("Unknown encoding: "+r);r=(""+r).toLowerCase(),i=!0}},u.prototype.toJSON=function(){return{type:"Buffer",data:Array.prototype.slice.call(this._arr||this,0)}};const T=4096;function _(t,e,n){let r="";n=Math.min(t.length,n);for(let o=e;or)&&(n=r);let o="";for(let r=e;rn)throw new RangeError("Trying to access beyond buffer length")}function P(t,e,n,r,o,i){if(!u.isBuffer(t))throw new TypeError('"buffer" argument must be a Buffer instance');if(e>o||et.length)throw new RangeError("Index out of range")}function R(t,e,n,r,o){D(e,r,o,t,n,7);let i=Number(e&BigInt(4294967295));t[n++]=i,i>>=8,t[n++]=i,i>>=8,t[n++]=i,i>>=8,t[n++]=i;let s=Number(e>>BigInt(32)&BigInt(4294967295));return t[n++]=s,s>>=8,t[n++]=s,s>>=8,t[n++]=s,s>>=8,t[n++]=s,n}function C(t,e,n,r,o){D(e,r,o,t,n,7);let i=Number(e&BigInt(4294967295));t[n+7]=i,i>>=8,t[n+6]=i,i>>=8,t[n+5]=i,i>>=8,t[n+4]=i;let s=Number(e>>BigInt(32)&BigInt(4294967295));return t[n+3]=s,s>>=8,t[n+2]=s,s>>=8,t[n+1]=s,s>>=8,t[n]=s,n+8}function U(t,e,n,r,o,i){if(n+r>t.length)throw new RangeError("Index out of range");if(n<0)throw new RangeError("Index out of range")}function O(t,e,n,r,i){return e=+e,n>>>=0,i||U(t,0,n,4),o.write(t,e,n,r,23,4),n+4}function X(t,e,n,r,i){return e=+e,n>>>=0,i||U(t,0,n,8),o.write(t,e,n,r,52,8),n+8}u.prototype.slice=function(t,e){const n=this.length;(t=~~t)<0?(t+=n)<0&&(t=0):t>n&&(t=n),(e=void 0===e?n:~~e)<0?(e+=n)<0&&(e=0):e>n&&(e=n),e>>=0,e>>>=0,n||B(t,e,this.length);let r=this[t],o=1,i=0;for(;++i>>=0,e>>>=0,n||B(t,e,this.length);let r=this[t+--e],o=1;for(;e>0&&(o*=256);)r+=this[t+--e]*o;return r},u.prototype.readUint8=u.prototype.readUInt8=function(t,e){return t>>>=0,e||B(t,1,this.length),this[t]},u.prototype.readUint16LE=u.prototype.readUInt16LE=function(t,e){return t>>>=0,e||B(t,2,this.length),this[t]|this[t+1]<<8},u.prototype.readUint16BE=u.prototype.readUInt16BE=function(t,e){return t>>>=0,e||B(t,2,this.length),this[t]<<8|this[t+1]},u.prototype.readUint32LE=u.prototype.readUInt32LE=function(t,e){return t>>>=0,e||B(t,4,this.length),(this[t]|this[t+1]<<8|this[t+2]<<16)+16777216*this[t+3]},u.prototype.readUint32BE=u.prototype.readUInt32BE=function(t,e){return t>>>=0,e||B(t,4,this.length),16777216*this[t]+(this[t+1]<<16|this[t+2]<<8|this[t+3])},u.prototype.readBigUInt64LE=Z((function(t){z(t>>>=0,"offset");const e=this[t],n=this[t+7];void 0!==e&&void 0!==n||V(t,this.length-8);const r=e+256*this[++t]+65536*this[++t]+this[++t]*2**24,o=this[++t]+256*this[++t]+65536*this[++t]+n*2**24;return BigInt(r)+(BigInt(o)<>>=0,"offset");const e=this[t],n=this[t+7];void 0!==e&&void 0!==n||V(t,this.length-8);const r=e*2**24+65536*this[++t]+256*this[++t]+this[++t],o=this[++t]*2**24+65536*this[++t]+256*this[++t]+n;return(BigInt(r)<>>=0,e>>>=0,n||B(t,e,this.length);let r=this[t],o=1,i=0;for(;++i=o&&(r-=Math.pow(2,8*e)),r},u.prototype.readIntBE=function(t,e,n){t>>>=0,e>>>=0,n||B(t,e,this.length);let r=e,o=1,i=this[t+--r];for(;r>0&&(o*=256);)i+=this[t+--r]*o;return o*=128,i>=o&&(i-=Math.pow(2,8*e)),i},u.prototype.readInt8=function(t,e){return t>>>=0,e||B(t,1,this.length),128&this[t]?-1*(255-this[t]+1):this[t]},u.prototype.readInt16LE=function(t,e){t>>>=0,e||B(t,2,this.length);const n=this[t]|this[t+1]<<8;return 32768&n?4294901760|n:n},u.prototype.readInt16BE=function(t,e){t>>>=0,e||B(t,2,this.length);const n=this[t+1]|this[t]<<8;return 32768&n?4294901760|n:n},u.prototype.readInt32LE=function(t,e){return t>>>=0,e||B(t,4,this.length),this[t]|this[t+1]<<8|this[t+2]<<16|this[t+3]<<24},u.prototype.readInt32BE=function(t,e){return t>>>=0,e||B(t,4,this.length),this[t]<<24|this[t+1]<<16|this[t+2]<<8|this[t+3]},u.prototype.readBigInt64LE=Z((function(t){z(t>>>=0,"offset");const e=this[t],n=this[t+7];void 0!==e&&void 0!==n||V(t,this.length-8);const r=this[t+4]+256*this[t+5]+65536*this[t+6]+(n<<24);return(BigInt(r)<>>=0,"offset");const e=this[t],n=this[t+7];void 0!==e&&void 0!==n||V(t,this.length-8);const r=(e<<24)+65536*this[++t]+256*this[++t]+this[++t];return(BigInt(r)<>>=0,e||B(t,4,this.length),o.read(this,t,!0,23,4)},u.prototype.readFloatBE=function(t,e){return t>>>=0,e||B(t,4,this.length),o.read(this,t,!1,23,4)},u.prototype.readDoubleLE=function(t,e){return t>>>=0,e||B(t,8,this.length),o.read(this,t,!0,52,8)},u.prototype.readDoubleBE=function(t,e){return t>>>=0,e||B(t,8,this.length),o.read(this,t,!1,52,8)},u.prototype.writeUintLE=u.prototype.writeUIntLE=function(t,e,n,r){t=+t,e>>>=0,n>>>=0,r||P(this,t,e,n,Math.pow(2,8*n)-1,0);let o=1,i=0;for(this[e]=255&t;++i>>=0,n>>>=0,r||P(this,t,e,n,Math.pow(2,8*n)-1,0);let o=n-1,i=1;for(this[e+o]=255&t;--o>=0&&(i*=256);)this[e+o]=t/i&255;return e+n},u.prototype.writeUint8=u.prototype.writeUInt8=function(t,e,n){return t=+t,e>>>=0,n||P(this,t,e,1,255,0),this[e]=255&t,e+1},u.prototype.writeUint16LE=u.prototype.writeUInt16LE=function(t,e,n){return t=+t,e>>>=0,n||P(this,t,e,2,65535,0),this[e]=255&t,this[e+1]=t>>>8,e+2},u.prototype.writeUint16BE=u.prototype.writeUInt16BE=function(t,e,n){return t=+t,e>>>=0,n||P(this,t,e,2,65535,0),this[e]=t>>>8,this[e+1]=255&t,e+2},u.prototype.writeUint32LE=u.prototype.writeUInt32LE=function(t,e,n){return t=+t,e>>>=0,n||P(this,t,e,4,4294967295,0),this[e+3]=t>>>24,this[e+2]=t>>>16,this[e+1]=t>>>8,this[e]=255&t,e+4},u.prototype.writeUint32BE=u.prototype.writeUInt32BE=function(t,e,n){return t=+t,e>>>=0,n||P(this,t,e,4,4294967295,0),this[e]=t>>>24,this[e+1]=t>>>16,this[e+2]=t>>>8,this[e+3]=255&t,e+4},u.prototype.writeBigUInt64LE=Z((function(t,e=0){return R(this,t,e,BigInt(0),BigInt("0xffffffffffffffff"))})),u.prototype.writeBigUInt64BE=Z((function(t,e=0){return C(this,t,e,BigInt(0),BigInt("0xffffffffffffffff"))})),u.prototype.writeIntLE=function(t,e,n,r){if(t=+t,e>>>=0,!r){const r=Math.pow(2,8*n-1);P(this,t,e,n,r-1,-r)}let o=0,i=1,s=0;for(this[e]=255&t;++o>>=0,!r){const r=Math.pow(2,8*n-1);P(this,t,e,n,r-1,-r)}let o=n-1,i=1,s=0;for(this[e+o]=255&t;--o>=0&&(i*=256);)t<0&&0===s&&0!==this[e+o+1]&&(s=1),this[e+o]=(t/i|0)-s&255;return e+n},u.prototype.writeInt8=function(t,e,n){return t=+t,e>>>=0,n||P(this,t,e,1,127,-128),t<0&&(t=255+t+1),this[e]=255&t,e+1},u.prototype.writeInt16LE=function(t,e,n){return t=+t,e>>>=0,n||P(this,t,e,2,32767,-32768),this[e]=255&t,this[e+1]=t>>>8,e+2},u.prototype.writeInt16BE=function(t,e,n){return t=+t,e>>>=0,n||P(this,t,e,2,32767,-32768),this[e]=t>>>8,this[e+1]=255&t,e+2},u.prototype.writeInt32LE=function(t,e,n){return t=+t,e>>>=0,n||P(this,t,e,4,2147483647,-2147483648),this[e]=255&t,this[e+1]=t>>>8,this[e+2]=t>>>16,this[e+3]=t>>>24,e+4},u.prototype.writeInt32BE=function(t,e,n){return t=+t,e>>>=0,n||P(this,t,e,4,2147483647,-2147483648),t<0&&(t=4294967295+t+1),this[e]=t>>>24,this[e+1]=t>>>16,this[e+2]=t>>>8,this[e+3]=255&t,e+4},u.prototype.writeBigInt64LE=Z((function(t,e=0){return R(this,t,e,-BigInt("0x8000000000000000"),BigInt("0x7fffffffffffffff"))})),u.prototype.writeBigInt64BE=Z((function(t,e=0){return C(this,t,e,-BigInt("0x8000000000000000"),BigInt("0x7fffffffffffffff"))})),u.prototype.writeFloatLE=function(t,e,n){return O(this,t,e,!0,n)},u.prototype.writeFloatBE=function(t,e,n){return O(this,t,e,!1,n)},u.prototype.writeDoubleLE=function(t,e,n){return X(this,t,e,!0,n)},u.prototype.writeDoubleBE=function(t,e,n){return X(this,t,e,!1,n)},u.prototype.copy=function(t,e,n,r){if(!u.isBuffer(t))throw new TypeError("argument should be a Buffer");if(n||(n=0),r||0===r||(r=this.length),e>=t.length&&(e=t.length),e||(e=0),r>0&&r=this.length)throw new RangeError("Index out of range");if(r<0)throw new RangeError("sourceEnd out of bounds");r>this.length&&(r=this.length),t.length-e>>=0,n=void 0===n?this.length:n>>>0,t||(t=0),"number"==typeof t)for(o=e;o=r+4;n-=3)e=`_${t.slice(n-3,n)}${e}`;return`${t.slice(0,n)}${e}`}function D(t,e,n,r,o,i){if(t>n||t3?0===e||e===BigInt(0)?`>= 0${r} and < 2${r} ** ${8*(i+1)}${r}`:`>= -(2${r} ** ${8*(i+1)-1}${r}) and < 2 ** ${8*(i+1)-1}${r}`:`>= ${e}${r} and <= ${n}${r}`,new Y.ERR_OUT_OF_RANGE("value",o,t)}!function(t,e,n){z(e,"offset"),void 0!==t[e]&&void 0!==t[e+n]||V(e,t.length-(n+1))}(r,o,i)}function z(t,e){if("number"!=typeof t)throw new Y.ERR_INVALID_ARG_TYPE(e,"number",t)}function V(t,e,n){if(Math.floor(t)!==t)throw z(t,n),new Y.ERR_OUT_OF_RANGE(n||"offset","an integer",t);if(e<0)throw new Y.ERR_BUFFER_OUT_OF_BOUNDS;throw new Y.ERR_OUT_OF_RANGE(n||"offset",`>= ${n?1:0} and <= ${e}`,t)}F("ERR_BUFFER_OUT_OF_BOUNDS",(function(t){return t?`${t} is outside of buffer bounds`:"Attempt to access memory outside buffer bounds"}),RangeError),F("ERR_INVALID_ARG_TYPE",(function(t,e){return`The "${t}" argument must be of type number. Received type ${typeof e}`}),TypeError),F("ERR_OUT_OF_RANGE",(function(t,e,n){let r=`The value of "${t}" is out of range.`,o=n;return Number.isInteger(n)&&Math.abs(n)>2**32?o=q(String(n)):"bigint"==typeof n&&(o=String(n),(n>BigInt(2)**BigInt(32)||n<-(BigInt(2)**BigInt(32)))&&(o=q(o)),o+="n"),r+=` It must be ${e}. Received ${o}`,r}),RangeError);const j=/[^+/0-9A-Za-z-_]/g;function $(t,e){let n;e=e||1/0;const r=t.length;let o=null;const i=[];for(let s=0;s55295&&n<57344){if(!o){if(n>56319){(e-=3)>-1&&i.push(239,191,189);continue}if(s+1===r){(e-=3)>-1&&i.push(239,191,189);continue}o=n;continue}if(n<56320){(e-=3)>-1&&i.push(239,191,189),o=n;continue}n=65536+(o-55296<<10|n-56320)}else o&&(e-=3)>-1&&i.push(239,191,189);if(o=null,n<128){if((e-=1)<0)break;i.push(n)}else if(n<2048){if((e-=2)<0)break;i.push(n>>6|192,63&n|128)}else if(n<65536){if((e-=3)<0)break;i.push(n>>12|224,n>>6&63|128,63&n|128)}else{if(!(n<1114112))throw new Error("Invalid code point");if((e-=4)<0)break;i.push(n>>18|240,n>>12&63|128,n>>6&63|128,63&n|128)}}return i}function W(t){return r.toByteArray(function(t){if((t=(t=t.split("=")[0]).trim().replace(j,"")).length<2)return"";for(;t.length%4!=0;)t+="=";return t}(t))}function G(t,e,n,r){let o;for(o=0;o=e.length||o>=t.length);++o)e[o+n]=t[o];return o}function J(t,e){return t instanceof e||null!=t&&null!=t.constructor&&null!=t.constructor.name&&t.constructor.name===e.name}function H(t){return t!=t}const K=function(){const t="0123456789abcdef",e=new Array(256);for(let n=0;n<16;++n){const r=16*n;for(let o=0;o<16;++o)e[r+o]=t[n]+t[o]}return e}();function Z(t){return"undefined"==typeof BigInt?Q:t}function Q(){throw new Error("BigInt not supported")}},722:t=>{t.exports={}},780:t=>{t.exports={nodeStrokeWidth:"0.8",directionArrowSize:"6",directionArrowWidth:"0.7",node:"fornac-node",directionArrow:"fornac-directionArrow",plot:"fornac-plot",selectedNode:"fornac-selectedNode",nodeLabel:"fornac-nodeLabel",link:"fornac-link",plotLabel:"fornac-plotLabel",transparent:"fornac-transparent",dragLine:"fornac-dragLine",mouseEventHelper:"fornac-mouseEventHelper"}},251:(t,e)=>{e.read=function(t,e,n,r,o){var i,s,a=8*o-r-1,u=(1<>1,c=-7,f=n?o-1:0,d=n?-1:1,h=t[e+f];for(f+=d,i=h&(1<<-c)-1,h>>=-c,c+=a;c>0;i=256*i+t[e+f],f+=d,c-=8);for(s=i&(1<<-c)-1,i>>=-c,c+=r;c>0;s=256*s+t[e+f],f+=d,c-=8);if(0===i)i=1-l;else{if(i===u)return s?NaN:1/0*(h?-1:1);s+=Math.pow(2,r),i-=l}return(h?-1:1)*s*Math.pow(2,i-r)},e.write=function(t,e,n,r,o,i){var s,a,u,l=8*i-o-1,c=(1<>1,d=23===o?Math.pow(2,-24)-Math.pow(2,-77):0,h=r?0:i-1,p=r?1:-1,g=e<0||0===e&&1/e<0?1:0;for(e=Math.abs(e),isNaN(e)||e===1/0?(a=isNaN(e)?1:0,s=c):(s=Math.floor(Math.log(e)/Math.LN2),e*(u=Math.pow(2,-s))<1&&(s--,u*=2),(e+=s+f>=1?d/u:d*Math.pow(2,1-f))*u>=2&&(s++,u/=2),s+f>=c?(a=0,s=c):s+f>=1?(a=(e*u-1)*Math.pow(2,o),s+=f):(a=e*Math.pow(2,f-1)*Math.pow(2,o),s=0));o>=8;t[n+h]=255&a,h+=p,a/=256,o-=8);for(s=s<0;t[n+h]=255&s,h+=p,s/=256,l-=8);t[n+h-p]|=128*g}},447:(t,e,n)=>{t.exports=n(845)},845:(t,e,n)=>{var r=n(287).hp,o=n(611),i=void 0!==r?t=>r.from(t).toString("base64"):t=>btoa(String.fromCharCode(...t)),s=void 0!==r?t=>r.from(t,"base64"):t=>Uint8Array.from(atob(t),(t=>t.charCodeAt(0)));e.encode=function(t){var e=o.parse(t);return i(e).replace(/\+/g,"-").replace(/\//g,"_").substring(0,22)},e.decode=function(t){var e=t.replace(/-/g,"+").replace(/_/g,"/")+"==";return o.stringify(s(e))},e.v4=function(){var t=o.v4(null,new Uint8Array(16));return i(t).replace(/\+/g,"-").replace(/\//g,"_").substring(0,22)},e.nice=function(){var t=o.v4(null,new Uint8Array(16));return t[0]=127&t[0],i(t).replace(/\+/g,"-").replace(/\//g,"_").substring(0,22)}},611:(t,e,n)=>{"use strict";var r;n.r(e),n.d(e,{NIL:()=>I,parse:()=>y,stringify:()=>c,v1:()=>g,v3:()=>N,v4:()=>L,v5:()=>M,validate:()=>a,version:()=>S});var o=new Uint8Array(16);function i(){if(!r&&!(r="undefined"!=typeof crypto&&crypto.getRandomValues&&crypto.getRandomValues.bind(crypto)||"undefined"!=typeof msCrypto&&"function"==typeof msCrypto.getRandomValues&&msCrypto.getRandomValues.bind(msCrypto)))throw new Error("crypto.getRandomValues() not supported. See https://github.com/uuidjs/uuid#getrandomvalues-not-supported");return r(o)}const s=/^(?:[0-9a-f]{8}-[0-9a-f]{4}-[1-5][0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}|00000000-0000-0000-0000-000000000000)$/i,a=function(t){return"string"==typeof t&&s.test(t)};for(var u=[],l=0;l<256;++l)u.push((l+256).toString(16).substr(1));const c=function(t){var e=arguments.length>1&&void 0!==arguments[1]?arguments[1]:0,n=(u[t[e+0]]+u[t[e+1]]+u[t[e+2]]+u[t[e+3]]+"-"+u[t[e+4]]+u[t[e+5]]+"-"+u[t[e+6]]+u[t[e+7]]+"-"+u[t[e+8]]+u[t[e+9]]+"-"+u[t[e+10]]+u[t[e+11]]+u[t[e+12]]+u[t[e+13]]+u[t[e+14]]+u[t[e+15]]).toLowerCase();if(!a(n))throw TypeError("Stringified UUID is invalid");return n};var f,d,h=0,p=0;const g=function(t,e,n){var r=e&&n||0,o=e||new Array(16),s=(t=t||{}).node||f,a=void 0!==t.clockseq?t.clockseq:d;if(null==s||null==a){var u=t.random||(t.rng||i)();null==s&&(s=f=[1|u[0],u[1],u[2],u[3],u[4],u[5]]),null==a&&(a=d=16383&(u[6]<<8|u[7]))}var l=void 0!==t.msecs?t.msecs:Date.now(),g=void 0!==t.nsecs?t.nsecs:p+1,y=l-h+(g-p)/1e4;if(y<0&&void 0===t.clockseq&&(a=a+1&16383),(y<0||l>h)&&void 0===t.nsecs&&(g=0),g>=1e4)throw new Error("uuid.v1(): Can't create more than 10M uuids/sec");h=l,p=g,d=a;var m=(1e4*(268435455&(l+=122192928e5))+g)%4294967296;o[r++]=m>>>24&255,o[r++]=m>>>16&255,o[r++]=m>>>8&255,o[r++]=255&m;var b=l/4294967296*1e4&268435455;o[r++]=b>>>8&255,o[r++]=255&b,o[r++]=b>>>24&15|16,o[r++]=b>>>16&255,o[r++]=a>>>8|128,o[r++]=255&a;for(var v=0;v<6;++v)o[r+v]=s[v];return e||c(o)},y=function(t){if(!a(t))throw TypeError("Invalid UUID");var e,n=new Uint8Array(16);return n[0]=(e=parseInt(t.slice(0,8),16))>>>24,n[1]=e>>>16&255,n[2]=e>>>8&255,n[3]=255&e,n[4]=(e=parseInt(t.slice(9,13),16))>>>8,n[5]=255&e,n[6]=(e=parseInt(t.slice(14,18),16))>>>8,n[7]=255&e,n[8]=(e=parseInt(t.slice(19,23),16))>>>8,n[9]=255&e,n[10]=(e=parseInt(t.slice(24,36),16))/1099511627776&255,n[11]=e/4294967296&255,n[12]=e>>>24&255,n[13]=e>>>16&255,n[14]=e>>>8&255,n[15]=255&e,n};function m(t,e,n){function r(t,r,o,i){if("string"==typeof t&&(t=function(t){t=unescape(encodeURIComponent(t));for(var e=[],n=0;n>>9<<4)+1}function v(t,e){var n=(65535&t)+(65535&e);return(t>>16)+(e>>16)+(n>>16)<<16|65535&n}function k(t,e,n,r,o,i){return v((s=v(v(e,t),v(r,i)))<<(a=o)|s>>>32-a,n);var s,a}function x(t,e,n,r,o,i,s){return k(e&n|~e&r,t,e,o,i,s)}function w(t,e,n,r,o,i,s){return k(e&r|n&~r,t,e,o,i,s)}function E(t,e,n,r,o,i,s){return k(e^n^r,t,e,o,i,s)}function A(t,e,n,r,o,i,s){return k(n^(e|~r),t,e,o,i,s)}const N=m("v3",48,(function(t){if("string"==typeof t){var e=unescape(encodeURIComponent(t));t=new Uint8Array(e.length);for(var n=0;n>5]>>>o%32&255,s=parseInt(r.charAt(i>>>4&15)+r.charAt(15&i),16);e.push(s)}return e}(function(t,e){t[e>>5]|=128<>5]|=(255&t[r/8])<>>32-e}const M=m("v5",80,(function(t){var e=[1518500249,1859775393,2400959708,3395469782],n=[1732584193,4023233417,2562383102,271733878,3285377520];if("string"==typeof t){var r=unescape(encodeURIComponent(t));t=[];for(var o=0;o>>0;v=b,b=m,m=_(y,30)>>>0,y=g,g=w}n[0]=n[0]+g>>>0,n[1]=n[1]+y>>>0,n[2]=n[2]+m>>>0,n[3]=n[3]+b>>>0,n[4]=n[4]+v>>>0}return[n[0]>>24&255,n[0]>>16&255,n[0]>>8&255,255&n[0],n[1]>>24&255,n[1]>>16&255,n[1]>>8&255,255&n[1],n[2]>>24&255,n[2]>>16&255,n[2]>>8&255,255&n[2],n[3]>>24&255,n[3]>>16&255,n[3]>>8&255,255&n[3],n[4]>>24&255,n[4]>>16&255,n[4]>>8&255,255&n[4]]})),I="00000000-0000-0000-0000-000000000000",S=function(t){if(!a(t))throw TypeError("Invalid UUID");return parseInt(t.substr(14,1),16)}},893:e=>{"use strict";e.exports=t}},n={};function o(t){var r=n[t];if(void 0!==r)return r.exports;var i=n[t]={exports:{}};return e[t](i,i.exports,o),i.exports}o.n=t=>{var e=t&&t.__esModule?()=>t.default:()=>t;return o.d(e,{a:e}),e},o.d=(t,e)=>{for(var n in e)o.o(e,n)&&!o.o(t,n)&&Object.defineProperty(t,n,{enumerable:!0,get:e[n]})},o.g=function(){if("object"==typeof globalThis)return globalThis;try{return this||new Function("return this")()}catch(t){if("object"==typeof window)return window}}(),o.o=(t,e)=>Object.prototype.hasOwnProperty.call(t,e),o.r=t=>{"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(t,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(t,"__esModule",{value:!0})},(()=>{var t;o.g.importScripts&&(t=o.g.location+"");var e=o.g.document;if(!t&&e&&(e.currentScript&&(t=e.currentScript.src),!t)){var n=e.getElementsByTagName("script");if(n.length)for(var r=n.length-1;r>-1&&(!t||!/^http(s?):/.test(t));)t=n[r--].src}if(!t)throw new Error("Automatic publicPath is not supported in this browser");t=t.replace(/#.*$/,"").replace(/\?.*$/,"").replace(/\/[^\/]+$/,"/"),o.p=t})();var i={};return(()=>{"use strict";o.r(i),o.d(i,{ColorScheme:()=>h,FornaContainer:()=>N,RNAUtilities:()=>f,rnaPlot:()=>L,rnaTreemap:()=>T});var t=o(780),e=o.n(t),n=o(893),s=o.n(n),a=o(447);o(722);const u=o.p+"02188894d5236b1517df3210b79c2a7f.svg";function l(t,e){var n,r,o=!1,i=a.nice(),c=null,f="right",d=null,h=null;return"function"==typeof e?n=e:(n=(e=e||{}).onOpen,r=e.onClose),"rootElement"in e&&(c=e.rootElement),"pos"in e&&(d=e.pos),"orientation"in e&&(f=e.orientation),"parentStart"in e&&(h=e.parentStart),s().selectAll(".d3-context-menu-"+i).data([1]).enter().append("div").classed("d3-context-menu",!0).classed("d3-context-menu-"+i,!0),s().select("body").on("click.d3-context-menu-"+i,(function(){o?o=!1:(console.log("body click close"),s().select(".d3-context-menu-"+i).style("display","none"),f="right",r&&r())})),function(e,a){var p,g=arguments.length>2&&void 0!==arguments[2]&&arguments[2],y=this,m=this;p=null==c?s().mouse(this):s().mouse(c);var b=null;o=g,s().selectAll(".d3-context-menu-"+i).html("");var v=s().selectAll(".d3-context-menu-"+i).on("contextmenu",(function(t){console.log("context-menu close"),s().select(".d3-context-menu-"+i).style("display","none"),f="right",s().event.preventDefault(),s().event.stopPropagation()})).append("ul");if(v.selectAll("li").data("function"==typeof t?t(e):t).enter().append("li").attr("class",(function(t){console.log("d:",t);var e="";return t.divider&&(e+=" is-divider"),t.disabled&&(e+=" is-disabled"),t.action||(e+=" is-header"),"children"in t&&(e+=" d3-context-menu-recursive"),e})).html((function(t){return t.divider?"
":(t.title||console.error("No title attribute set. Check the spelling of your options."),"string"==typeof t.title?t.title:t.title(e))})).on("click",(function(t,n){t.disabled||t.action&&(t.action(y,e,a,p),console.log("click close"),s().selectAll(".d3-context-menu").style("display","none"),f="right",r&&r())})).on("mouseenter",(function(t,n){if(s().select(this).classed("d3-context-menu-selected",!0),null!=b){if(s().select(".d3-context-menu-"+i).selectAll("li").classed("d3-context-menu-selected",!1),void 0===t.children)return console.log("no children close"),s().select(".d3-context-menu-"+b).style("display","none"),void(b=null);if(t.childUid==b)return;console.log("open different child menu close"),s().select(".d3-context-menu-"+b).style("display","none"),b=null}if(void 0!==t.children){var r=this.getBoundingClientRect(),o=null;o=l(t.children,"left"==f?{rootElement:m,pos:[r.left+window.pageXOffset,r.top-2+window.pageYOffset],orientation:"left"}:{pos:[r.left+r.width+window.pageXOffset,r.top-2+window.pageYOffset],rootElement:m,parentStart:[r.left+window.pageXOffset,r.top-2+window.pageYOffset]}),t.childUid=o.apply(this,[e,n,!0,function(){}]),b=t.childUid}s().select(this).classed("d3-context-menu-selected",!0)})).on("mouseleave",(function(t,e){null==b&&s().select(this).classed("d3-context-menu-selected",!1)})),v.selectAll(".d3-context-menu-recursive").append("img").attr("src",u).attr("width","14px").attr("height","14px").style("position","absolute").style("right","5px"),n&&!1===n(e,a))return i;var k=s().select(".d3-context-menu-"+i).style("display","block");null==d?s().select(".d3-context-menu-"+i).style("left",s().event.pageX-2+"px").style("top",s().event.pageY-2+"px"):s().select(".d3-context-menu-"+i).style("left",d[0]+"px").style("top",d[1]+"px");var x=k.node().getBoundingClientRect();return(x.left+x.width>window.innerWidth||"left"==f)&&(f="left",null==d?s().select(".d3-context-menu-"+i).style("left",s().event.pageX-2-x.width+"px").style("top",s().event.pageY-2+"px"):null!=h?s().select(".d3-context-menu-"+i).style("left",h[0]-x.width+"px").style("top",h[1]+"px"):s().select(".d3-context-menu-"+i).style("left",d[0]-x.width+"px").style("top",d[1]+"px")),o||(s().event.preventDefault(),s().event.stopPropagation()),i}}var c=function(t,e){return t-e};function f(){var t=this;t.bracketLeft="([{abcdefghijklmnopqrstuvwxyz".split(""),t.inverseBrackets=function(t){for(var e={},n=0;n0;r--)for(o=r+0+1;o<=e;o++){i=n[r][o-1];for(var s=o-0-1;s>=r;s--)t[s]===o&&(i=Math.max(i,(s>r?n[r][s-1]:0)+1+(o-s-1>0?n[s+1][o-1]:0)));n[r][o]=i}return i=n[1][e],n},t.backtrackMaximumMatching=function(e,n){var r=Array.apply(null,Array(e.length)).map((function(){return 0}));return t.mmBt(e,r,n,1,e.length-1),r},t.mmBt=function(e,n,r,o,i){var s=e[o][i];if(!(i-o-1<0))if(e[o][i-1]!=s){for(var a=i-0-1;a>=o;a--)if(r[i]===a&&(a>o?e[o][a-1]:0)+(i-a-1>0?e[a+1][i-1]:0)+1==s)return n[a]=i,n[i]=a,o0)throw"Unmatched base at position "+r[c][0];return n},t.insertIntoStack=function(t,e,n){for(var r=0;t[r].length>0&&t[r][t[r].length-1]r?i+=t.bracketLeft[t.insertIntoStack(n,r,e[r])]:i+=t.bracketRight[t.deleteFromStack(n,r)]}return i},t.findUnmatched=function(e,n,r){for(var o=[],i=[],s=n,a=r,u=n;u<=r;u++)0!==e[u]&&(e[u]r)&&i.push([u,e[u]]);for(u=s;u<=a;u++){for(;0===e[u]&&u<=a;)u++;for(r=e[u];e[u]===r;)u++,r--;o=o.concat(t.findUnmatched(e,u,r))}return i.length>0&&o.push(i),o},t.removePseudoknotsFromPairtable=function(e){for(var n=t.maximumMatching(e),r=t.backtrackMaximumMatching(n,e),o=[],i=1;io)return[];for(;0===e[r];r++)a.push(r);for(;0===e[o];o--)u.push(o);if(r>o){if(a.push(r),0===n)return[["e",n,a.sort(c)]];for(var l=!1,f=[],d=[],h=0;h=0&&(l=!0);return[["h",n,a.sort(c)]]}if(e[r]!=o){var p=a;for(h=r,p.push(h);h<=o;){for(s=s.concat(t.ptToElements(e,n,h,e[h],i)),p.push(e[h]),h=e[h]+1;0===e[h]&&h<=o;h++)p.push(h);p.push(h)}return p.pop(),(p=p.concat(u)).length>0&&(0===n?s.push(["e",n,p.sort(c)]):s.push(["m",n,p.sort(c)])),s}e[r]===o&&(a.push(r),u.push(o),a.concat(u).length>4&&(0===n?s.push(["e",n,a.concat(u).sort(c)]):s.push(["i",n,a.concat(u).sort(c)])));for(var g=[];e[r]===o&&r"!=n[a][0])for(var u=n[a].trim().split(/[\s]+/),l=0;lo&&(o=t));for(i in e.colorsJson.colorValues[n])"number"==typeof(t=e.colorsJson.colorValues[n][i])&&(e.colorsJson.colorValues[n][i]=(t-r)/(o-r))}return e},e.parseColorText(e.colorsText),e}var p=function(t,e){return t-e};function g(){var t=arguments.length>0&&void 0!==arguments[0]?arguments[0]:"",e=arguments.length>1&&void 0!==arguments[1]?arguments[1]:"",n=arguments.length>2&&void 0!==arguments[2]?arguments[2]:"",r=arguments.length>3&&void 0!==arguments[3]?arguments[3]:1,o=this;o.type="rna",o.circularizeExternal=!1,o.seq=t,o.dotbracket=e,o.structName=n,o.circular=!1,"*"==o.dotbracket.slice(-1)&&(o.dotbracket=o.dotbracket.slice(0,-1),o.circular=!0),o.uid=a.nice(),o.elements=[],o.pseudoknotPairs=[],o.nucsToNodes={},o.addUids=function(t){for(var e=o.nodes.filter((function(t){return"nucleotide"==t.nodeType})),n=0;n=0&&(t[e].nodeType="middle");for(var n,r=function(t){n=!1;for(var e=0;e=0&&(n=!0);n?o.elements[t][2].map((function(t){0!=t&&(o.nodes[t-1].elemType="e")})):o.elements[t][2].map((function(e){0!=e&&(o.nodes[e-1].elemType=o.elements[t][0])}))},i=0;i=4})),n=0;no.dotbracket.length)){o.links.push({source:o.nodes[t[f]-1],target:o.nodes[o.nodes.length-1],linkType:"fake",value:n,uid:a.nice()}),t.length>4&&o.links.push({source:o.nodes[t[f]-1],target:o.nodes[t[(f+Math.floor(t.length/2))%t.length]-1],linkType:"fake",value:2*n,uid:a.nice()});var d=3.14159*(t.length-2)/t.length,h=2*Math.cos(1.570795-d/2);o.links.push({source:o.nodes[t[f]-1],target:o.nodes[t[(f+2)%t.length]-1],linkType:"fake",value:h});var p=o.nodes[t[f]-1];"x"in p&&(u+=p.x,l+=p.y,c+=1)}return c>0&&(s.x=u/c,s.y=l/c,s.px=s.x,s.py=s.y),o},o.connectFakeNodes=function(){for(var t={},e=o.nodes.filter((function(t){return"middle"==t.nodeType})),n={},r=1;r<=o.nodes.length;r++)t[r]=[];for(r=0;r=0&&(l=""),o.nodes.push({name:l,num:r+u-1,radius:5,rna:o,nodeType:"nucleotide",structName:o.structName,elemType:e[u],uid:a.nice(),linked:!1})}for(var c=0;c1&&-1===o.dotBracketBreaks.indexOf(f-1)&&-1==o.dotBracketBreaks.indexOf(f-2)&&(o.links.push({source:o.nodes[f-2],target:o.nodes[f-1],linkType:"backbone",value:1,uid:a.nice()}),o.nodes[f-1].linked=!0);for(var d=0;dr)return[];for(;0===t[n];n++)s.push(n);for(;0===t[r];r--)a.push(r);if(n>r){if(s.push(n),0===e)return[["e",e,s.sort(p)]];for(var u=!1,l=[],c=[],f=0;f=0&&(u=!0);return[["h",e,s.sort(p)]]}if(t[n]!=r){var d=s;for(f=n,d.push(f);f<=r;){for(i=i.concat(o.ptToElements(t,e,f,t[f])),d.push(t[f]),f=t[f]+1;0===t[f]&&f<=r;f++)d.push(f);d.push(f)}return d.pop(),(d=d.concat(a)).length>0&&(0===e?i.push(["e",e,d.sort(p)]):i.push(["m",e,d.sort(p)])),i}t[n]===r&&(s.push(n),a.push(r),s.concat(a).length>4&&(0===e?i.push(["e",e,s.concat(a).sort(p)]):i.push(["i",e,s.concat(a).sort(p)])));for(var h=[];t[n]===r&&n0&&void 0!==arguments[0]?arguments[0]:1,e=arguments.length>1&&void 0!==arguments[1]?arguments[1]:10;if(0===e)return o;for(var n=1;n<=o.rnaLength;n++)if(n%e==0){var r,i,s=o.nodes[n-1],u=void 0,l=void 0,c=void 0,f=void 0;1==o.rnaLength?(f=[s.x-15,s.y],c=[s.x-15,s.y]):(u=1==n?o.nodes[o.rnaLength-1]:o.nodes[n-2],l=n==o.rnaLength?o.nodes[0]:o.nodes[n],0!==o.pairtable[l.num-t+1]&&0!==o.pairtable[u.num-t+1]&&0!==o.pairtable[s.num-t+1]&&(u=l=o.nodes[o.pairtable[s.num-t+1]-1]),0===o.pairtable[s.num-t+1]||0!==o.pairtable[l.num-t+1]&&0!==o.pairtable[u.num-t+1]?(f=[l.x-s.x,l.y-s.y],c=[u.x-s.x,u.y-s.y]):(f=[s.x-l.x,s.y-l.y],c=[s.x-u.x,s.y-u.y]));var d=[f[0]+c[0],f[1]+c[1]],h=Math.sqrt(d[0]*d[0]+d[1]*d[1]),p=[d[0]/h,d[1]/h],g=[-15*p[0],-15*p[1]];r=o.nodes[n-1].x+g[0],i=o.nodes[n-1].y+g[1];var y={name:n+t-1,num:-1,radius:6,rna:o,nodeType:"label",structName:o.structName,elemType:"l",x:r,y:i,px:r,py:i,uid:a.nice()},m={source:o.nodes[n-1],target:y,value:1,linkType:"label_link",uid:a.nice()};o.nodes.push(y),o.links.push(m)}return o},o.recalculateElements=function(){if(o.removePseudoknots(),o.elements=o.ptToElements(o.pairtable,0,1,o.dotbracket.length),o.circular){var t=o.elements.filter((function(t){if("e"==t[0])return!0}));if(t.length>0){eloop=t[0],nucs=eloop[2].sort(p),prev=nucs[0],hloop=!0,numGreater=0;for(var e=1;e1&&(numGreater+=1),prev=nucs[e];1==numGreater?eloop[0]="h":2==numGreater?eloop[0]="i":eloop[0]="m"}}return o},o.reassignLinkUids=function(){for(var t=0;t1&&(o.pseudoknotPairs=o.pseudoknotPairs.concat(d.removePseudoknotsFromPairtable(o.pairtable))),o},o.addPseudoknots=function(){for(var t=o.pairtable,e=o.pseudoknotPairs,n=0;n0&&o.recalculateElements(),o.getNodeFromNucleotides=function(t){if("[object Array]"===Object.prototype.toString.call(t)){for(var e=0;ed);if(y=m-2,m>=2&&(s[p+1+y]+=f,s[g-1-y]+=f,s[p]+=f,s[g]+=f,m>2))for(;y>=1;y--)s[p+y]=Math.PI,s[g-y]=Math.PI;u[++c]=m,d<=h&&t(d,h,r)}else e++,w++,A++;for(x=Math.PI*(w-2)/w,N[++E]=n,b=o<0?0:o,v=1;v<=E;v++){for(k=N[v]-b,y=0;y<=k;y++)s[b+y]+=x;if(v>E)break;b=N[++v]}a[++l]=A}(0,n+1,t),a[l]-=2,r=0,o[0]=100,i[0]=100;var d=[];for(d.push([o[0],i[0]]),e=1;e=0&&(1==++e||n>r)&&(n=r);return t.setMark(!1),n+1}function N(t){var n=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{},o=this;o.options=Object.assign({editable:!1,zoomable:!0,animation:!0,displayAllLinks:!1,labelInterval:10,chargeDistance:110,friction:.35,middleCharge:-30,otherCharge:-30,linkDistanceMultiplier:15,initialSize:null,layout:"standard-polygonal",transitionDuration:500,maxNodeRadius:80},n),null!==o.options.initialSize?(o.options.svgW=o.options.initialSize[0],o.options.svgH=o.options.initialSize[1]):(o.options.svgW=300,o.options.svgH=300),o.linkStrengths={pseudoknot:0,proteinChain:0,chainChain:0,intermolecule:10,external:0,other:10},o.displayParameters={displayNumbering:!0,displayNodeOutline:!0,displayNodeLabel:!0,displayLinks:!0,displayPseudoknotLinks:!0,displayProteinLinks:!0,displayDirectionArrows:!0},o.colorScheme="structure",o.customColors={},o.rnas={},o.extraLinks=[];var i=null,u=null,c=!1,f=function(){i=null,u=null},p=o.graph={nodes:[],links:[]};if(Array.prototype.equals=function(t){if(!t)return!1;if(this.length!=t.length)return!1;for(var e=0,n=this.length;e1&&void 0!==arguments[1]?arguments[1]:{},n={sequence:"",name:"empty",positions:[],labelInterval:o.options.labelInterval,avoidOthers:!0,uids:[],circularizeExternal:!0},r=new g((n=Object.assign(n,e)).sequence,t,n.name);r.circularizeExternal=n.circularizeExternal;var i=r.recalculateElements();if(0===n.positions.length)if("naview"==o.options.layout){var s=(new w).naview_xy_coordinates(r.pairtable);n.positions=[];for(var a=0;ar||ui||l0&&void 0!==arguments[0]?arguments[0]:0,e=function(){if(0===o.graph.nodes.length)return{translate:[0,0],scale:1};var t=s().min(o.graph.nodes.map((function(t){return t.x}))),e=s().min(o.graph.nodes.map((function(t){return t.y}))),n=s().max(o.graph.nodes.map((function(t){return t.x}))),r=s().max(o.graph.nodes.map((function(t){return t.y}))),i=s().max(o.graph.nodes.map((function(t){return t.radius}))),a=n-t,u=r-e,l=o.options.svgW/(a+1),c=o.options.svgH/(u+1),f=.8*Math.min(l,c,o.options.maxNodeRadius/i),d=a*f,h=u*f;return{translate:[-t*f+(o.options.svgW-d)/2,-e*f+(o.options.svgH-h)/2],scale:f}}();null!==e&&(A.transition().attr("transform","translate("+e.translate+") scale("+e.scale+")").duration(t),o.zoomer.translate(e.translate),o.zoomer.scale(e.scale))},o.setSize=function(){var e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:s().select(t).node().offsetWidth,n=arguments.length>1&&void 0!==arguments[1]?arguments[1]:s().select(t).node().offsetHeight;o.options.svgW=e,o.options.svgH=n,x.attr("viewBox","0 0 "+e+" "+n),_.range([0,e]).domain([0,e]),M.range([0,n]).domain([0,n]),o.zoomer.x(_).y(M),o.brusher.x(_).y(M),x.select(".background").attr("width",e).attr("height",n),o.centerView()},o.setOutlineColor=function(t){L.selectAll("g.gnode").select("[node_type=nucleotide]").style("fill",t)},o.addCustomColors=function(t){o.customColors=t,o.changeColorScheme("custom")},o.addCustomColorsText=function(t){var e=new h(t);o.customColors=e.colorsJson,o.changeColorScheme("custom")},o.changeColorScheme=function(t){L.selectAll("[node_type=protein]").classed(e().node,!0).attr("r",(function(t){return t.radius})),L.selectAll("g.gnode"),L.selectAll("g.gnode").selectAll("circle");var n=L.selectAll("g.gnode").select("[node_type=nucleotide]");if(o.colorScheme=t,"sequence"==t){var r=s().scale.ordinal().range(["#dbdb8d","#98df8a","#ff9896","#aec7e8","#aec7e8"]).domain(["A","C","G","U","T"]);n.style("fill",(function(t){return r(t.name)}))}else if("structure"==t)r=s().scale.category10().domain(["s","m","i","e","t","h","x"]).range(["lightgreen","#ff9896","#dbdb8d","lightsalmon","lightcyan","lightblue","transparent"]),n.style("fill",(function(t){return r(t.elemType)}));else if("positions"==t)n.style("fill",(function(t){return s().scale.linear().range(["#98df8a","#dbdb8d","#ff9896"]).interpolate(s().interpolateLab).domain([1,1+(t.rna.rnaLength-1)/2,t.rna.rnaLength])(t.num)}));else if("custom"==t){void 0!==o.customColors&&"domain"in o.customColors&&"range"in o.customColors&&(r=s().scale.linear().interpolate(s().interpolateLab).domain(o.customColors.domain).range(o.customColors.range));var i=function(t,e,n){if(t.hasOwnProperty(e.num)){var r=parseFloat(t[e.num]);return isNaN(r)?t[e.num]:n(r)}return"white"};n.style("fill",(function(t){if(void 0===o.customColors||!o.customColors.hasOwnProperty("colorValues"))return"white";if(o.customColors.colorValues.hasOwnProperty(t.structName)&&o.customColors.colorValues[t.structName].hasOwnProperty(t.num)){var e=o.customColors.colorValues[t.structName];return i(e,t,r)}if(o.customColors.colorValues.hasOwnProperty("")){var n=o.customColors.colorValues[""];return i(n,t,r)}return"white"}))}};var V=function(){L.selectAll("[node_type=label]").classed(e().transparent,!o.displayParameters.displayNumbering),L.selectAll("[label_type=label]").classed(e().transparent,!o.displayParameters.displayNumbering),N.selectAll("[link_type=label_link]").classed(e().transparent,!o.displayParameters.displayNumbering),x.selectAll("[node_type=nucleotide]").classed(e().transparent,!o.displayParameters.displayNodeOutline),L.selectAll("[label_type=nucleotide]").classed(e().transparent,!o.displayParameters.displayNodeLabel),x.selectAll("[link_type=real],[link_type=basepair],[link_type=backbone],[link_type=pseudoknot],[link_type=protein_chain],[link_type=chain_chain],[link_type=external]").classed(e().transparent,!o.displayParameters.displayLinks),x.selectAll("[link_type=pseudoknot]").classed(e().transparent,!o.displayParameters.displayPseudoknotLinks),x.selectAll("[link_type=protein_chain]").classed(e().transparent,!o.displayParameters.displayProteinLinks),N.selectAll("[link_type=fake]").classed(e().transparent,!o.options.displayAllLinks),N.selectAll("[link_type=fake_fake]").classed(e().transparent,!o.options.displayAllLinks),x.selectAll("."+e().directionArrow).classed(e().transparent,!o.displayParameters.displayDirectionArrows)},j=function(t,e){var n=e.rna,r=d.pairtableToDotbracket(n.pairtable),i=n.getPositions("nucleotide"),s=n.seq,u=n.getUids(),l=e.num,c=r,f=s.slice(0,l-1)+t+s.slice(l);console.log("newSequence:",f),console.log("uids:",u),u.splice(l-1,1,a.nice());var h=i;delete o.rnas[n.uid],o.addRNA(c,{sequence:f,positions:h,uids:u,centerView:!1})},$=function(t,e,n){var r=e.rna,i=d.pairtableToDotbracket(r.pairtable),s=r.getPositions("nucleotide"),u=r.seq,l=r.getUids(),c=e.num+n,f=i.slice(0,c)+"."+i.slice(c),h=u.slice(0,c)+t+u.slice(c);console.log("newSequence:",h),l.splice(c,0,a.nice()),s.splice(c,0,s[c-n-1]);var p=l,g=s;console.log("positions:",s),console.log("new node positions:",g),delete o.rnas[r.uid],o.addRNA(f,{sequence:h,positions:g,uids:p,centerView:!1})},W=function(t){console.log("deleting...",t);var e=t.rna,n=e.pairtable[t.num];0!=n&&(e.pairtable[t.num]=0,e.pairtable[n]=0);var r=d.pairtableToDotbracket(e.pairtable),i=e.getPositions("nucleotide"),s=e.seq,a=e.getUids(),u=r.slice(0,t.num-1)+r.slice(t.num),l=i.slice(0,t.num-1).concat(i.slice(t.num)),c=s.slice(0,t.num-1)+s.slice(t.num),f=a.slice(0,t.num-1).concat(a.slice(t.num));delete o.rnas[e.uid],o.addRNA(u,{sequence:c,positions:l,uids:f,centerView:!1}),console.log("new dotbracket:",u)},G=function(t){return t.uid},J=function(t){var e=t.getPositions("nucleotide"),n=t.getPositions("label"),r=t.getUids();t.recalculateElements().elementsToJson().addPseudoknots().addPositions("nucleotide",e).addUids(r).addLabels(1,o.options.labelInterval).addPositions("label",n).reinforceStems().reinforceLoops().updateLinkUids()},H=function(t,n){console.log("nodeMouseup");var r=!0;if(i){if("middle"==(u=t).nodeType||"middle"==i.nodeType||"label"==u.nodeType||"label"==i.nodeType)return;if(u==i)return void f();for(var s={source:i,target:u,linkType:"basepair",value:1,uid:a.nice()},h=0;h-1){if(t.source.rna==t.target.rna){if("backbone"==t.linkType)return console.log("trying to remove a backbone link",t.source.num,t.target.num),void function(t){if(t.target.num-t.source.num==1){for(var e=t.target.rna,n=[],r=0;r=t.target.num&&(console.log("crossing basepair",i),n.push(i))}console.log("toRemove:",n);for(var s=0;s1&&void 0!==arguments[1]?arguments[1]:{},n=X(t,e);if("extraLinks"in e){var r=o.addExternalLinks(n,e.extraLinks);o.extraLinks=o.extraLinks.concat(r)}return"centerPos"in e?o.addRNAJSON(n,{centerPos:e.centerPos,centerView:!1}):"avoidOthers"in e?o.addRNAJSON(n,{avoidOthers:e.avoidOthers}):o.addRNAJSON(n,{centerView:e.centerView}),n},o.addRNAJSON=function(t,e){var n,r,i=e.avoidOthers,a=void 0!==i&&i,u=e.centerPos,l=void 0===u?null:u,c=e.centerView,f=void 0===c||c;if(null!=l){var d=0,h=0,p=0;t.nodes.forEach((function(t){d+=t.x,h+=t.y,p+=1})),p>0&&t.nodes.forEach((function(t){t.x=t.x+l[0]-d/p,t.y=t.y+l[1]-h/p,t.px=t.x,t.py=t.y}))}return a&&(n=o.graph.nodes.length>0?s().max(o.graph.nodes.map((function(t){return t.x}))):0,r=s().min(t.nodes.map((function(t){return t.x}))),t.nodes.forEach((function(t){t.x+=n-r+20,t.px+=n-r}))),t.nodes.forEach((function(e){e.rna=t})),o.rnas[t.uid]=t,z(),o.update(),f&&o.centerView(),t},o.addNodes=function(t){t.links.forEach((function(e){"number"==typeof e.source&&(e.source=t.nodes[e.source]),"number"==typeof e.target&&(e.target=t.nodes[e.target])})),o.graph.nodes.length>0?(maxX=s().max(o.graph.nodes.map((function(t){return t.x}))),maxY=s().max(o.graph.nodes.map((function(t){return t.y})))):(maxX=0,maxY=0),t.nodes.forEach((function(t){t.rna.uid in o.rnas||(o.rnas[t.rna.uid]=t.rna),t.x+=maxX,t.px+=maxX})),r=new g("",""),r.nodes=t.nodes,r.links=t.links,z(),o.update(),o.centerView()},o.clearNodes=function(){o.graph.nodes=[],o.graph.links=[],o.rnas={},o.extraLinks=[],o.update()},o.addLink=function(t){if(console.log("adding new link"),t.source.rna==t.target.rna){var e=t.source.rna;e.pairtable[t.source.num]=t.target.num,e.pairtable[t.target.num]=t.source.num,J(e)}else console.log("intermolecule"),t.linkType="intermolecule",o.extraLinks.push(t);z(),o.update()},o.addExternalLinks=function(t,e){for(var n=[],r=0;r0&&void 0!==arguments[0]?arguments[0]:{},o={width:300,height:300,nucleotideRadius:5,rnaEdgePadding:1,labelInterval:10,showNucleotideLabels:!0,startNucleotideNumber:1,bundleExternalLinks:!1,rnaLayout:"simple",namePosition:"0 0"};function i(r){r.each((function(r){var i=d3.select(this).append("g").classed(e().plot,!0),s=new g(r.sequence,r.structure,r.name,o.startNucleotideNumber).recalculateElements().elementsToJson().addName(r.name);r.rnaGraph=s;var a=[];if("naview"===o.rnaLayout)for(var u=(new w).naview_xy_coordinates(s.pairtable),l=0;ll-o.height?(a=c(t=d3.scale.linear().domain(i).range([0,o.width]),s,[0,o.height]),n=a.scale):(a=c(n=d3.scale.linear().domain(s).range([0,o.height]),i,[0,o.width]),t=a.scale),t.range()[0],t.domain()[0],n.range()[0],n.domain()[0],"translate("+-(t.domain()[0]*a.scaleFactor-t.range()[0])+","+-(n.domain()[0]*a.scaleFactor-n.range()[0])+")scale("+a.scaleFactor+")"}(s.nodes.map((function(t){return t.x})),s.nodes.map((function(t){return t.y})));i.attr("transform",c);var f=s.nodes.filter((function(t){return"nucleotide"==t.nodeType})),d=s.nodes.filter((function(t){return"label"==t.nodeType})),h=s.links;!function(t,n){n=n.filter((function(t){return null!==t.source&&null!==t.target})),t.selectAll(".link").data(n).enter().append("svg:line").attr("x1",(function(t){return t.source.x})).attr("x2",(function(t){return t.target.x})).attr("y1",(function(t){return t.source.y})).attr("y2",(function(t){return t.target.y})).attr("link-type",(function(t){return t.linkType})).attr("extra-link-type",(function(t){return t.extraLinkType})).classed("link",!0).classed(e().link,!0)}(i,h),function(t,n){var r=t.selectAll(".gnode").data(n).enter().append("svg:g").classed("gnode",!0).attr("transform",(function(t){return"translate("+t.x+","+t.y+")"}));r.append("svg:circle").classed(e().node,!0).attr("node_type","nucleotide").attr("base_type",(function(t){if(t.name)return t.name.toLowerCase()})).attr("r",o.nucleotideRadius),o.showNucleotideLabels&&r.append("svg:text").text((function(t){return t.name})).classed(e().nodeLabel,!0).append("svg:title").text((function(t){return t.struct_name+":"+t.num}))}(i,f),function(t,n){var r=t.selectAll().data(n).enter().append("svg:g").classed("gnode",!0).attr("transform",(function(t){return"translate("+t.x+","+t.y+")"}));r.append("svg:circle").classed(e().node,!0).attr("node_type","label").attr("r",o.nucleotideRadius),r.append("svg:text").classed(e().nodeLabel,!0).text((function(t){return t.name}))}(i,d),function(t,n){var r=t.append("svg:text").classed(e().plotLabel,!0).text(n),i=o.namePosition.split(" ",2),s=[],a=r.node().getBBox(),u=[a.width,a.height],l=[o.width,o.height];for(var c in[0,1])switch(i[c]){case"0":s[c]=u[c]/2;break;case"1":s[c]=l[c]-u[c]/2;break;case"0.5":s[c]=l[c]/2}r.attr("x",s[0]).attr("y",s[1])}(d3.select(this),r.name),o.bundleExternalLinks&&function(t,e){var n={},r=[];e=e.filter((function(t){return"correct"==t.linkType||"incorrect"==t.linkType||"extra"==t.linkType})),t.selectAll("[link-type=extra]").remove();for(var o=0;o0&&void 0!==arguments[0]?arguments[0]:{},e={width:300,height:300,nucleotideRadius:5,rnaEdgePadding:1,labelInterval:10,showNucleotideLabels:!0,startNucleotideNumber:1,bundleExternalLinks:!1,rnaLayout:"simple",namePosition:"0 0"};function n(t){t.each((function(t){d3.select(this).attr("transform",(function(t){return"translate("+t.x+","+t.y+")"})).append("rect").attr("fill","transparent").attr("width",(function(t){return Math.max(0,t.dx)})).attr("height",(function(t){return Math.max(0,t.dy)}));var n=L(e).width(Math.max(0,t.dx)).height(Math.max(0,t.dy));"structure"in t&&d3.select(this).call(n)}))}e=Object.assign(e,t);var r=function(t){t.each((function(t){console.log("data:",t);var r=d3.layout.treemap().size([e.width,e.height]).sticky(!1).value((function(t){return t.size}));d3.select(this).append("g").classed("rnatreemap",!0).datum(t).selectAll(".treemapnode").data(r.nodes).enter().append("g").classed("treemapnode",!0).call(n)}))};return r.width=function(t){return arguments.length?(e.width=t,r):e.width},r.height=function(t){return arguments.length?(e.height=t,r):e.height},r.showNucleotideLabels=function(t){return arguments.length?(e.showNucleotideLabels=t,r):e.showNucleotideLabels},r.rnaEdgePadding=function(t){return arguments.length?(e.rnaEdgePadding=t,r):e.rnaEdgePadding},r.nucleotideRadius=function(t){return arguments.length?(e.nucleotideRadius=t,r):e.nucleotideRadius},r.labelInterval=function(t){return arguments.length?(e.labelInterval=t,r):e.labelInterval},r.showNucleotideLabels=function(t){return arguments.length?(e.showNucleotideLabels=t,r):e.showNucleotideLabels},r.startNucleotideNumber=function(t){return arguments.length?(e.startNucleotideNumber=t,r):e.startNucleotideNumber},r.bundleExternalLinks=function(t){return arguments.length?(e.bundleExternalLinks=t,r):e.bundleExternalLinks},r.rnaLayout=function(t){return arguments.length?(e.rnaLayout=t,r):e.rnaLayout},r.namePosition=function(t){return arguments.length?(e.namePosition=t,r):e.namePosition},r.zoom=function(t){return arguments.length?(e.zoom=t,r):e.zoom},r}w.prototype.naview_xy_coordinates=function(t){var e,n=[],r=[];if(0===t.length||0===t[0])return 0;this.nbase=t[0],this.bases=[];for(var o=0;oe&&n++;0==n&&(this.bases[1].setMate(this.nbase),this.bases[this.nbase].setMate(1))},w.prototype.find_regions=function(){var t,e=null,n=null;t=this.nbase+1;var r=[];for(e=0;ethis.nbase&&(e=0)}while(e!=t);return r},w.prototype.find_central_loop=function(){var t=new x.F,e=null,n=null,r=null;for(E.bind(this)(),e=0,n=-1,r=0;re?(n=t.getDepth(),e=t.getNconnection(),this.root=t):t.getDepth()>n&&t.getNconnection()==e&&(n=t.getDepth(),this.root=t)},w.prototype.traverse_loop=function(t,e){var n,r,o,i,s,a,u,l,c,f,d,h,p,g,y,m,b,v,k,x,w,E,A,N,L,T,_,M,I,S,B,P,R,C,U,O,X,Y,F,q,D,z,V,j,$,W,G,J,H,K,Z,Q,tt,et,nt,rt,ot,it,st,at,ut,lt,ct,ft,dt,ht,pt,gt,yt,mt=0;a=2*Math.PI/(this.nbase+1),v=null,S=-1;var bt=0;for(A=0;null!=(m=t.getConnection(bt));bt++,A++)n=-Math.sin(a*m.getStart()),r=Math.cos(a*m.getStart()),o=-Math.sin(a*m.getEnd()),i=Math.cos(a*m.getEnd())-r,s=n-o,u=Math.sqrt(i*i+s*s),m.setXrad(i/u),m.setYrad(s/u),m.setAngle(Math.atan2(s,i)),m.getAngle()<0&&m.setAngle(m.getAngle()+2*Math.PI),null!=e&&e.getRegion()==m.getRegion()&&(v=m,S=A);t:for(;;){this.determine_radius(t,this.lencut),l=t.getRadius()/this.RADIUS_REDUCTION_FACTOR,null==e?c=f=0:(d=(this.bases[v.getStart()].getX()+this.bases[v.getEnd()].getX())/2,h=(this.bases[v.getStart()].getY()+this.bases[v.getEnd()].getY())/2,c=d-l*v.getXrad(),f=h-l*v.getYrad()),_=-1==S?0:S,m=t.getConnection(_),T=0,B=!1;do{if((w=_-1)<0&&(w=t.getNconnection()-1),k=t.getConnection(w),this.connected_connection(k,m)?(_=w,m=k):B=!0,++T>t.getNconnection()){for(L=-1,A=0;A=t.getNconnection()&&(w=0),m=t.getConnection(A),(dt=(b=t.getConnection(w)).getAngle()-m.getAngle())<0&&(dt+=2*Math.PI),dt>L&&(L=dt,mt=A);M=mt,(_=mt+1)>=t.getNconnection()&&(_=0),(m=t.getConnection(M)).setBroken(!0),B=!0}}while(!B);for(P=!1,W=_;!P;){for(T=0,B=!1,M=_,R=!1;!B;)if(m=t.getConnection(M),M==S&&(R=!0),(w=M+1)>=t.getNconnection()&&(w=0),b=t.getConnection(w),this.connected_connection(m,b)){if(++T>=t.getNconnection())break;M=w}else B=!0;for(A=G=J=I=this.find_ic_middle(_,M,e,v,t),B=!1,K=0;!B;)(A=K<0?G:0==K?I:J)>=0&&(m=t.getConnection(A),null!=e&&v==m||(0==K?(p=m.getAngle()-Math.asin(.5/l),g=m.getAngle()+Math.asin(.5/l),this.bases[m.getStart()].setX(c+l*Math.cos(p)),this.bases[m.getStart()].setY(f+l*Math.sin(p)),this.bases[m.getEnd()].setX(c+l*Math.cos(g)),this.bases[m.getEnd()].setY(f+l*Math.sin(g))):K<0?((w=A+1)>=t.getNconnection()&&(w=0),m=t.getConnection(A),b=t.getConnection(w),nt=m.getXrad(),rt=m.getYrad(),dt=(m.getAngle()+b.getAngle())/2,m.getAngle()>b.getAngle()&&(dt-=Math.PI),st=Math.cos(dt),lt=Math.sin(dt),ct=-st,(N=b.getAngle()-m.getAngle())<0&&(N+=2*Math.PI),ft=m.isExtruded()?N<=Math.PI/2?2:1.5:1,this.bases[m.getEnd()].setX(this.bases[b.getStart()].getX()+ft*lt),this.bases[m.getEnd()].setY(this.bases[b.getStart()].getY()+ft*ct),this.bases[m.getStart()].setX(this.bases[m.getEnd()].getX()+rt),this.bases[m.getStart()].setY(this.bases[m.getEnd()].getY()-nt)):((w=A-1)<0&&(w=t.getNconnection()-1),m=t.getConnection(w),ot=(b=t.getConnection(A)).getXrad(),it=b.getYrad(),dt=(m.getAngle()+b.getAngle())/2,m.getAngle()>b.getAngle()&&(dt-=Math.PI),st=Math.cos(dt),lt=-Math.sin(dt),ct=st,(N=b.getAngle()-m.getAngle())<0&&(N+=2*Math.PI),ft=m.isExtruded()?N<=Math.PI/2?2:1.5:1,this.bases[b.getStart()].setX(this.bases[m.getEnd()].getX()+ft*lt),this.bases[b.getStart()].setY(this.bases[m.getEnd()].getY()+ft*ct),this.bases[b.getEnd()].setX(this.bases[b.getStart()].getX()-it),this.bases[b.getEnd()].setY(this.bases[b.getStart()].getY()+ot)))),K<0?(J==M?J=-1:J>=0&&++J>=t.getNconnection()&&(J=0),K=1):(G==_?G=-1:G>=0&&--G<0&&(G=t.getNconnection()-1),K=-1),B=-1==G&&-1==J;if((H=M+1)>=t.getNconnection()&&(H=0),M!=_&&(_!=W||H!=W))if(m=t.getConnection(_),b=t.getConnection(M),Q=this.bases[b.getEnd()].getX()-this.bases[m.getStart()].getX(),tt=this.bases[b.getEnd()].getY()-this.bases[m.getStart()].getY(),U=this.bases[m.getStart()].getX()+Q/2,O=this.bases[m.getStart()].getY()+tt/2,F=Q/(et=Math.sqrt(Q*Q+tt*tt)),q=tt/et,D=c-U,z=f-O,X=(V=(D/=et=Math.sqrt(Q*Q+tt*tt))*F+(z/=et)*q)*F-D,Y=V*q-z,X/=et=Math.sqrt(X*X+Y*Y),Y/=et,Q=this.bases[m.getStart()].getX()-c,tt=this.bases[m.getStart()].getY()-f,(dt=Math.atan2(tt,Q))<0&&(dt+=2*Math.PI),Q=this.bases[b.getEnd()].getX()-c,tt=this.bases[b.getEnd()].getY()-f,(ht=Math.atan2(tt,Q))<0&&(ht+=2*Math.PI),htMath.PI?-1:1)*l*X,$=f+C*l*Y,R)c-=j-U,f-=$-O;else for(A=_;x=(m=t.getConnection(A)).getStart(),this.bases[x].setX(this.bases[x].getX()+j-U),this.bases[x].setY(this.bases[x].getY()+$-O),x=m.getEnd(),this.bases[x].setX(this.bases[x].getX()+j-U),this.bases[x].setY(this.bases[x].getY()+$-O),A!=M;)++A>=t.getNconnection()&&(A=0);P=(_=H)==W}for(A=0;A=t.getNconnection()&&(w=0),b=t.getConnection(w),Q=this.bases[m.getEnd()].getX()-c,tt=this.bases[m.getEnd()].getY()-f,ut=Math.sqrt(Q*Q+tt*tt),(dt=Math.atan2(tt,Q))<0&&(dt+=2*Math.PI),Q=this.bases[b.getStart()].getX()-c,tt=this.bases[b.getStart()].getY()-f,at=Math.sqrt(Q*Q+tt*tt),(ht=Math.atan2(tt,Q))<0&&(ht+=2*Math.PI),htMath.PI)if(m.isExtruded())console.log("Warning from traverse_loop. Loop "+t.getNumber()+" has crossed regions\n");else if(b.getStart()-m.getEnd()!=1){m.setExtruded(!0);continue t}if(m.isExtruded())this.construct_extruded_segment(m,b);else for((E=b.getStart()-m.getEnd())<0&&(E+=this.nbase+1),a=Z/E,w=1;wthis.nbase&&(x-=this.nbase+1),et=ut+(at-ut)*((y=dt+w*a)-dt)/Z,this.bases[x].setX(c+et*Math.cos(y)),this.bases[x].setY(f+et*Math.sin(y))}break}for(A=0;A=t.getNconnection()&&(w=0),m=t.getConnection(A),b=t.getConnection(w),E+=2,pt+=this.bases[m.getStart()].getX()+this.bases[m.getEnd()].getX(),gt+=this.bases[m.getStart()].getY()+this.bases[m.getEnd()].getY(),!m.isExtruded())for(w=m.getEnd()+1;w!=b.getStart();w++)w>this.nbase&&(w-=this.nbase+1),E++,pt+=this.bases[w].getX(),gt+=this.bases[w].getY();t.setX(pt/E),t.setY(gt/E)},w.prototype.determine_radius=function(t,e){var n,r,o,i,s,a,u,l,c,f,d,h=0,p=new b.Connection,g=new b.Connection,y=.7071068;do{for(n=1e10,s=0,i=0,l=0;l=t.getNconnection()&&(c=0),g=t.getConnection(c),f=p.getEnd(),(d=g.getStart())1&&(n=u,h=l);(a=i/s)0?a=t.getRadius():t.setRadius(a)},w.prototype.find_ic_middle=function(t,e,n,r,o){var i,s,a,u,l;for(i=0,s=-1,a=t,l=!1;!l;)i++>2*o.getNconnection()&&console.log("Infinite loop in 'find_ic_middle'"),null!=n&&o.getConnection(a)==r&&(s=a),l=a==e,++a>=o.getNconnection()&&(a=0);if(-1==s){for(u=1,a=t;u<(i+1)/2;u++)++a>=o.getNconnection()&&(a=0);s=a}return s},w.prototype.construct_extruded_segment=function(t,e){var n,r,o,i,s,a,u,l,c,f,d,h,p,g,y,m,b,v;if(n=t.getAngle(),(o=r=e.getAngle())=1.5&&d<=Math.PI/2&&((m=p+1)>this.nbase&&(m-=this.nbase+1),(b=g-1)<0&&(b+=this.nbase+1),this.bases[m].setX(this.bases[p].getX()+.5*s),this.bases[m].setY(this.bases[p].getY()+.5*a),this.bases[b].setX(this.bases[g].getX()-.5*s),this.bases[b].setY(this.bases[g].getY()-.5*a),p=m,g=b);do{v=!1,this.construct_circle_segment(p,g),(m=p+1)>this.nbase&&(m-=this.nbase+1),s=this.bases[m].getX()-this.bases[p].getX(),a=this.bases[m].getY()-this.bases[p].getY(),(u=Math.atan2(a,s))<0&&(u+=2*Math.PI),(h=u-n)<0&&(h+=2*Math.PI),h>Math.PI&&(v=!0),(b=g-1)<0&&(b+=this.nbase+1),s=this.bases[b].getX()-this.bases[g].getX(),a=this.bases[b].getY()-this.bases[g].getY(),(l=Math.atan2(a,s))<0&&(l+=2*Math.PI),(h=r-l)<0&&(h+=2*Math.PI),h>Math.PI&&(v=!0),v&&(c=this.minf2(i,n+.5),this.bases[m].setX(this.bases[p].getX()+Math.cos(c)),this.bases[m].setY(this.bases[p].getY()+Math.sin(c)),p=m,c=this.maxf2(i,o-.5),this.bases[b].setX(this.bases[g].getX()+Math.cos(c)),this.bases[b].setY(this.bases[g].getY()+Math.sin(c)),g=b,y-=2)}while(v&&y>1)}},w.prototype.construct_circle_segment=function(t,e){var n,r,o,i,s,a,u,l,c,f,d,h,p,g,y;if(n=this.bases[e].getX()-this.bases[t].getX(),r=this.bases[e].getY()-this.bases[t].getY(),o=Math.sqrt(n*n+r*r),(p=e-t)<0&&(p+=this.nbase+1),o>=p)for(n/=o,r/=o,g=1;gthis.nbase&&(y-=this.nbase+1),this.bases[y].setX(this.bases[t].getX()+n*g/p),this.bases[y].setY(this.bases[t].getY()+r*g/p);else for(this.find_center_for_arc(p-1,o),n/=o,r/=o,i=this.bases[t].getX()+n*o/2,s=this.bases[t].getY()+r*o/2,a=r,u=-n,l=i+this._h*a,c=s+this._h*u,f=this.bases[t].getX()-l,d=this.bases[t].getY()-c,o=Math.sqrt(f*f+d*d),h=Math.atan2(d,f),g=1;gthis.nbase&&(y-=this.nbase+1),this.bases[y].setX(l+o*Math.cos(h+g*this.angleinc)),this.bases[y].setY(c+o*Math.sin(h+g*this.angleinc))},w.prototype.find_center_for_arc=function(t,e){var n,r,o,i,s,a,u,l;o=-(r=(t+1)/Math.PI)-e/(t+1.000001-e),e<1&&(o=0),l=0;do{n=(r+o)/2,s=1-.5/((i=Math.sqrt(n*n+e*e/4))*i),Math.abs(s)>1&&console.log("Unexpected large magnitude discriminant = "+s+" "+i),(u=(a=Math.acos(s))*(t+1)+2*Math.acos(n/i)-2*Math.PI)>0?o=n:r=n}while(Math.abs(u)>1e-4&&++l=this.MAXITER&&(noIterationFailureYet&&(console.log("Iteration failed in find_center_for_arc"),noIterationFailureYet=!1),n=0,a=0),this._h=n,this.angleinc=a},w.prototype.generate_region=function(t){var e,n,r,o,i,s;for(s=t.getRegion(),e=0,t.getStart()==s.getStart1()?(n=s.getStart1(),r=s.getEnd1()):(n=s.getStart2(),r=s.getEnd2()),(this.bases[t.getStart()].getX()>this.ANUM-100||this.bases[t.getEnd()].getX()>this.ANUM-100)&&console.log("Bad region passed to generate_region. Coordinates not defined."),o=n+1;o<=r;o++)e++,this.bases[o].setX(this.bases[t.getStart()].getX()+this.HELIX_FACTOR*e*t.getXrad()),this.bases[o].setY(this.bases[t.getStart()].getY()+this.HELIX_FACTOR*e*t.getYrad()),i=this.bases[o].getMate(),this.bases[i].setX(this.bases[t.getEnd()].getX()+this.HELIX_FACTOR*e*t.getXrad()),this.bases[i].setY(this.bases[t.getEnd()].getY()+this.HELIX_FACTOR*e*t.getYrad())},w.prototype.minf2=function(t,e){return te?t:e},w.prototype.connected_connection=function(t,e){return!!t.isExtruded()||t.getEnd()+1==e.getStart()}})(),i})())); //# sourceMappingURL=fornac.js.map \ No newline at end of file diff --git a/dist/fornac.js.LICENSE.txt b/dist/fornac.js.LICENSE.txt new file mode 100644 index 0000000..df537c5 --- /dev/null +++ b/dist/fornac.js.LICENSE.txt @@ -0,0 +1,8 @@ +/*! + * The buffer module from node.js, for the browser. + * + * @author Feross Aboukhadijeh + * @license MIT + */ + +/*! ieee754. BSD-3-Clause License. Feross Aboukhadijeh */ diff --git a/dist/fornac.js.map b/dist/fornac.js.map index f2bd86d..4224636 100644 --- a/dist/fornac.js.map +++ b/dist/fornac.js.map @@ -1 +1 @@ -{"version":3,"file":"fornac.js","mappings":"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","sources":["webpack://[name]/webpack/universalModuleDefinition","webpack://[name]/./src/naview/connection.js","webpack://[name]/./src/naview/loop.js","webpack://[name]/./src/naview/region.js","webpack://[name]/./node_modules/base64-js/index.js","webpack://[name]/./node_modules/buffer/index.js","webpack://[name]/./src/d3-context-menu.css?fe1f","webpack://[name]/./src/fornac.css?7f8e","webpack://[name]/./node_modules/ieee754/index.js","webpack://[name]/./node_modules/slugid/index.js","webpack://[name]/./node_modules/slugid/slugid.js","webpack://[name]/./node_modules/uuid/dist/esm-browser/rng.js","webpack://[name]/./node_modules/uuid/dist/esm-browser/regex.js","webpack://[name]/./node_modules/uuid/dist/esm-browser/validate.js","webpack://[name]/./node_modules/uuid/dist/esm-browser/stringify.js","webpack://[name]/./node_modules/uuid/dist/esm-browser/v1.js","webpack://[name]/./node_modules/uuid/dist/esm-browser/parse.js","webpack://[name]/./node_modules/uuid/dist/esm-browser/v35.js","webpack://[name]/./node_modules/uuid/dist/esm-browser/md5.js","webpack://[name]/./node_modules/uuid/dist/esm-browser/v3.js","webpack://[name]/./node_modules/uuid/dist/esm-browser/v4.js","webpack://[name]/./node_modules/uuid/dist/esm-browser/sha1.js","webpack://[name]/./node_modules/uuid/dist/esm-browser/v5.js","webpack://[name]/./node_modules/uuid/dist/esm-browser/nil.js","webpack://[name]/./node_modules/uuid/dist/esm-browser/version.js","webpack://[name]/external umd \"d3\"","webpack://[name]/webpack/bootstrap","webpack://[name]/webpack/runtime/compat get default export","webpack://[name]/webpack/runtime/define property getters","webpack://[name]/webpack/runtime/global","webpack://[name]/webpack/runtime/hasOwnProperty shorthand","webpack://[name]/webpack/runtime/make namespace object","webpack://[name]/webpack/runtime/publicPath","webpack://[name]/./src/img/play.svg","webpack://[name]/./src/d3-context-menu.js","webpack://[name]/./src/rnautils.js","webpack://[name]/./src/rnagraph.js","webpack://[name]/./src/simplernaplot.js","webpack://[name]/./src/naview/radloop.js","webpack://[name]/./src/naview/base.js","webpack://[name]/./src/naview/naview.js","webpack://[name]/./src/fornac.js","webpack://[name]/./src/rnaplot.js","webpack://[name]/./src/rnatreemap.js"],"sourcesContent":["(function webpackUniversalModuleDefinition(root, factory) {\n\tif(typeof exports === 'object' && typeof module === 'object')\n\t\tmodule.exports = factory(require(\"d3\"));\n\telse if(typeof define === 'function' && define.amd)\n\t\tdefine([\"d3\"], factory);\n\telse if(typeof exports === 'object')\n\t\texports[\"fornac\"] = factory(require(\"d3\"));\n\telse\n\t\troot[\"fornac\"] = factory(root[\"d3\"]);\n})(self, function(__WEBPACK_EXTERNAL_MODULE__990__) {\nreturn ","import {Loop} from './loop.js';\nimport {Region} from './region.js';\n\nexport function Connection() {\n\tthis.loop = new Loop();\n\tthis.region = new Region();\n\t// Start and end form the 1st base pair of the region.\n\tthis.start = null;\n this.end = null;\n\tthis.xrad = null;\n this.yrad = null;\n this.angle = null;\n\t// True if segment between this connection and the\n\t// next must be extruded out of the circle\n\tthis.extruded = null;\n\t// True if the extruded segment must be drawn long.\n\tthis.broken = null;\n\n\tthis._isNull = false;\n}\n\nConnection.prototype.isNull = function(){\n\treturn this._isNull;\n}\n\nConnection.prototype.setNull = function(isNull){\n\tthis._isNull = isNull;\n}\n\nConnection.prototype.getLoop = function(){\n\treturn this.loop;\n}\n\nConnection.prototype.setLoop = function(loop) {\n\tthis.loop = loop;\n}\n\nConnection.prototype.getRegion = function(){\n\treturn this.region;\n}\n\nConnection.prototype.setRegion = function(region){\n\tthis.region = region;\n}\n\nConnection.prototype.getStart = function(){\n\treturn this.start;\n}\n\nConnection.prototype.setStart = function(start) {\n\tthis.start = start;\n}\n\nConnection.prototype.getEnd = function(){\n\treturn this.end;\n}\n\nConnection.prototype.setEnd = function(end){\n\tthis.end = end;\n}\n\nConnection.prototype.getXrad = function(){\n\treturn this.xrad;\n}\n\nConnection.prototype.setXrad = function(xrad){\n\tthis.xrad = xrad;\n}\n\nConnection.prototype.getYrad = function(){\n\treturn this.yrad;\n}\n\nConnection.prototype.setYrad = function(yrad) {\n\tthis.yrad = yrad;\n}\n\nConnection.prototype.getAngle = function(){\n\treturn this.angle;\n}\n\nConnection.prototype.setAngle = function(angle){\n\tthis.angle = angle;\n}\n\nConnection.prototype.isExtruded = function(){\n\treturn this.extruded;\n}\n\nConnection.prototype.setExtruded = function(extruded){\n\tthis.extruded = extruded;\n}\n\nConnection.prototype.isBroken = function(){\n\treturn this.broken;\n}\n\nConnection.prototype.setBroken = function(broken){\n\tthis.broken = broken;\n}\n","import {Connection} from './connection.js';\n\nexport function Loop() {\n\tthis.nconnection = null;\n\tthis.connections = [];\n\tthis._connections = [];\n\tthis.number = null;\n\tthis.depth = null;\n\tthis.mark = null;\n\tthis.x = null;\n this.y = null;\n this.radius = null;\n}\n\nLoop.prototype.getNconnection = function() {\n\treturn this.nconnection;\n}\n\nLoop.prototype.setNconnection = function(nconnection) {\n\tthis.nconnection = nconnection;\n}\n\nLoop.prototype.setConnection = function(i, c){\n\tif (c != null){\n\t\tthis._connections[i] = c;\n }\n\telse {\n\t\tif (!this._connections[i]){\n\t\t\tthis._connections[i] = new Connection();\n\t\t}\n\t\tthis._connections[i].setNull(true);\n\t}\n}\n\nLoop.prototype.getConnection = function(i){\n\tvar Connection = require(\"./connection\");\n\tif (!this._connections[i]){\n this._connections[i] = new Connection();\n }\n\tvar c = this._connections[i];\n\tif (c.isNull()){\n\t\treturn null;\n }\n\telse {\n\t\treturn c;\n }\n}\n\nLoop.prototype.addConnection = function(i, c){\n\tthis._connections.push(c);\n}\n\nLoop.prototype.getNumber = function(){\n\treturn this.number;\n}\n\nLoop.prototype.setNumber = function(number){\n\tthis.number = number;\n}\n\nLoop.prototype.getDepth = function(){\n\treturn this.depth;\n}\n\nLoop.prototype.setDepth = function(depth){\n\tthis.depth = depth;\n}\n\nLoop.prototype.isMark = function(){\n\treturn this.mark;\n}\n\nLoop.prototype.setMark = function(mark){\n\tthis.mark = mark;\n}\n\nLoop.prototype.getX = function(){\n\treturn this.x;\n}\n\nLoop.prototype.setX = function(x){\n\tthis.x = x;\n}\n\nLoop.prototype.getY = function(){\n\treturn this.y;\n}\n\nLoop.prototype.setY = function(y){\n\tthis.y = y;\n}\n\nLoop.prototype.getRadius = function(){\n\treturn this.radius;\n}\n\nLoop.prototype.setRadius = function(radius){\n\tthis.radius = radius;\n}\n","export function Region() {\n\tthis._start1 = null;\n this._end1 = null;\n this._start2 = null;\n this._end2 = null;\n}\n\nRegion.prototype.getStart1 = function(){\n\treturn this._start1;\n}\n\nRegion.prototype.setStart1 = function(start1){\n\tthis._start1 = start1;\n}\n\nRegion.prototype.getEnd1 = function(){\n\treturn this._end1;\n}\n\nRegion.prototype.setEnd1 = function(end1){\n\tthis._end1 = end1;\n}\n\nRegion.prototype.getStart2 = function(){\n\treturn this._start2;\n}\n\nRegion.prototype.setStart2 = function(start2){\n\tthis._start2 = start2;\n}\n\nRegion.prototype.getEnd2 = function(){\n\treturn this._end2;\n}\n\nRegion.prototype.setEnd2 = function(end2){\n\tthis._end2 = end2;\n}\n","'use strict'\n\nexports.byteLength = byteLength\nexports.toByteArray = toByteArray\nexports.fromByteArray = fromByteArray\n\nvar lookup = []\nvar revLookup = []\nvar Arr = typeof Uint8Array !== 'undefined' ? Uint8Array : Array\n\nvar code = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/'\nfor (var i = 0, len = code.length; i < len; ++i) {\n lookup[i] = code[i]\n revLookup[code.charCodeAt(i)] = i\n}\n\n// Support decoding URL-safe base64 strings, as Node.js does.\n// See: https://en.wikipedia.org/wiki/Base64#URL_applications\nrevLookup['-'.charCodeAt(0)] = 62\nrevLookup['_'.charCodeAt(0)] = 63\n\nfunction getLens (b64) {\n var len = b64.length\n\n if (len % 4 > 0) {\n throw new Error('Invalid string. Length must be a multiple of 4')\n }\n\n // Trim off extra bytes after placeholder bytes are found\n // See: https://github.com/beatgammit/base64-js/issues/42\n var validLen = b64.indexOf('=')\n if (validLen === -1) validLen = len\n\n var placeHoldersLen = validLen === len\n ? 0\n : 4 - (validLen % 4)\n\n return [validLen, placeHoldersLen]\n}\n\n// base64 is 4/3 + up to two characters of the original data\nfunction byteLength (b64) {\n var lens = getLens(b64)\n var validLen = lens[0]\n var placeHoldersLen = lens[1]\n return ((validLen + placeHoldersLen) * 3 / 4) - placeHoldersLen\n}\n\nfunction _byteLength (b64, validLen, placeHoldersLen) {\n return ((validLen + placeHoldersLen) * 3 / 4) - placeHoldersLen\n}\n\nfunction toByteArray (b64) {\n var tmp\n var lens = getLens(b64)\n var validLen = lens[0]\n var placeHoldersLen = lens[1]\n\n var arr = new Arr(_byteLength(b64, validLen, placeHoldersLen))\n\n var curByte = 0\n\n // if there are placeholders, only get up to the last complete 4 chars\n var len = placeHoldersLen > 0\n ? validLen - 4\n : validLen\n\n var i\n for (i = 0; i < len; i += 4) {\n tmp =\n (revLookup[b64.charCodeAt(i)] << 18) |\n (revLookup[b64.charCodeAt(i + 1)] << 12) |\n (revLookup[b64.charCodeAt(i + 2)] << 6) |\n revLookup[b64.charCodeAt(i + 3)]\n arr[curByte++] = (tmp >> 16) & 0xFF\n arr[curByte++] = (tmp >> 8) & 0xFF\n arr[curByte++] = tmp & 0xFF\n }\n\n if (placeHoldersLen === 2) {\n tmp =\n (revLookup[b64.charCodeAt(i)] << 2) |\n (revLookup[b64.charCodeAt(i + 1)] >> 4)\n arr[curByte++] = tmp & 0xFF\n }\n\n if (placeHoldersLen === 1) {\n tmp =\n (revLookup[b64.charCodeAt(i)] << 10) |\n (revLookup[b64.charCodeAt(i + 1)] << 4) |\n (revLookup[b64.charCodeAt(i + 2)] >> 2)\n arr[curByte++] = (tmp >> 8) & 0xFF\n arr[curByte++] = tmp & 0xFF\n }\n\n return arr\n}\n\nfunction tripletToBase64 (num) {\n return lookup[num >> 18 & 0x3F] +\n lookup[num >> 12 & 0x3F] +\n lookup[num >> 6 & 0x3F] +\n lookup[num & 0x3F]\n}\n\nfunction encodeChunk (uint8, start, end) {\n var tmp\n var output = []\n for (var i = start; i < end; i += 3) {\n tmp =\n ((uint8[i] << 16) & 0xFF0000) +\n ((uint8[i + 1] << 8) & 0xFF00) +\n (uint8[i + 2] & 0xFF)\n output.push(tripletToBase64(tmp))\n }\n return output.join('')\n}\n\nfunction fromByteArray (uint8) {\n var tmp\n var len = uint8.length\n var extraBytes = len % 3 // if we have 1 byte left, pad 2 bytes\n var parts = []\n var maxChunkLength = 16383 // must be multiple of 3\n\n // go through the array every three bytes, we'll deal with trailing stuff later\n for (var i = 0, len2 = len - extraBytes; i < len2; i += maxChunkLength) {\n parts.push(encodeChunk(uint8, i, (i + maxChunkLength) > len2 ? len2 : (i + maxChunkLength)))\n }\n\n // pad the end with zeros, but make sure to not forget the extra bytes\n if (extraBytes === 1) {\n tmp = uint8[len - 1]\n parts.push(\n lookup[tmp >> 2] +\n lookup[(tmp << 4) & 0x3F] +\n '=='\n )\n } else if (extraBytes === 2) {\n tmp = (uint8[len - 2] << 8) + uint8[len - 1]\n parts.push(\n lookup[tmp >> 10] +\n lookup[(tmp >> 4) & 0x3F] +\n lookup[(tmp << 2) & 0x3F] +\n '='\n )\n }\n\n return parts.join('')\n}\n","/*!\n * The buffer module from node.js, for the browser.\n *\n * @author Feross Aboukhadijeh \n * @license MIT\n */\n/* eslint-disable no-proto */\n\n'use strict'\n\nconst base64 = require('base64-js')\nconst ieee754 = require('ieee754')\nconst customInspectSymbol =\n (typeof Symbol === 'function' && typeof Symbol['for'] === 'function') // eslint-disable-line dot-notation\n ? Symbol['for']('nodejs.util.inspect.custom') // eslint-disable-line dot-notation\n : null\n\nexports.Buffer = Buffer\nexports.SlowBuffer = SlowBuffer\nexports.INSPECT_MAX_BYTES = 50\n\nconst K_MAX_LENGTH = 0x7fffffff\nexports.kMaxLength = K_MAX_LENGTH\n\n/**\n * If `Buffer.TYPED_ARRAY_SUPPORT`:\n * === true Use Uint8Array implementation (fastest)\n * === false Print warning and recommend using `buffer` v4.x which has an Object\n * implementation (most compatible, even IE6)\n *\n * Browsers that support typed arrays are IE 10+, Firefox 4+, Chrome 7+, Safari 5.1+,\n * Opera 11.6+, iOS 4.2+.\n *\n * We report that the browser does not support typed arrays if the are not subclassable\n * using __proto__. Firefox 4-29 lacks support for adding new properties to `Uint8Array`\n * (See: https://bugzilla.mozilla.org/show_bug.cgi?id=695438). IE 10 lacks support\n * for __proto__ and has a buggy typed array implementation.\n */\nBuffer.TYPED_ARRAY_SUPPORT = typedArraySupport()\n\nif (!Buffer.TYPED_ARRAY_SUPPORT && typeof console !== 'undefined' &&\n typeof console.error === 'function') {\n console.error(\n 'This browser lacks typed array (Uint8Array) support which is required by ' +\n '`buffer` v5.x. Use `buffer` v4.x if you require old browser support.'\n )\n}\n\nfunction typedArraySupport () {\n // Can typed array instances can be augmented?\n try {\n const arr = new Uint8Array(1)\n const proto = { foo: function () { return 42 } }\n Object.setPrototypeOf(proto, Uint8Array.prototype)\n Object.setPrototypeOf(arr, proto)\n return arr.foo() === 42\n } catch (e) {\n return false\n }\n}\n\nObject.defineProperty(Buffer.prototype, 'parent', {\n enumerable: true,\n get: function () {\n if (!Buffer.isBuffer(this)) return undefined\n return this.buffer\n }\n})\n\nObject.defineProperty(Buffer.prototype, 'offset', {\n enumerable: true,\n get: function () {\n if (!Buffer.isBuffer(this)) return undefined\n return this.byteOffset\n }\n})\n\nfunction createBuffer (length) {\n if (length > K_MAX_LENGTH) {\n throw new RangeError('The value \"' + length + '\" is invalid for option \"size\"')\n }\n // Return an augmented `Uint8Array` instance\n const buf = new Uint8Array(length)\n Object.setPrototypeOf(buf, Buffer.prototype)\n return buf\n}\n\n/**\n * The Buffer constructor returns instances of `Uint8Array` that have their\n * prototype changed to `Buffer.prototype`. Furthermore, `Buffer` is a subclass of\n * `Uint8Array`, so the returned instances will have all the node `Buffer` methods\n * and the `Uint8Array` methods. Square bracket notation works as expected -- it\n * returns a single octet.\n *\n * The `Uint8Array` prototype remains unmodified.\n */\n\nfunction Buffer (arg, encodingOrOffset, length) {\n // Common case.\n if (typeof arg === 'number') {\n if (typeof encodingOrOffset === 'string') {\n throw new TypeError(\n 'The \"string\" argument must be of type string. Received type number'\n )\n }\n return allocUnsafe(arg)\n }\n return from(arg, encodingOrOffset, length)\n}\n\nBuffer.poolSize = 8192 // not used by this implementation\n\nfunction from (value, encodingOrOffset, length) {\n if (typeof value === 'string') {\n return fromString(value, encodingOrOffset)\n }\n\n if (ArrayBuffer.isView(value)) {\n return fromArrayView(value)\n }\n\n if (value == null) {\n throw new TypeError(\n 'The first argument must be one of type string, Buffer, ArrayBuffer, Array, ' +\n 'or Array-like Object. Received type ' + (typeof value)\n )\n }\n\n if (isInstance(value, ArrayBuffer) ||\n (value && isInstance(value.buffer, ArrayBuffer))) {\n return fromArrayBuffer(value, encodingOrOffset, length)\n }\n\n if (typeof SharedArrayBuffer !== 'undefined' &&\n (isInstance(value, SharedArrayBuffer) ||\n (value && isInstance(value.buffer, SharedArrayBuffer)))) {\n return fromArrayBuffer(value, encodingOrOffset, length)\n }\n\n if (typeof value === 'number') {\n throw new TypeError(\n 'The \"value\" argument must not be of type number. Received type number'\n )\n }\n\n const valueOf = value.valueOf && value.valueOf()\n if (valueOf != null && valueOf !== value) {\n return Buffer.from(valueOf, encodingOrOffset, length)\n }\n\n const b = fromObject(value)\n if (b) return b\n\n if (typeof Symbol !== 'undefined' && Symbol.toPrimitive != null &&\n typeof value[Symbol.toPrimitive] === 'function') {\n return Buffer.from(value[Symbol.toPrimitive]('string'), encodingOrOffset, length)\n }\n\n throw new TypeError(\n 'The first argument must be one of type string, Buffer, ArrayBuffer, Array, ' +\n 'or Array-like Object. Received type ' + (typeof value)\n )\n}\n\n/**\n * Functionally equivalent to Buffer(arg, encoding) but throws a TypeError\n * if value is a number.\n * Buffer.from(str[, encoding])\n * Buffer.from(array)\n * Buffer.from(buffer)\n * Buffer.from(arrayBuffer[, byteOffset[, length]])\n **/\nBuffer.from = function (value, encodingOrOffset, length) {\n return from(value, encodingOrOffset, length)\n}\n\n// Note: Change prototype *after* Buffer.from is defined to workaround Chrome bug:\n// https://github.com/feross/buffer/pull/148\nObject.setPrototypeOf(Buffer.prototype, Uint8Array.prototype)\nObject.setPrototypeOf(Buffer, Uint8Array)\n\nfunction assertSize (size) {\n if (typeof size !== 'number') {\n throw new TypeError('\"size\" argument must be of type number')\n } else if (size < 0) {\n throw new RangeError('The value \"' + size + '\" is invalid for option \"size\"')\n }\n}\n\nfunction alloc (size, fill, encoding) {\n assertSize(size)\n if (size <= 0) {\n return createBuffer(size)\n }\n if (fill !== undefined) {\n // Only pay attention to encoding if it's a string. This\n // prevents accidentally sending in a number that would\n // be interpreted as a start offset.\n return typeof encoding === 'string'\n ? createBuffer(size).fill(fill, encoding)\n : createBuffer(size).fill(fill)\n }\n return createBuffer(size)\n}\n\n/**\n * Creates a new filled Buffer instance.\n * alloc(size[, fill[, encoding]])\n **/\nBuffer.alloc = function (size, fill, encoding) {\n return alloc(size, fill, encoding)\n}\n\nfunction allocUnsafe (size) {\n assertSize(size)\n return createBuffer(size < 0 ? 0 : checked(size) | 0)\n}\n\n/**\n * Equivalent to Buffer(num), by default creates a non-zero-filled Buffer instance.\n * */\nBuffer.allocUnsafe = function (size) {\n return allocUnsafe(size)\n}\n/**\n * Equivalent to SlowBuffer(num), by default creates a non-zero-filled Buffer instance.\n */\nBuffer.allocUnsafeSlow = function (size) {\n return allocUnsafe(size)\n}\n\nfunction fromString (string, encoding) {\n if (typeof encoding !== 'string' || encoding === '') {\n encoding = 'utf8'\n }\n\n if (!Buffer.isEncoding(encoding)) {\n throw new TypeError('Unknown encoding: ' + encoding)\n }\n\n const length = byteLength(string, encoding) | 0\n let buf = createBuffer(length)\n\n const actual = buf.write(string, encoding)\n\n if (actual !== length) {\n // Writing a hex string, for example, that contains invalid characters will\n // cause everything after the first invalid character to be ignored. (e.g.\n // 'abxxcd' will be treated as 'ab')\n buf = buf.slice(0, actual)\n }\n\n return buf\n}\n\nfunction fromArrayLike (array) {\n const length = array.length < 0 ? 0 : checked(array.length) | 0\n const buf = createBuffer(length)\n for (let i = 0; i < length; i += 1) {\n buf[i] = array[i] & 255\n }\n return buf\n}\n\nfunction fromArrayView (arrayView) {\n if (isInstance(arrayView, Uint8Array)) {\n const copy = new Uint8Array(arrayView)\n return fromArrayBuffer(copy.buffer, copy.byteOffset, copy.byteLength)\n }\n return fromArrayLike(arrayView)\n}\n\nfunction fromArrayBuffer (array, byteOffset, length) {\n if (byteOffset < 0 || array.byteLength < byteOffset) {\n throw new RangeError('\"offset\" is outside of buffer bounds')\n }\n\n if (array.byteLength < byteOffset + (length || 0)) {\n throw new RangeError('\"length\" is outside of buffer bounds')\n }\n\n let buf\n if (byteOffset === undefined && length === undefined) {\n buf = new Uint8Array(array)\n } else if (length === undefined) {\n buf = new Uint8Array(array, byteOffset)\n } else {\n buf = new Uint8Array(array, byteOffset, length)\n }\n\n // Return an augmented `Uint8Array` instance\n Object.setPrototypeOf(buf, Buffer.prototype)\n\n return buf\n}\n\nfunction fromObject (obj) {\n if (Buffer.isBuffer(obj)) {\n const len = checked(obj.length) | 0\n const buf = createBuffer(len)\n\n if (buf.length === 0) {\n return buf\n }\n\n obj.copy(buf, 0, 0, len)\n return buf\n }\n\n if (obj.length !== undefined) {\n if (typeof obj.length !== 'number' || numberIsNaN(obj.length)) {\n return createBuffer(0)\n }\n return fromArrayLike(obj)\n }\n\n if (obj.type === 'Buffer' && Array.isArray(obj.data)) {\n return fromArrayLike(obj.data)\n }\n}\n\nfunction checked (length) {\n // Note: cannot use `length < K_MAX_LENGTH` here because that fails when\n // length is NaN (which is otherwise coerced to zero.)\n if (length >= K_MAX_LENGTH) {\n throw new RangeError('Attempt to allocate Buffer larger than maximum ' +\n 'size: 0x' + K_MAX_LENGTH.toString(16) + ' bytes')\n }\n return length | 0\n}\n\nfunction SlowBuffer (length) {\n if (+length != length) { // eslint-disable-line eqeqeq\n length = 0\n }\n return Buffer.alloc(+length)\n}\n\nBuffer.isBuffer = function isBuffer (b) {\n return b != null && b._isBuffer === true &&\n b !== Buffer.prototype // so Buffer.isBuffer(Buffer.prototype) will be false\n}\n\nBuffer.compare = function compare (a, b) {\n if (isInstance(a, Uint8Array)) a = Buffer.from(a, a.offset, a.byteLength)\n if (isInstance(b, Uint8Array)) b = Buffer.from(b, b.offset, b.byteLength)\n if (!Buffer.isBuffer(a) || !Buffer.isBuffer(b)) {\n throw new TypeError(\n 'The \"buf1\", \"buf2\" arguments must be one of type Buffer or Uint8Array'\n )\n }\n\n if (a === b) return 0\n\n let x = a.length\n let y = b.length\n\n for (let i = 0, len = Math.min(x, y); i < len; ++i) {\n if (a[i] !== b[i]) {\n x = a[i]\n y = b[i]\n break\n }\n }\n\n if (x < y) return -1\n if (y < x) return 1\n return 0\n}\n\nBuffer.isEncoding = function isEncoding (encoding) {\n switch (String(encoding).toLowerCase()) {\n case 'hex':\n case 'utf8':\n case 'utf-8':\n case 'ascii':\n case 'latin1':\n case 'binary':\n case 'base64':\n case 'ucs2':\n case 'ucs-2':\n case 'utf16le':\n case 'utf-16le':\n return true\n default:\n return false\n }\n}\n\nBuffer.concat = function concat (list, length) {\n if (!Array.isArray(list)) {\n throw new TypeError('\"list\" argument must be an Array of Buffers')\n }\n\n if (list.length === 0) {\n return Buffer.alloc(0)\n }\n\n let i\n if (length === undefined) {\n length = 0\n for (i = 0; i < list.length; ++i) {\n length += list[i].length\n }\n }\n\n const buffer = Buffer.allocUnsafe(length)\n let pos = 0\n for (i = 0; i < list.length; ++i) {\n let buf = list[i]\n if (isInstance(buf, Uint8Array)) {\n if (pos + buf.length > buffer.length) {\n if (!Buffer.isBuffer(buf)) buf = Buffer.from(buf)\n buf.copy(buffer, pos)\n } else {\n Uint8Array.prototype.set.call(\n buffer,\n buf,\n pos\n )\n }\n } else if (!Buffer.isBuffer(buf)) {\n throw new TypeError('\"list\" argument must be an Array of Buffers')\n } else {\n buf.copy(buffer, pos)\n }\n pos += buf.length\n }\n return buffer\n}\n\nfunction byteLength (string, encoding) {\n if (Buffer.isBuffer(string)) {\n return string.length\n }\n if (ArrayBuffer.isView(string) || isInstance(string, ArrayBuffer)) {\n return string.byteLength\n }\n if (typeof string !== 'string') {\n throw new TypeError(\n 'The \"string\" argument must be one of type string, Buffer, or ArrayBuffer. ' +\n 'Received type ' + typeof string\n )\n }\n\n const len = string.length\n const mustMatch = (arguments.length > 2 && arguments[2] === true)\n if (!mustMatch && len === 0) return 0\n\n // Use a for loop to avoid recursion\n let loweredCase = false\n for (;;) {\n switch (encoding) {\n case 'ascii':\n case 'latin1':\n case 'binary':\n return len\n case 'utf8':\n case 'utf-8':\n return utf8ToBytes(string).length\n case 'ucs2':\n case 'ucs-2':\n case 'utf16le':\n case 'utf-16le':\n return len * 2\n case 'hex':\n return len >>> 1\n case 'base64':\n return base64ToBytes(string).length\n default:\n if (loweredCase) {\n return mustMatch ? -1 : utf8ToBytes(string).length // assume utf8\n }\n encoding = ('' + encoding).toLowerCase()\n loweredCase = true\n }\n }\n}\nBuffer.byteLength = byteLength\n\nfunction slowToString (encoding, start, end) {\n let loweredCase = false\n\n // No need to verify that \"this.length <= MAX_UINT32\" since it's a read-only\n // property of a typed array.\n\n // This behaves neither like String nor Uint8Array in that we set start/end\n // to their upper/lower bounds if the value passed is out of range.\n // undefined is handled specially as per ECMA-262 6th Edition,\n // Section 13.3.3.7 Runtime Semantics: KeyedBindingInitialization.\n if (start === undefined || start < 0) {\n start = 0\n }\n // Return early if start > this.length. Done here to prevent potential uint32\n // coercion fail below.\n if (start > this.length) {\n return ''\n }\n\n if (end === undefined || end > this.length) {\n end = this.length\n }\n\n if (end <= 0) {\n return ''\n }\n\n // Force coercion to uint32. This will also coerce falsey/NaN values to 0.\n end >>>= 0\n start >>>= 0\n\n if (end <= start) {\n return ''\n }\n\n if (!encoding) encoding = 'utf8'\n\n while (true) {\n switch (encoding) {\n case 'hex':\n return hexSlice(this, start, end)\n\n case 'utf8':\n case 'utf-8':\n return utf8Slice(this, start, end)\n\n case 'ascii':\n return asciiSlice(this, start, end)\n\n case 'latin1':\n case 'binary':\n return latin1Slice(this, start, end)\n\n case 'base64':\n return base64Slice(this, start, end)\n\n case 'ucs2':\n case 'ucs-2':\n case 'utf16le':\n case 'utf-16le':\n return utf16leSlice(this, start, end)\n\n default:\n if (loweredCase) throw new TypeError('Unknown encoding: ' + encoding)\n encoding = (encoding + '').toLowerCase()\n loweredCase = true\n }\n }\n}\n\n// This property is used by `Buffer.isBuffer` (and the `is-buffer` npm package)\n// to detect a Buffer instance. It's not possible to use `instanceof Buffer`\n// reliably in a browserify context because there could be multiple different\n// copies of the 'buffer' package in use. This method works even for Buffer\n// instances that were created from another copy of the `buffer` package.\n// See: https://github.com/feross/buffer/issues/154\nBuffer.prototype._isBuffer = true\n\nfunction swap (b, n, m) {\n const i = b[n]\n b[n] = b[m]\n b[m] = i\n}\n\nBuffer.prototype.swap16 = function swap16 () {\n const len = this.length\n if (len % 2 !== 0) {\n throw new RangeError('Buffer size must be a multiple of 16-bits')\n }\n for (let i = 0; i < len; i += 2) {\n swap(this, i, i + 1)\n }\n return this\n}\n\nBuffer.prototype.swap32 = function swap32 () {\n const len = this.length\n if (len % 4 !== 0) {\n throw new RangeError('Buffer size must be a multiple of 32-bits')\n }\n for (let i = 0; i < len; i += 4) {\n swap(this, i, i + 3)\n swap(this, i + 1, i + 2)\n }\n return this\n}\n\nBuffer.prototype.swap64 = function swap64 () {\n const len = this.length\n if (len % 8 !== 0) {\n throw new RangeError('Buffer size must be a multiple of 64-bits')\n }\n for (let i = 0; i < len; i += 8) {\n swap(this, i, i + 7)\n swap(this, i + 1, i + 6)\n swap(this, i + 2, i + 5)\n swap(this, i + 3, i + 4)\n }\n return this\n}\n\nBuffer.prototype.toString = function toString () {\n const length = this.length\n if (length === 0) return ''\n if (arguments.length === 0) return utf8Slice(this, 0, length)\n return slowToString.apply(this, arguments)\n}\n\nBuffer.prototype.toLocaleString = Buffer.prototype.toString\n\nBuffer.prototype.equals = function equals (b) {\n if (!Buffer.isBuffer(b)) throw new TypeError('Argument must be a Buffer')\n if (this === b) return true\n return Buffer.compare(this, b) === 0\n}\n\nBuffer.prototype.inspect = function inspect () {\n let str = ''\n const max = exports.INSPECT_MAX_BYTES\n str = this.toString('hex', 0, max).replace(/(.{2})/g, '$1 ').trim()\n if (this.length > max) str += ' ... '\n return ''\n}\nif (customInspectSymbol) {\n Buffer.prototype[customInspectSymbol] = Buffer.prototype.inspect\n}\n\nBuffer.prototype.compare = function compare (target, start, end, thisStart, thisEnd) {\n if (isInstance(target, Uint8Array)) {\n target = Buffer.from(target, target.offset, target.byteLength)\n }\n if (!Buffer.isBuffer(target)) {\n throw new TypeError(\n 'The \"target\" argument must be one of type Buffer or Uint8Array. ' +\n 'Received type ' + (typeof target)\n )\n }\n\n if (start === undefined) {\n start = 0\n }\n if (end === undefined) {\n end = target ? target.length : 0\n }\n if (thisStart === undefined) {\n thisStart = 0\n }\n if (thisEnd === undefined) {\n thisEnd = this.length\n }\n\n if (start < 0 || end > target.length || thisStart < 0 || thisEnd > this.length) {\n throw new RangeError('out of range index')\n }\n\n if (thisStart >= thisEnd && start >= end) {\n return 0\n }\n if (thisStart >= thisEnd) {\n return -1\n }\n if (start >= end) {\n return 1\n }\n\n start >>>= 0\n end >>>= 0\n thisStart >>>= 0\n thisEnd >>>= 0\n\n if (this === target) return 0\n\n let x = thisEnd - thisStart\n let y = end - start\n const len = Math.min(x, y)\n\n const thisCopy = this.slice(thisStart, thisEnd)\n const targetCopy = target.slice(start, end)\n\n for (let i = 0; i < len; ++i) {\n if (thisCopy[i] !== targetCopy[i]) {\n x = thisCopy[i]\n y = targetCopy[i]\n break\n }\n }\n\n if (x < y) return -1\n if (y < x) return 1\n return 0\n}\n\n// Finds either the first index of `val` in `buffer` at offset >= `byteOffset`,\n// OR the last index of `val` in `buffer` at offset <= `byteOffset`.\n//\n// Arguments:\n// - buffer - a Buffer to search\n// - val - a string, Buffer, or number\n// - byteOffset - an index into `buffer`; will be clamped to an int32\n// - encoding - an optional encoding, relevant is val is a string\n// - dir - true for indexOf, false for lastIndexOf\nfunction bidirectionalIndexOf (buffer, val, byteOffset, encoding, dir) {\n // Empty buffer means no match\n if (buffer.length === 0) return -1\n\n // Normalize byteOffset\n if (typeof byteOffset === 'string') {\n encoding = byteOffset\n byteOffset = 0\n } else if (byteOffset > 0x7fffffff) {\n byteOffset = 0x7fffffff\n } else if (byteOffset < -0x80000000) {\n byteOffset = -0x80000000\n }\n byteOffset = +byteOffset // Coerce to Number.\n if (numberIsNaN(byteOffset)) {\n // byteOffset: it it's undefined, null, NaN, \"foo\", etc, search whole buffer\n byteOffset = dir ? 0 : (buffer.length - 1)\n }\n\n // Normalize byteOffset: negative offsets start from the end of the buffer\n if (byteOffset < 0) byteOffset = buffer.length + byteOffset\n if (byteOffset >= buffer.length) {\n if (dir) return -1\n else byteOffset = buffer.length - 1\n } else if (byteOffset < 0) {\n if (dir) byteOffset = 0\n else return -1\n }\n\n // Normalize val\n if (typeof val === 'string') {\n val = Buffer.from(val, encoding)\n }\n\n // Finally, search either indexOf (if dir is true) or lastIndexOf\n if (Buffer.isBuffer(val)) {\n // Special case: looking for empty string/buffer always fails\n if (val.length === 0) {\n return -1\n }\n return arrayIndexOf(buffer, val, byteOffset, encoding, dir)\n } else if (typeof val === 'number') {\n val = val & 0xFF // Search for a byte value [0-255]\n if (typeof Uint8Array.prototype.indexOf === 'function') {\n if (dir) {\n return Uint8Array.prototype.indexOf.call(buffer, val, byteOffset)\n } else {\n return Uint8Array.prototype.lastIndexOf.call(buffer, val, byteOffset)\n }\n }\n return arrayIndexOf(buffer, [val], byteOffset, encoding, dir)\n }\n\n throw new TypeError('val must be string, number or Buffer')\n}\n\nfunction arrayIndexOf (arr, val, byteOffset, encoding, dir) {\n let indexSize = 1\n let arrLength = arr.length\n let valLength = val.length\n\n if (encoding !== undefined) {\n encoding = String(encoding).toLowerCase()\n if (encoding === 'ucs2' || encoding === 'ucs-2' ||\n encoding === 'utf16le' || encoding === 'utf-16le') {\n if (arr.length < 2 || val.length < 2) {\n return -1\n }\n indexSize = 2\n arrLength /= 2\n valLength /= 2\n byteOffset /= 2\n }\n }\n\n function read (buf, i) {\n if (indexSize === 1) {\n return buf[i]\n } else {\n return buf.readUInt16BE(i * indexSize)\n }\n }\n\n let i\n if (dir) {\n let foundIndex = -1\n for (i = byteOffset; i < arrLength; i++) {\n if (read(arr, i) === read(val, foundIndex === -1 ? 0 : i - foundIndex)) {\n if (foundIndex === -1) foundIndex = i\n if (i - foundIndex + 1 === valLength) return foundIndex * indexSize\n } else {\n if (foundIndex !== -1) i -= i - foundIndex\n foundIndex = -1\n }\n }\n } else {\n if (byteOffset + valLength > arrLength) byteOffset = arrLength - valLength\n for (i = byteOffset; i >= 0; i--) {\n let found = true\n for (let j = 0; j < valLength; j++) {\n if (read(arr, i + j) !== read(val, j)) {\n found = false\n break\n }\n }\n if (found) return i\n }\n }\n\n return -1\n}\n\nBuffer.prototype.includes = function includes (val, byteOffset, encoding) {\n return this.indexOf(val, byteOffset, encoding) !== -1\n}\n\nBuffer.prototype.indexOf = function indexOf (val, byteOffset, encoding) {\n return bidirectionalIndexOf(this, val, byteOffset, encoding, true)\n}\n\nBuffer.prototype.lastIndexOf = function lastIndexOf (val, byteOffset, encoding) {\n return bidirectionalIndexOf(this, val, byteOffset, encoding, false)\n}\n\nfunction hexWrite (buf, string, offset, length) {\n offset = Number(offset) || 0\n const remaining = buf.length - offset\n if (!length) {\n length = remaining\n } else {\n length = Number(length)\n if (length > remaining) {\n length = remaining\n }\n }\n\n const strLen = string.length\n\n if (length > strLen / 2) {\n length = strLen / 2\n }\n let i\n for (i = 0; i < length; ++i) {\n const parsed = parseInt(string.substr(i * 2, 2), 16)\n if (numberIsNaN(parsed)) return i\n buf[offset + i] = parsed\n }\n return i\n}\n\nfunction utf8Write (buf, string, offset, length) {\n return blitBuffer(utf8ToBytes(string, buf.length - offset), buf, offset, length)\n}\n\nfunction asciiWrite (buf, string, offset, length) {\n return blitBuffer(asciiToBytes(string), buf, offset, length)\n}\n\nfunction base64Write (buf, string, offset, length) {\n return blitBuffer(base64ToBytes(string), buf, offset, length)\n}\n\nfunction ucs2Write (buf, string, offset, length) {\n return blitBuffer(utf16leToBytes(string, buf.length - offset), buf, offset, length)\n}\n\nBuffer.prototype.write = function write (string, offset, length, encoding) {\n // Buffer#write(string)\n if (offset === undefined) {\n encoding = 'utf8'\n length = this.length\n offset = 0\n // Buffer#write(string, encoding)\n } else if (length === undefined && typeof offset === 'string') {\n encoding = offset\n length = this.length\n offset = 0\n // Buffer#write(string, offset[, length][, encoding])\n } else if (isFinite(offset)) {\n offset = offset >>> 0\n if (isFinite(length)) {\n length = length >>> 0\n if (encoding === undefined) encoding = 'utf8'\n } else {\n encoding = length\n length = undefined\n }\n } else {\n throw new Error(\n 'Buffer.write(string, encoding, offset[, length]) is no longer supported'\n )\n }\n\n const remaining = this.length - offset\n if (length === undefined || length > remaining) length = remaining\n\n if ((string.length > 0 && (length < 0 || offset < 0)) || offset > this.length) {\n throw new RangeError('Attempt to write outside buffer bounds')\n }\n\n if (!encoding) encoding = 'utf8'\n\n let loweredCase = false\n for (;;) {\n switch (encoding) {\n case 'hex':\n return hexWrite(this, string, offset, length)\n\n case 'utf8':\n case 'utf-8':\n return utf8Write(this, string, offset, length)\n\n case 'ascii':\n case 'latin1':\n case 'binary':\n return asciiWrite(this, string, offset, length)\n\n case 'base64':\n // Warning: maxLength not taken into account in base64Write\n return base64Write(this, string, offset, length)\n\n case 'ucs2':\n case 'ucs-2':\n case 'utf16le':\n case 'utf-16le':\n return ucs2Write(this, string, offset, length)\n\n default:\n if (loweredCase) throw new TypeError('Unknown encoding: ' + encoding)\n encoding = ('' + encoding).toLowerCase()\n loweredCase = true\n }\n }\n}\n\nBuffer.prototype.toJSON = function toJSON () {\n return {\n type: 'Buffer',\n data: Array.prototype.slice.call(this._arr || this, 0)\n }\n}\n\nfunction base64Slice (buf, start, end) {\n if (start === 0 && end === buf.length) {\n return base64.fromByteArray(buf)\n } else {\n return base64.fromByteArray(buf.slice(start, end))\n }\n}\n\nfunction utf8Slice (buf, start, end) {\n end = Math.min(buf.length, end)\n const res = []\n\n let i = start\n while (i < end) {\n const firstByte = buf[i]\n let codePoint = null\n let bytesPerSequence = (firstByte > 0xEF)\n ? 4\n : (firstByte > 0xDF)\n ? 3\n : (firstByte > 0xBF)\n ? 2\n : 1\n\n if (i + bytesPerSequence <= end) {\n let secondByte, thirdByte, fourthByte, tempCodePoint\n\n switch (bytesPerSequence) {\n case 1:\n if (firstByte < 0x80) {\n codePoint = firstByte\n }\n break\n case 2:\n secondByte = buf[i + 1]\n if ((secondByte & 0xC0) === 0x80) {\n tempCodePoint = (firstByte & 0x1F) << 0x6 | (secondByte & 0x3F)\n if (tempCodePoint > 0x7F) {\n codePoint = tempCodePoint\n }\n }\n break\n case 3:\n secondByte = buf[i + 1]\n thirdByte = buf[i + 2]\n if ((secondByte & 0xC0) === 0x80 && (thirdByte & 0xC0) === 0x80) {\n tempCodePoint = (firstByte & 0xF) << 0xC | (secondByte & 0x3F) << 0x6 | (thirdByte & 0x3F)\n if (tempCodePoint > 0x7FF && (tempCodePoint < 0xD800 || tempCodePoint > 0xDFFF)) {\n codePoint = tempCodePoint\n }\n }\n break\n case 4:\n secondByte = buf[i + 1]\n thirdByte = buf[i + 2]\n fourthByte = buf[i + 3]\n if ((secondByte & 0xC0) === 0x80 && (thirdByte & 0xC0) === 0x80 && (fourthByte & 0xC0) === 0x80) {\n tempCodePoint = (firstByte & 0xF) << 0x12 | (secondByte & 0x3F) << 0xC | (thirdByte & 0x3F) << 0x6 | (fourthByte & 0x3F)\n if (tempCodePoint > 0xFFFF && tempCodePoint < 0x110000) {\n codePoint = tempCodePoint\n }\n }\n }\n }\n\n if (codePoint === null) {\n // we did not generate a valid codePoint so insert a\n // replacement char (U+FFFD) and advance only 1 byte\n codePoint = 0xFFFD\n bytesPerSequence = 1\n } else if (codePoint > 0xFFFF) {\n // encode to utf16 (surrogate pair dance)\n codePoint -= 0x10000\n res.push(codePoint >>> 10 & 0x3FF | 0xD800)\n codePoint = 0xDC00 | codePoint & 0x3FF\n }\n\n res.push(codePoint)\n i += bytesPerSequence\n }\n\n return decodeCodePointsArray(res)\n}\n\n// Based on http://stackoverflow.com/a/22747272/680742, the browser with\n// the lowest limit is Chrome, with 0x10000 args.\n// We go 1 magnitude less, for safety\nconst MAX_ARGUMENTS_LENGTH = 0x1000\n\nfunction decodeCodePointsArray (codePoints) {\n const len = codePoints.length\n if (len <= MAX_ARGUMENTS_LENGTH) {\n return String.fromCharCode.apply(String, codePoints) // avoid extra slice()\n }\n\n // Decode in chunks to avoid \"call stack size exceeded\".\n let res = ''\n let i = 0\n while (i < len) {\n res += String.fromCharCode.apply(\n String,\n codePoints.slice(i, i += MAX_ARGUMENTS_LENGTH)\n )\n }\n return res\n}\n\nfunction asciiSlice (buf, start, end) {\n let ret = ''\n end = Math.min(buf.length, end)\n\n for (let i = start; i < end; ++i) {\n ret += String.fromCharCode(buf[i] & 0x7F)\n }\n return ret\n}\n\nfunction latin1Slice (buf, start, end) {\n let ret = ''\n end = Math.min(buf.length, end)\n\n for (let i = start; i < end; ++i) {\n ret += String.fromCharCode(buf[i])\n }\n return ret\n}\n\nfunction hexSlice (buf, start, end) {\n const len = buf.length\n\n if (!start || start < 0) start = 0\n if (!end || end < 0 || end > len) end = len\n\n let out = ''\n for (let i = start; i < end; ++i) {\n out += hexSliceLookupTable[buf[i]]\n }\n return out\n}\n\nfunction utf16leSlice (buf, start, end) {\n const bytes = buf.slice(start, end)\n let res = ''\n // If bytes.length is odd, the last 8 bits must be ignored (same as node.js)\n for (let i = 0; i < bytes.length - 1; i += 2) {\n res += String.fromCharCode(bytes[i] + (bytes[i + 1] * 256))\n }\n return res\n}\n\nBuffer.prototype.slice = function slice (start, end) {\n const len = this.length\n start = ~~start\n end = end === undefined ? len : ~~end\n\n if (start < 0) {\n start += len\n if (start < 0) start = 0\n } else if (start > len) {\n start = len\n }\n\n if (end < 0) {\n end += len\n if (end < 0) end = 0\n } else if (end > len) {\n end = len\n }\n\n if (end < start) end = start\n\n const newBuf = this.subarray(start, end)\n // Return an augmented `Uint8Array` instance\n Object.setPrototypeOf(newBuf, Buffer.prototype)\n\n return newBuf\n}\n\n/*\n * Need to make sure that buffer isn't trying to write out of bounds.\n */\nfunction checkOffset (offset, ext, length) {\n if ((offset % 1) !== 0 || offset < 0) throw new RangeError('offset is not uint')\n if (offset + ext > length) throw new RangeError('Trying to access beyond buffer length')\n}\n\nBuffer.prototype.readUintLE =\nBuffer.prototype.readUIntLE = function readUIntLE (offset, byteLength, noAssert) {\n offset = offset >>> 0\n byteLength = byteLength >>> 0\n if (!noAssert) checkOffset(offset, byteLength, this.length)\n\n let val = this[offset]\n let mul = 1\n let i = 0\n while (++i < byteLength && (mul *= 0x100)) {\n val += this[offset + i] * mul\n }\n\n return val\n}\n\nBuffer.prototype.readUintBE =\nBuffer.prototype.readUIntBE = function readUIntBE (offset, byteLength, noAssert) {\n offset = offset >>> 0\n byteLength = byteLength >>> 0\n if (!noAssert) {\n checkOffset(offset, byteLength, this.length)\n }\n\n let val = this[offset + --byteLength]\n let mul = 1\n while (byteLength > 0 && (mul *= 0x100)) {\n val += this[offset + --byteLength] * mul\n }\n\n return val\n}\n\nBuffer.prototype.readUint8 =\nBuffer.prototype.readUInt8 = function readUInt8 (offset, noAssert) {\n offset = offset >>> 0\n if (!noAssert) checkOffset(offset, 1, this.length)\n return this[offset]\n}\n\nBuffer.prototype.readUint16LE =\nBuffer.prototype.readUInt16LE = function readUInt16LE (offset, noAssert) {\n offset = offset >>> 0\n if (!noAssert) checkOffset(offset, 2, this.length)\n return this[offset] | (this[offset + 1] << 8)\n}\n\nBuffer.prototype.readUint16BE =\nBuffer.prototype.readUInt16BE = function readUInt16BE (offset, noAssert) {\n offset = offset >>> 0\n if (!noAssert) checkOffset(offset, 2, this.length)\n return (this[offset] << 8) | this[offset + 1]\n}\n\nBuffer.prototype.readUint32LE =\nBuffer.prototype.readUInt32LE = function readUInt32LE (offset, noAssert) {\n offset = offset >>> 0\n if (!noAssert) checkOffset(offset, 4, this.length)\n\n return ((this[offset]) |\n (this[offset + 1] << 8) |\n (this[offset + 2] << 16)) +\n (this[offset + 3] * 0x1000000)\n}\n\nBuffer.prototype.readUint32BE =\nBuffer.prototype.readUInt32BE = function readUInt32BE (offset, noAssert) {\n offset = offset >>> 0\n if (!noAssert) checkOffset(offset, 4, this.length)\n\n return (this[offset] * 0x1000000) +\n ((this[offset + 1] << 16) |\n (this[offset + 2] << 8) |\n this[offset + 3])\n}\n\nBuffer.prototype.readBigUInt64LE = defineBigIntMethod(function readBigUInt64LE (offset) {\n offset = offset >>> 0\n validateNumber(offset, 'offset')\n const first = this[offset]\n const last = this[offset + 7]\n if (first === undefined || last === undefined) {\n boundsError(offset, this.length - 8)\n }\n\n const lo = first +\n this[++offset] * 2 ** 8 +\n this[++offset] * 2 ** 16 +\n this[++offset] * 2 ** 24\n\n const hi = this[++offset] +\n this[++offset] * 2 ** 8 +\n this[++offset] * 2 ** 16 +\n last * 2 ** 24\n\n return BigInt(lo) + (BigInt(hi) << BigInt(32))\n})\n\nBuffer.prototype.readBigUInt64BE = defineBigIntMethod(function readBigUInt64BE (offset) {\n offset = offset >>> 0\n validateNumber(offset, 'offset')\n const first = this[offset]\n const last = this[offset + 7]\n if (first === undefined || last === undefined) {\n boundsError(offset, this.length - 8)\n }\n\n const hi = first * 2 ** 24 +\n this[++offset] * 2 ** 16 +\n this[++offset] * 2 ** 8 +\n this[++offset]\n\n const lo = this[++offset] * 2 ** 24 +\n this[++offset] * 2 ** 16 +\n this[++offset] * 2 ** 8 +\n last\n\n return (BigInt(hi) << BigInt(32)) + BigInt(lo)\n})\n\nBuffer.prototype.readIntLE = function readIntLE (offset, byteLength, noAssert) {\n offset = offset >>> 0\n byteLength = byteLength >>> 0\n if (!noAssert) checkOffset(offset, byteLength, this.length)\n\n let val = this[offset]\n let mul = 1\n let i = 0\n while (++i < byteLength && (mul *= 0x100)) {\n val += this[offset + i] * mul\n }\n mul *= 0x80\n\n if (val >= mul) val -= Math.pow(2, 8 * byteLength)\n\n return val\n}\n\nBuffer.prototype.readIntBE = function readIntBE (offset, byteLength, noAssert) {\n offset = offset >>> 0\n byteLength = byteLength >>> 0\n if (!noAssert) checkOffset(offset, byteLength, this.length)\n\n let i = byteLength\n let mul = 1\n let val = this[offset + --i]\n while (i > 0 && (mul *= 0x100)) {\n val += this[offset + --i] * mul\n }\n mul *= 0x80\n\n if (val >= mul) val -= Math.pow(2, 8 * byteLength)\n\n return val\n}\n\nBuffer.prototype.readInt8 = function readInt8 (offset, noAssert) {\n offset = offset >>> 0\n if (!noAssert) checkOffset(offset, 1, this.length)\n if (!(this[offset] & 0x80)) return (this[offset])\n return ((0xff - this[offset] + 1) * -1)\n}\n\nBuffer.prototype.readInt16LE = function readInt16LE (offset, noAssert) {\n offset = offset >>> 0\n if (!noAssert) checkOffset(offset, 2, this.length)\n const val = this[offset] | (this[offset + 1] << 8)\n return (val & 0x8000) ? val | 0xFFFF0000 : val\n}\n\nBuffer.prototype.readInt16BE = function readInt16BE (offset, noAssert) {\n offset = offset >>> 0\n if (!noAssert) checkOffset(offset, 2, this.length)\n const val = this[offset + 1] | (this[offset] << 8)\n return (val & 0x8000) ? val | 0xFFFF0000 : val\n}\n\nBuffer.prototype.readInt32LE = function readInt32LE (offset, noAssert) {\n offset = offset >>> 0\n if (!noAssert) checkOffset(offset, 4, this.length)\n\n return (this[offset]) |\n (this[offset + 1] << 8) |\n (this[offset + 2] << 16) |\n (this[offset + 3] << 24)\n}\n\nBuffer.prototype.readInt32BE = function readInt32BE (offset, noAssert) {\n offset = offset >>> 0\n if (!noAssert) checkOffset(offset, 4, this.length)\n\n return (this[offset] << 24) |\n (this[offset + 1] << 16) |\n (this[offset + 2] << 8) |\n (this[offset + 3])\n}\n\nBuffer.prototype.readBigInt64LE = defineBigIntMethod(function readBigInt64LE (offset) {\n offset = offset >>> 0\n validateNumber(offset, 'offset')\n const first = this[offset]\n const last = this[offset + 7]\n if (first === undefined || last === undefined) {\n boundsError(offset, this.length - 8)\n }\n\n const val = this[offset + 4] +\n this[offset + 5] * 2 ** 8 +\n this[offset + 6] * 2 ** 16 +\n (last << 24) // Overflow\n\n return (BigInt(val) << BigInt(32)) +\n BigInt(first +\n this[++offset] * 2 ** 8 +\n this[++offset] * 2 ** 16 +\n this[++offset] * 2 ** 24)\n})\n\nBuffer.prototype.readBigInt64BE = defineBigIntMethod(function readBigInt64BE (offset) {\n offset = offset >>> 0\n validateNumber(offset, 'offset')\n const first = this[offset]\n const last = this[offset + 7]\n if (first === undefined || last === undefined) {\n boundsError(offset, this.length - 8)\n }\n\n const val = (first << 24) + // Overflow\n this[++offset] * 2 ** 16 +\n this[++offset] * 2 ** 8 +\n this[++offset]\n\n return (BigInt(val) << BigInt(32)) +\n BigInt(this[++offset] * 2 ** 24 +\n this[++offset] * 2 ** 16 +\n this[++offset] * 2 ** 8 +\n last)\n})\n\nBuffer.prototype.readFloatLE = function readFloatLE (offset, noAssert) {\n offset = offset >>> 0\n if (!noAssert) checkOffset(offset, 4, this.length)\n return ieee754.read(this, offset, true, 23, 4)\n}\n\nBuffer.prototype.readFloatBE = function readFloatBE (offset, noAssert) {\n offset = offset >>> 0\n if (!noAssert) checkOffset(offset, 4, this.length)\n return ieee754.read(this, offset, false, 23, 4)\n}\n\nBuffer.prototype.readDoubleLE = function readDoubleLE (offset, noAssert) {\n offset = offset >>> 0\n if (!noAssert) checkOffset(offset, 8, this.length)\n return ieee754.read(this, offset, true, 52, 8)\n}\n\nBuffer.prototype.readDoubleBE = function readDoubleBE (offset, noAssert) {\n offset = offset >>> 0\n if (!noAssert) checkOffset(offset, 8, this.length)\n return ieee754.read(this, offset, false, 52, 8)\n}\n\nfunction checkInt (buf, value, offset, ext, max, min) {\n if (!Buffer.isBuffer(buf)) throw new TypeError('\"buffer\" argument must be a Buffer instance')\n if (value > max || value < min) throw new RangeError('\"value\" argument is out of bounds')\n if (offset + ext > buf.length) throw new RangeError('Index out of range')\n}\n\nBuffer.prototype.writeUintLE =\nBuffer.prototype.writeUIntLE = function writeUIntLE (value, offset, byteLength, noAssert) {\n value = +value\n offset = offset >>> 0\n byteLength = byteLength >>> 0\n if (!noAssert) {\n const maxBytes = Math.pow(2, 8 * byteLength) - 1\n checkInt(this, value, offset, byteLength, maxBytes, 0)\n }\n\n let mul = 1\n let i = 0\n this[offset] = value & 0xFF\n while (++i < byteLength && (mul *= 0x100)) {\n this[offset + i] = (value / mul) & 0xFF\n }\n\n return offset + byteLength\n}\n\nBuffer.prototype.writeUintBE =\nBuffer.prototype.writeUIntBE = function writeUIntBE (value, offset, byteLength, noAssert) {\n value = +value\n offset = offset >>> 0\n byteLength = byteLength >>> 0\n if (!noAssert) {\n const maxBytes = Math.pow(2, 8 * byteLength) - 1\n checkInt(this, value, offset, byteLength, maxBytes, 0)\n }\n\n let i = byteLength - 1\n let mul = 1\n this[offset + i] = value & 0xFF\n while (--i >= 0 && (mul *= 0x100)) {\n this[offset + i] = (value / mul) & 0xFF\n }\n\n return offset + byteLength\n}\n\nBuffer.prototype.writeUint8 =\nBuffer.prototype.writeUInt8 = function writeUInt8 (value, offset, noAssert) {\n value = +value\n offset = offset >>> 0\n if (!noAssert) checkInt(this, value, offset, 1, 0xff, 0)\n this[offset] = (value & 0xff)\n return offset + 1\n}\n\nBuffer.prototype.writeUint16LE =\nBuffer.prototype.writeUInt16LE = function writeUInt16LE (value, offset, noAssert) {\n value = +value\n offset = offset >>> 0\n if (!noAssert) checkInt(this, value, offset, 2, 0xffff, 0)\n this[offset] = (value & 0xff)\n this[offset + 1] = (value >>> 8)\n return offset + 2\n}\n\nBuffer.prototype.writeUint16BE =\nBuffer.prototype.writeUInt16BE = function writeUInt16BE (value, offset, noAssert) {\n value = +value\n offset = offset >>> 0\n if (!noAssert) checkInt(this, value, offset, 2, 0xffff, 0)\n this[offset] = (value >>> 8)\n this[offset + 1] = (value & 0xff)\n return offset + 2\n}\n\nBuffer.prototype.writeUint32LE =\nBuffer.prototype.writeUInt32LE = function writeUInt32LE (value, offset, noAssert) {\n value = +value\n offset = offset >>> 0\n if (!noAssert) checkInt(this, value, offset, 4, 0xffffffff, 0)\n this[offset + 3] = (value >>> 24)\n this[offset + 2] = (value >>> 16)\n this[offset + 1] = (value >>> 8)\n this[offset] = (value & 0xff)\n return offset + 4\n}\n\nBuffer.prototype.writeUint32BE =\nBuffer.prototype.writeUInt32BE = function writeUInt32BE (value, offset, noAssert) {\n value = +value\n offset = offset >>> 0\n if (!noAssert) checkInt(this, value, offset, 4, 0xffffffff, 0)\n this[offset] = (value >>> 24)\n this[offset + 1] = (value >>> 16)\n this[offset + 2] = (value >>> 8)\n this[offset + 3] = (value & 0xff)\n return offset + 4\n}\n\nfunction wrtBigUInt64LE (buf, value, offset, min, max) {\n checkIntBI(value, min, max, buf, offset, 7)\n\n let lo = Number(value & BigInt(0xffffffff))\n buf[offset++] = lo\n lo = lo >> 8\n buf[offset++] = lo\n lo = lo >> 8\n buf[offset++] = lo\n lo = lo >> 8\n buf[offset++] = lo\n let hi = Number(value >> BigInt(32) & BigInt(0xffffffff))\n buf[offset++] = hi\n hi = hi >> 8\n buf[offset++] = hi\n hi = hi >> 8\n buf[offset++] = hi\n hi = hi >> 8\n buf[offset++] = hi\n return offset\n}\n\nfunction wrtBigUInt64BE (buf, value, offset, min, max) {\n checkIntBI(value, min, max, buf, offset, 7)\n\n let lo = Number(value & BigInt(0xffffffff))\n buf[offset + 7] = lo\n lo = lo >> 8\n buf[offset + 6] = lo\n lo = lo >> 8\n buf[offset + 5] = lo\n lo = lo >> 8\n buf[offset + 4] = lo\n let hi = Number(value >> BigInt(32) & BigInt(0xffffffff))\n buf[offset + 3] = hi\n hi = hi >> 8\n buf[offset + 2] = hi\n hi = hi >> 8\n buf[offset + 1] = hi\n hi = hi >> 8\n buf[offset] = hi\n return offset + 8\n}\n\nBuffer.prototype.writeBigUInt64LE = defineBigIntMethod(function writeBigUInt64LE (value, offset = 0) {\n return wrtBigUInt64LE(this, value, offset, BigInt(0), BigInt('0xffffffffffffffff'))\n})\n\nBuffer.prototype.writeBigUInt64BE = defineBigIntMethod(function writeBigUInt64BE (value, offset = 0) {\n return wrtBigUInt64BE(this, value, offset, BigInt(0), BigInt('0xffffffffffffffff'))\n})\n\nBuffer.prototype.writeIntLE = function writeIntLE (value, offset, byteLength, noAssert) {\n value = +value\n offset = offset >>> 0\n if (!noAssert) {\n const limit = Math.pow(2, (8 * byteLength) - 1)\n\n checkInt(this, value, offset, byteLength, limit - 1, -limit)\n }\n\n let i = 0\n let mul = 1\n let sub = 0\n this[offset] = value & 0xFF\n while (++i < byteLength && (mul *= 0x100)) {\n if (value < 0 && sub === 0 && this[offset + i - 1] !== 0) {\n sub = 1\n }\n this[offset + i] = ((value / mul) >> 0) - sub & 0xFF\n }\n\n return offset + byteLength\n}\n\nBuffer.prototype.writeIntBE = function writeIntBE (value, offset, byteLength, noAssert) {\n value = +value\n offset = offset >>> 0\n if (!noAssert) {\n const limit = Math.pow(2, (8 * byteLength) - 1)\n\n checkInt(this, value, offset, byteLength, limit - 1, -limit)\n }\n\n let i = byteLength - 1\n let mul = 1\n let sub = 0\n this[offset + i] = value & 0xFF\n while (--i >= 0 && (mul *= 0x100)) {\n if (value < 0 && sub === 0 && this[offset + i + 1] !== 0) {\n sub = 1\n }\n this[offset + i] = ((value / mul) >> 0) - sub & 0xFF\n }\n\n return offset + byteLength\n}\n\nBuffer.prototype.writeInt8 = function writeInt8 (value, offset, noAssert) {\n value = +value\n offset = offset >>> 0\n if (!noAssert) checkInt(this, value, offset, 1, 0x7f, -0x80)\n if (value < 0) value = 0xff + value + 1\n this[offset] = (value & 0xff)\n return offset + 1\n}\n\nBuffer.prototype.writeInt16LE = function writeInt16LE (value, offset, noAssert) {\n value = +value\n offset = offset >>> 0\n if (!noAssert) checkInt(this, value, offset, 2, 0x7fff, -0x8000)\n this[offset] = (value & 0xff)\n this[offset + 1] = (value >>> 8)\n return offset + 2\n}\n\nBuffer.prototype.writeInt16BE = function writeInt16BE (value, offset, noAssert) {\n value = +value\n offset = offset >>> 0\n if (!noAssert) checkInt(this, value, offset, 2, 0x7fff, -0x8000)\n this[offset] = (value >>> 8)\n this[offset + 1] = (value & 0xff)\n return offset + 2\n}\n\nBuffer.prototype.writeInt32LE = function writeInt32LE (value, offset, noAssert) {\n value = +value\n offset = offset >>> 0\n if (!noAssert) checkInt(this, value, offset, 4, 0x7fffffff, -0x80000000)\n this[offset] = (value & 0xff)\n this[offset + 1] = (value >>> 8)\n this[offset + 2] = (value >>> 16)\n this[offset + 3] = (value >>> 24)\n return offset + 4\n}\n\nBuffer.prototype.writeInt32BE = function writeInt32BE (value, offset, noAssert) {\n value = +value\n offset = offset >>> 0\n if (!noAssert) checkInt(this, value, offset, 4, 0x7fffffff, -0x80000000)\n if (value < 0) value = 0xffffffff + value + 1\n this[offset] = (value >>> 24)\n this[offset + 1] = (value >>> 16)\n this[offset + 2] = (value >>> 8)\n this[offset + 3] = (value & 0xff)\n return offset + 4\n}\n\nBuffer.prototype.writeBigInt64LE = defineBigIntMethod(function writeBigInt64LE (value, offset = 0) {\n return wrtBigUInt64LE(this, value, offset, -BigInt('0x8000000000000000'), BigInt('0x7fffffffffffffff'))\n})\n\nBuffer.prototype.writeBigInt64BE = defineBigIntMethod(function writeBigInt64BE (value, offset = 0) {\n return wrtBigUInt64BE(this, value, offset, -BigInt('0x8000000000000000'), BigInt('0x7fffffffffffffff'))\n})\n\nfunction checkIEEE754 (buf, value, offset, ext, max, min) {\n if (offset + ext > buf.length) throw new RangeError('Index out of range')\n if (offset < 0) throw new RangeError('Index out of range')\n}\n\nfunction writeFloat (buf, value, offset, littleEndian, noAssert) {\n value = +value\n offset = offset >>> 0\n if (!noAssert) {\n checkIEEE754(buf, value, offset, 4, 3.4028234663852886e+38, -3.4028234663852886e+38)\n }\n ieee754.write(buf, value, offset, littleEndian, 23, 4)\n return offset + 4\n}\n\nBuffer.prototype.writeFloatLE = function writeFloatLE (value, offset, noAssert) {\n return writeFloat(this, value, offset, true, noAssert)\n}\n\nBuffer.prototype.writeFloatBE = function writeFloatBE (value, offset, noAssert) {\n return writeFloat(this, value, offset, false, noAssert)\n}\n\nfunction writeDouble (buf, value, offset, littleEndian, noAssert) {\n value = +value\n offset = offset >>> 0\n if (!noAssert) {\n checkIEEE754(buf, value, offset, 8, 1.7976931348623157E+308, -1.7976931348623157E+308)\n }\n ieee754.write(buf, value, offset, littleEndian, 52, 8)\n return offset + 8\n}\n\nBuffer.prototype.writeDoubleLE = function writeDoubleLE (value, offset, noAssert) {\n return writeDouble(this, value, offset, true, noAssert)\n}\n\nBuffer.prototype.writeDoubleBE = function writeDoubleBE (value, offset, noAssert) {\n return writeDouble(this, value, offset, false, noAssert)\n}\n\n// copy(targetBuffer, targetStart=0, sourceStart=0, sourceEnd=buffer.length)\nBuffer.prototype.copy = function copy (target, targetStart, start, end) {\n if (!Buffer.isBuffer(target)) throw new TypeError('argument should be a Buffer')\n if (!start) start = 0\n if (!end && end !== 0) end = this.length\n if (targetStart >= target.length) targetStart = target.length\n if (!targetStart) targetStart = 0\n if (end > 0 && end < start) end = start\n\n // Copy 0 bytes; we're done\n if (end === start) return 0\n if (target.length === 0 || this.length === 0) return 0\n\n // Fatal error conditions\n if (targetStart < 0) {\n throw new RangeError('targetStart out of bounds')\n }\n if (start < 0 || start >= this.length) throw new RangeError('Index out of range')\n if (end < 0) throw new RangeError('sourceEnd out of bounds')\n\n // Are we oob?\n if (end > this.length) end = this.length\n if (target.length - targetStart < end - start) {\n end = target.length - targetStart + start\n }\n\n const len = end - start\n\n if (this === target && typeof Uint8Array.prototype.copyWithin === 'function') {\n // Use built-in when available, missing from IE11\n this.copyWithin(targetStart, start, end)\n } else {\n Uint8Array.prototype.set.call(\n target,\n this.subarray(start, end),\n targetStart\n )\n }\n\n return len\n}\n\n// Usage:\n// buffer.fill(number[, offset[, end]])\n// buffer.fill(buffer[, offset[, end]])\n// buffer.fill(string[, offset[, end]][, encoding])\nBuffer.prototype.fill = function fill (val, start, end, encoding) {\n // Handle string cases:\n if (typeof val === 'string') {\n if (typeof start === 'string') {\n encoding = start\n start = 0\n end = this.length\n } else if (typeof end === 'string') {\n encoding = end\n end = this.length\n }\n if (encoding !== undefined && typeof encoding !== 'string') {\n throw new TypeError('encoding must be a string')\n }\n if (typeof encoding === 'string' && !Buffer.isEncoding(encoding)) {\n throw new TypeError('Unknown encoding: ' + encoding)\n }\n if (val.length === 1) {\n const code = val.charCodeAt(0)\n if ((encoding === 'utf8' && code < 128) ||\n encoding === 'latin1') {\n // Fast path: If `val` fits into a single byte, use that numeric value.\n val = code\n }\n }\n } else if (typeof val === 'number') {\n val = val & 255\n } else if (typeof val === 'boolean') {\n val = Number(val)\n }\n\n // Invalid ranges are not set to a default, so can range check early.\n if (start < 0 || this.length < start || this.length < end) {\n throw new RangeError('Out of range index')\n }\n\n if (end <= start) {\n return this\n }\n\n start = start >>> 0\n end = end === undefined ? this.length : end >>> 0\n\n if (!val) val = 0\n\n let i\n if (typeof val === 'number') {\n for (i = start; i < end; ++i) {\n this[i] = val\n }\n } else {\n const bytes = Buffer.isBuffer(val)\n ? val\n : Buffer.from(val, encoding)\n const len = bytes.length\n if (len === 0) {\n throw new TypeError('The value \"' + val +\n '\" is invalid for argument \"value\"')\n }\n for (i = 0; i < end - start; ++i) {\n this[i + start] = bytes[i % len]\n }\n }\n\n return this\n}\n\n// CUSTOM ERRORS\n// =============\n\n// Simplified versions from Node, changed for Buffer-only usage\nconst errors = {}\nfunction E (sym, getMessage, Base) {\n errors[sym] = class NodeError extends Base {\n constructor () {\n super()\n\n Object.defineProperty(this, 'message', {\n value: getMessage.apply(this, arguments),\n writable: true,\n configurable: true\n })\n\n // Add the error code to the name to include it in the stack trace.\n this.name = `${this.name} [${sym}]`\n // Access the stack to generate the error message including the error code\n // from the name.\n this.stack // eslint-disable-line no-unused-expressions\n // Reset the name to the actual name.\n delete this.name\n }\n\n get code () {\n return sym\n }\n\n set code (value) {\n Object.defineProperty(this, 'code', {\n configurable: true,\n enumerable: true,\n value,\n writable: true\n })\n }\n\n toString () {\n return `${this.name} [${sym}]: ${this.message}`\n }\n }\n}\n\nE('ERR_BUFFER_OUT_OF_BOUNDS',\n function (name) {\n if (name) {\n return `${name} is outside of buffer bounds`\n }\n\n return 'Attempt to access memory outside buffer bounds'\n }, RangeError)\nE('ERR_INVALID_ARG_TYPE',\n function (name, actual) {\n return `The \"${name}\" argument must be of type number. Received type ${typeof actual}`\n }, TypeError)\nE('ERR_OUT_OF_RANGE',\n function (str, range, input) {\n let msg = `The value of \"${str}\" is out of range.`\n let received = input\n if (Number.isInteger(input) && Math.abs(input) > 2 ** 32) {\n received = addNumericalSeparator(String(input))\n } else if (typeof input === 'bigint') {\n received = String(input)\n if (input > BigInt(2) ** BigInt(32) || input < -(BigInt(2) ** BigInt(32))) {\n received = addNumericalSeparator(received)\n }\n received += 'n'\n }\n msg += ` It must be ${range}. Received ${received}`\n return msg\n }, RangeError)\n\nfunction addNumericalSeparator (val) {\n let res = ''\n let i = val.length\n const start = val[0] === '-' ? 1 : 0\n for (; i >= start + 4; i -= 3) {\n res = `_${val.slice(i - 3, i)}${res}`\n }\n return `${val.slice(0, i)}${res}`\n}\n\n// CHECK FUNCTIONS\n// ===============\n\nfunction checkBounds (buf, offset, byteLength) {\n validateNumber(offset, 'offset')\n if (buf[offset] === undefined || buf[offset + byteLength] === undefined) {\n boundsError(offset, buf.length - (byteLength + 1))\n }\n}\n\nfunction checkIntBI (value, min, max, buf, offset, byteLength) {\n if (value > max || value < min) {\n const n = typeof min === 'bigint' ? 'n' : ''\n let range\n if (byteLength > 3) {\n if (min === 0 || min === BigInt(0)) {\n range = `>= 0${n} and < 2${n} ** ${(byteLength + 1) * 8}${n}`\n } else {\n range = `>= -(2${n} ** ${(byteLength + 1) * 8 - 1}${n}) and < 2 ** ` +\n `${(byteLength + 1) * 8 - 1}${n}`\n }\n } else {\n range = `>= ${min}${n} and <= ${max}${n}`\n }\n throw new errors.ERR_OUT_OF_RANGE('value', range, value)\n }\n checkBounds(buf, offset, byteLength)\n}\n\nfunction validateNumber (value, name) {\n if (typeof value !== 'number') {\n throw new errors.ERR_INVALID_ARG_TYPE(name, 'number', value)\n }\n}\n\nfunction boundsError (value, length, type) {\n if (Math.floor(value) !== value) {\n validateNumber(value, type)\n throw new errors.ERR_OUT_OF_RANGE(type || 'offset', 'an integer', value)\n }\n\n if (length < 0) {\n throw new errors.ERR_BUFFER_OUT_OF_BOUNDS()\n }\n\n throw new errors.ERR_OUT_OF_RANGE(type || 'offset',\n `>= ${type ? 1 : 0} and <= ${length}`,\n value)\n}\n\n// HELPER FUNCTIONS\n// ================\n\nconst INVALID_BASE64_RE = /[^+/0-9A-Za-z-_]/g\n\nfunction base64clean (str) {\n // Node takes equal signs as end of the Base64 encoding\n str = str.split('=')[0]\n // Node strips out invalid characters like \\n and \\t from the string, base64-js does not\n str = str.trim().replace(INVALID_BASE64_RE, '')\n // Node converts strings with length < 2 to ''\n if (str.length < 2) return ''\n // Node allows for non-padded base64 strings (missing trailing ===), base64-js does not\n while (str.length % 4 !== 0) {\n str = str + '='\n }\n return str\n}\n\nfunction utf8ToBytes (string, units) {\n units = units || Infinity\n let codePoint\n const length = string.length\n let leadSurrogate = null\n const bytes = []\n\n for (let i = 0; i < length; ++i) {\n codePoint = string.charCodeAt(i)\n\n // is surrogate component\n if (codePoint > 0xD7FF && codePoint < 0xE000) {\n // last char was a lead\n if (!leadSurrogate) {\n // no lead yet\n if (codePoint > 0xDBFF) {\n // unexpected trail\n if ((units -= 3) > -1) bytes.push(0xEF, 0xBF, 0xBD)\n continue\n } else if (i + 1 === length) {\n // unpaired lead\n if ((units -= 3) > -1) bytes.push(0xEF, 0xBF, 0xBD)\n continue\n }\n\n // valid lead\n leadSurrogate = codePoint\n\n continue\n }\n\n // 2 leads in a row\n if (codePoint < 0xDC00) {\n if ((units -= 3) > -1) bytes.push(0xEF, 0xBF, 0xBD)\n leadSurrogate = codePoint\n continue\n }\n\n // valid surrogate pair\n codePoint = (leadSurrogate - 0xD800 << 10 | codePoint - 0xDC00) + 0x10000\n } else if (leadSurrogate) {\n // valid bmp char, but last char was a lead\n if ((units -= 3) > -1) bytes.push(0xEF, 0xBF, 0xBD)\n }\n\n leadSurrogate = null\n\n // encode utf8\n if (codePoint < 0x80) {\n if ((units -= 1) < 0) break\n bytes.push(codePoint)\n } else if (codePoint < 0x800) {\n if ((units -= 2) < 0) break\n bytes.push(\n codePoint >> 0x6 | 0xC0,\n codePoint & 0x3F | 0x80\n )\n } else if (codePoint < 0x10000) {\n if ((units -= 3) < 0) break\n bytes.push(\n codePoint >> 0xC | 0xE0,\n codePoint >> 0x6 & 0x3F | 0x80,\n codePoint & 0x3F | 0x80\n )\n } else if (codePoint < 0x110000) {\n if ((units -= 4) < 0) break\n bytes.push(\n codePoint >> 0x12 | 0xF0,\n codePoint >> 0xC & 0x3F | 0x80,\n codePoint >> 0x6 & 0x3F | 0x80,\n codePoint & 0x3F | 0x80\n )\n } else {\n throw new Error('Invalid code point')\n }\n }\n\n return bytes\n}\n\nfunction asciiToBytes (str) {\n const byteArray = []\n for (let i = 0; i < str.length; ++i) {\n // Node's code seems to be doing this and not & 0x7F..\n byteArray.push(str.charCodeAt(i) & 0xFF)\n }\n return byteArray\n}\n\nfunction utf16leToBytes (str, units) {\n let c, hi, lo\n const byteArray = []\n for (let i = 0; i < str.length; ++i) {\n if ((units -= 2) < 0) break\n\n c = str.charCodeAt(i)\n hi = c >> 8\n lo = c % 256\n byteArray.push(lo)\n byteArray.push(hi)\n }\n\n return byteArray\n}\n\nfunction base64ToBytes (str) {\n return base64.toByteArray(base64clean(str))\n}\n\nfunction blitBuffer (src, dst, offset, length) {\n let i\n for (i = 0; i < length; ++i) {\n if ((i + offset >= dst.length) || (i >= src.length)) break\n dst[i + offset] = src[i]\n }\n return i\n}\n\n// ArrayBuffer or Uint8Array objects from other contexts (i.e. iframes) do not pass\n// the `instanceof` check but they should be treated as of that type.\n// See: https://github.com/feross/buffer/issues/166\nfunction isInstance (obj, type) {\n return obj instanceof type ||\n (obj != null && obj.constructor != null && obj.constructor.name != null &&\n obj.constructor.name === type.name)\n}\nfunction numberIsNaN (obj) {\n // For IE11 support\n return obj !== obj // eslint-disable-line no-self-compare\n}\n\n// Create lookup table for `toString('hex')`\n// See: https://github.com/feross/buffer/issues/219\nconst hexSliceLookupTable = (function () {\n const alphabet = '0123456789abcdef'\n const table = new Array(256)\n for (let i = 0; i < 16; ++i) {\n const i16 = i * 16\n for (let j = 0; j < 16; ++j) {\n table[i16 + j] = alphabet[i] + alphabet[j]\n }\n }\n return table\n})()\n\n// Return not function with Error if BigInt not supported\nfunction defineBigIntMethod (fn) {\n return typeof BigInt === 'undefined' ? BufferBigIntNotDefined : fn\n}\n\nfunction BufferBigIntNotDefined () {\n throw new Error('BigInt not supported')\n}\n","// extracted by extract-css-chunks-webpack-plugin\nmodule.exports = {};","// extracted by extract-css-chunks-webpack-plugin\nmodule.exports = {\"nodeStrokeWidth\":\"0.8\",\"directionArrowSize\":\"6\",\"directionArrowWidth\":\"0.7\",\"node\":\"fornac-node\",\"directionArrow\":\"fornac-directionArrow\",\"plot\":\"fornac-plot\",\"selectedNode\":\"fornac-selectedNode\",\"nodeLabel\":\"fornac-nodeLabel\",\"link\":\"fornac-link\",\"plotLabel\":\"fornac-plotLabel\",\"transparent\":\"fornac-transparent\",\"dragLine\":\"fornac-dragLine\",\"mouseEventHelper\":\"fornac-mouseEventHelper\"};","/*! ieee754. BSD-3-Clause License. Feross Aboukhadijeh */\nexports.read = function (buffer, offset, isLE, mLen, nBytes) {\n var e, m\n var eLen = (nBytes * 8) - mLen - 1\n var eMax = (1 << eLen) - 1\n var eBias = eMax >> 1\n var nBits = -7\n var i = isLE ? (nBytes - 1) : 0\n var d = isLE ? -1 : 1\n var s = buffer[offset + i]\n\n i += d\n\n e = s & ((1 << (-nBits)) - 1)\n s >>= (-nBits)\n nBits += eLen\n for (; nBits > 0; e = (e * 256) + buffer[offset + i], i += d, nBits -= 8) {}\n\n m = e & ((1 << (-nBits)) - 1)\n e >>= (-nBits)\n nBits += mLen\n for (; nBits > 0; m = (m * 256) + buffer[offset + i], i += d, nBits -= 8) {}\n\n if (e === 0) {\n e = 1 - eBias\n } else if (e === eMax) {\n return m ? NaN : ((s ? -1 : 1) * Infinity)\n } else {\n m = m + Math.pow(2, mLen)\n e = e - eBias\n }\n return (s ? -1 : 1) * m * Math.pow(2, e - mLen)\n}\n\nexports.write = function (buffer, value, offset, isLE, mLen, nBytes) {\n var e, m, c\n var eLen = (nBytes * 8) - mLen - 1\n var eMax = (1 << eLen) - 1\n var eBias = eMax >> 1\n var rt = (mLen === 23 ? Math.pow(2, -24) - Math.pow(2, -77) : 0)\n var i = isLE ? 0 : (nBytes - 1)\n var d = isLE ? 1 : -1\n var s = value < 0 || (value === 0 && 1 / value < 0) ? 1 : 0\n\n value = Math.abs(value)\n\n if (isNaN(value) || value === Infinity) {\n m = isNaN(value) ? 1 : 0\n e = eMax\n } else {\n e = Math.floor(Math.log(value) / Math.LN2)\n if (value * (c = Math.pow(2, -e)) < 1) {\n e--\n c *= 2\n }\n if (e + eBias >= 1) {\n value += rt / c\n } else {\n value += rt * Math.pow(2, 1 - eBias)\n }\n if (value * c >= 2) {\n e++\n c /= 2\n }\n\n if (e + eBias >= eMax) {\n m = 0\n e = eMax\n } else if (e + eBias >= 1) {\n m = ((value * c) - 1) * Math.pow(2, mLen)\n e = e + eBias\n } else {\n m = value * Math.pow(2, eBias - 1) * Math.pow(2, mLen)\n e = 0\n }\n }\n\n for (; mLen >= 8; buffer[offset + i] = m & 0xff, i += d, m /= 256, mLen -= 8) {}\n\n e = (e << mLen) | m\n eLen += mLen\n for (; eLen > 0; buffer[offset + i] = e & 0xff, i += d, e /= 256, eLen -= 8) {}\n\n buffer[offset + i - d] |= s * 128\n}\n","// The MIT License (MIT)\n//\n// Copyright (c) 2014 Jonas Finnemann Jensen\n//\n// Permission is hereby granted, free of charge, to any person obtaining a copy\n// of this software and associated documentation files (the \"Software\"), to deal\n// in the Software without restriction, including without limitation the rights\n// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n// copies of the Software, and to permit persons to whom the Software is\n// furnished to do so, subject to the following conditions:\n//\n// The above copyright notice and this permission notice shall be included in\n// all copies or substantial portions of the Software.\n//\n// THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n// THE SOFTWARE.\n\nmodule.exports = require('./slugid');\n","// The MIT License (MIT)\n//\n// Copyright (c) 2014 Jonas Finnemann Jensen\n//\n// Permission is hereby granted, free of charge, to any person obtaining a copy\n// of this software and associated documentation files (the \"Software\"), to deal\n// in the Software without restriction, including without limitation the rights\n// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n// copies of the Software, and to permit persons to whom the Software is\n// furnished to do so, subject to the following conditions:\n//\n// The above copyright notice and this permission notice shall be included in\n// all copies or substantial portions of the Software.\n//\n// THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n// THE SOFTWARE.\n\nvar uuid = require('uuid');\n\n/**\n * Returns the given uuid as a 22 character slug. This can be a regular v4\n * slug or a \"nice\" slug.\n */\nexports.encode = function(uuid_) {\n var bytes = uuid.parse(uuid_);\n var base64 = Buffer.from(bytes).toString('base64');\n var slug = base64\n .replace(/\\+/g, '-') // Replace + with - (see RFC 4648, sec. 5)\n .replace(/\\//g, '_') // Replace / with _ (see RFC 4648, sec. 5)\n .substring(0, 22); // Drop '==' padding\n return slug;\n};\n\n/**\n * Returns the uuid represented by the given v4 or \"nice\" slug\n */\nexports.decode = function(slug) {\n var base64 = slug\n .replace(/-/g, '+')\n .replace(/_/g, '/')\n + '==';\n return uuid.stringify(Buffer.from(base64, 'base64'));\n};\n\n/**\n * Returns a randomly generated uuid v4 compliant slug\n */\nexports.v4 = function() {\n var bytes = uuid.v4(null, Buffer.alloc(16));\n var base64 = bytes.toString('base64');\n var slug = base64\n .replace(/\\+/g, '-') // Replace + with - (see RFC 4648, sec. 5)\n .replace(/\\//g, '_') // Replace / with _ (see RFC 4648, sec. 5)\n .substring(0, 22); // Drop '==' padding\n return slug;\n};\n\n/**\n * Returns a randomly generated uuid v4 compliant slug which conforms to a set\n * of \"nice\" properties, at the cost of some entropy. Currently this means one\n * extra fixed bit (the first bit of the uuid is set to 0) which guarantees the\n * slug will begin with [A-Za-f]. For example such slugs don't require special\n * handling when used as command line parameters (whereas non-nice slugs may\n * start with `-` which can confuse command line tools).\n *\n * Potentially other \"nice\" properties may be added in future to further\n * restrict the range of potential uuids that may be generated.\n */\nexports.nice = function() {\n var bytes = uuid.v4(null, Buffer.alloc(16));\n bytes[0] = bytes[0] & 0x7f; // unset first bit to ensure [A-Za-f] first char\n var base64 = bytes.toString('base64');\n var slug = base64\n .replace(/\\+/g, '-') // Replace + with - (see RFC 4648, sec. 5)\n .replace(/\\//g, '_') // Replace / with _ (see RFC 4648, sec. 5)\n .substring(0, 22); // Drop '==' padding\n return slug;\n};\n","// Unique ID creation requires a high quality random # generator. In the browser we therefore\n// require the crypto API and do not support built-in fallback to lower quality random number\n// generators (like Math.random()).\nvar getRandomValues;\nvar rnds8 = new Uint8Array(16);\nexport default function rng() {\n // lazy load so that environments that need to polyfill have a chance to do so\n if (!getRandomValues) {\n // getRandomValues needs to be invoked in a context where \"this\" is a Crypto implementation. Also,\n // find the complete implementation of crypto (msCrypto) on IE11.\n getRandomValues = typeof crypto !== 'undefined' && crypto.getRandomValues && crypto.getRandomValues.bind(crypto) || typeof msCrypto !== 'undefined' && typeof msCrypto.getRandomValues === 'function' && msCrypto.getRandomValues.bind(msCrypto);\n\n if (!getRandomValues) {\n throw new Error('crypto.getRandomValues() not supported. See https://github.com/uuidjs/uuid#getrandomvalues-not-supported');\n }\n }\n\n return getRandomValues(rnds8);\n}","export default /^(?:[0-9a-f]{8}-[0-9a-f]{4}-[1-5][0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}|00000000-0000-0000-0000-000000000000)$/i;","import REGEX from './regex.js';\n\nfunction validate(uuid) {\n return typeof uuid === 'string' && REGEX.test(uuid);\n}\n\nexport default validate;","import validate from './validate.js';\n/**\n * Convert array of 16 byte values to UUID string format of the form:\n * XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX\n */\n\nvar byteToHex = [];\n\nfor (var i = 0; i < 256; ++i) {\n byteToHex.push((i + 0x100).toString(16).substr(1));\n}\n\nfunction stringify(arr) {\n var offset = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 0;\n // Note: Be careful editing this code! It's been tuned for performance\n // and works in ways you may not expect. See https://github.com/uuidjs/uuid/pull/434\n var uuid = (byteToHex[arr[offset + 0]] + byteToHex[arr[offset + 1]] + byteToHex[arr[offset + 2]] + byteToHex[arr[offset + 3]] + '-' + byteToHex[arr[offset + 4]] + byteToHex[arr[offset + 5]] + '-' + byteToHex[arr[offset + 6]] + byteToHex[arr[offset + 7]] + '-' + byteToHex[arr[offset + 8]] + byteToHex[arr[offset + 9]] + '-' + byteToHex[arr[offset + 10]] + byteToHex[arr[offset + 11]] + byteToHex[arr[offset + 12]] + byteToHex[arr[offset + 13]] + byteToHex[arr[offset + 14]] + byteToHex[arr[offset + 15]]).toLowerCase(); // Consistency check for valid UUID. If this throws, it's likely due to one\n // of the following:\n // - One or more input array values don't map to a hex octet (leading to\n // \"undefined\" in the uuid)\n // - Invalid input values for the RFC `version` or `variant` fields\n\n if (!validate(uuid)) {\n throw TypeError('Stringified UUID is invalid');\n }\n\n return uuid;\n}\n\nexport default stringify;","import rng from './rng.js';\nimport stringify from './stringify.js'; // **`v1()` - Generate time-based UUID**\n//\n// Inspired by https://github.com/LiosK/UUID.js\n// and http://docs.python.org/library/uuid.html\n\nvar _nodeId;\n\nvar _clockseq; // Previous uuid creation time\n\n\nvar _lastMSecs = 0;\nvar _lastNSecs = 0; // See https://github.com/uuidjs/uuid for API details\n\nfunction v1(options, buf, offset) {\n var i = buf && offset || 0;\n var b = buf || new Array(16);\n options = options || {};\n var node = options.node || _nodeId;\n var clockseq = options.clockseq !== undefined ? options.clockseq : _clockseq; // node and clockseq need to be initialized to random values if they're not\n // specified. We do this lazily to minimize issues related to insufficient\n // system entropy. See #189\n\n if (node == null || clockseq == null) {\n var seedBytes = options.random || (options.rng || rng)();\n\n if (node == null) {\n // Per 4.5, create and 48-bit node id, (47 random bits + multicast bit = 1)\n node = _nodeId = [seedBytes[0] | 0x01, seedBytes[1], seedBytes[2], seedBytes[3], seedBytes[4], seedBytes[5]];\n }\n\n if (clockseq == null) {\n // Per 4.2.2, randomize (14 bit) clockseq\n clockseq = _clockseq = (seedBytes[6] << 8 | seedBytes[7]) & 0x3fff;\n }\n } // UUID timestamps are 100 nano-second units since the Gregorian epoch,\n // (1582-10-15 00:00). JSNumbers aren't precise enough for this, so\n // time is handled internally as 'msecs' (integer milliseconds) and 'nsecs'\n // (100-nanoseconds offset from msecs) since unix epoch, 1970-01-01 00:00.\n\n\n var msecs = options.msecs !== undefined ? options.msecs : Date.now(); // Per 4.2.1.2, use count of uuid's generated during the current clock\n // cycle to simulate higher resolution clock\n\n var nsecs = options.nsecs !== undefined ? options.nsecs : _lastNSecs + 1; // Time since last uuid creation (in msecs)\n\n var dt = msecs - _lastMSecs + (nsecs - _lastNSecs) / 10000; // Per 4.2.1.2, Bump clockseq on clock regression\n\n if (dt < 0 && options.clockseq === undefined) {\n clockseq = clockseq + 1 & 0x3fff;\n } // Reset nsecs if clock regresses (new clockseq) or we've moved onto a new\n // time interval\n\n\n if ((dt < 0 || msecs > _lastMSecs) && options.nsecs === undefined) {\n nsecs = 0;\n } // Per 4.2.1.2 Throw error if too many uuids are requested\n\n\n if (nsecs >= 10000) {\n throw new Error(\"uuid.v1(): Can't create more than 10M uuids/sec\");\n }\n\n _lastMSecs = msecs;\n _lastNSecs = nsecs;\n _clockseq = clockseq; // Per 4.1.4 - Convert from unix epoch to Gregorian epoch\n\n msecs += 12219292800000; // `time_low`\n\n var tl = ((msecs & 0xfffffff) * 10000 + nsecs) % 0x100000000;\n b[i++] = tl >>> 24 & 0xff;\n b[i++] = tl >>> 16 & 0xff;\n b[i++] = tl >>> 8 & 0xff;\n b[i++] = tl & 0xff; // `time_mid`\n\n var tmh = msecs / 0x100000000 * 10000 & 0xfffffff;\n b[i++] = tmh >>> 8 & 0xff;\n b[i++] = tmh & 0xff; // `time_high_and_version`\n\n b[i++] = tmh >>> 24 & 0xf | 0x10; // include version\n\n b[i++] = tmh >>> 16 & 0xff; // `clock_seq_hi_and_reserved` (Per 4.2.2 - include variant)\n\n b[i++] = clockseq >>> 8 | 0x80; // `clock_seq_low`\n\n b[i++] = clockseq & 0xff; // `node`\n\n for (var n = 0; n < 6; ++n) {\n b[i + n] = node[n];\n }\n\n return buf || stringify(b);\n}\n\nexport default v1;","import validate from './validate.js';\n\nfunction parse(uuid) {\n if (!validate(uuid)) {\n throw TypeError('Invalid UUID');\n }\n\n var v;\n var arr = new Uint8Array(16); // Parse ########-....-....-....-............\n\n arr[0] = (v = parseInt(uuid.slice(0, 8), 16)) >>> 24;\n arr[1] = v >>> 16 & 0xff;\n arr[2] = v >>> 8 & 0xff;\n arr[3] = v & 0xff; // Parse ........-####-....-....-............\n\n arr[4] = (v = parseInt(uuid.slice(9, 13), 16)) >>> 8;\n arr[5] = v & 0xff; // Parse ........-....-####-....-............\n\n arr[6] = (v = parseInt(uuid.slice(14, 18), 16)) >>> 8;\n arr[7] = v & 0xff; // Parse ........-....-....-####-............\n\n arr[8] = (v = parseInt(uuid.slice(19, 23), 16)) >>> 8;\n arr[9] = v & 0xff; // Parse ........-....-....-....-############\n // (Use \"/\" to avoid 32-bit truncation when bit-shifting high-order bytes)\n\n arr[10] = (v = parseInt(uuid.slice(24, 36), 16)) / 0x10000000000 & 0xff;\n arr[11] = v / 0x100000000 & 0xff;\n arr[12] = v >>> 24 & 0xff;\n arr[13] = v >>> 16 & 0xff;\n arr[14] = v >>> 8 & 0xff;\n arr[15] = v & 0xff;\n return arr;\n}\n\nexport default parse;","import stringify from './stringify.js';\nimport parse from './parse.js';\n\nfunction stringToBytes(str) {\n str = unescape(encodeURIComponent(str)); // UTF8 escape\n\n var bytes = [];\n\n for (var i = 0; i < str.length; ++i) {\n bytes.push(str.charCodeAt(i));\n }\n\n return bytes;\n}\n\nexport var DNS = '6ba7b810-9dad-11d1-80b4-00c04fd430c8';\nexport var URL = '6ba7b811-9dad-11d1-80b4-00c04fd430c8';\nexport default function (name, version, hashfunc) {\n function generateUUID(value, namespace, buf, offset) {\n if (typeof value === 'string') {\n value = stringToBytes(value);\n }\n\n if (typeof namespace === 'string') {\n namespace = parse(namespace);\n }\n\n if (namespace.length !== 16) {\n throw TypeError('Namespace must be array-like (16 iterable integer values, 0-255)');\n } // Compute hash of namespace and value, Per 4.3\n // Future: Use spread syntax when supported on all platforms, e.g. `bytes =\n // hashfunc([...namespace, ... value])`\n\n\n var bytes = new Uint8Array(16 + value.length);\n bytes.set(namespace);\n bytes.set(value, namespace.length);\n bytes = hashfunc(bytes);\n bytes[6] = bytes[6] & 0x0f | version;\n bytes[8] = bytes[8] & 0x3f | 0x80;\n\n if (buf) {\n offset = offset || 0;\n\n for (var i = 0; i < 16; ++i) {\n buf[offset + i] = bytes[i];\n }\n\n return buf;\n }\n\n return stringify(bytes);\n } // Function#name is not settable on some platforms (#270)\n\n\n try {\n generateUUID.name = name; // eslint-disable-next-line no-empty\n } catch (err) {} // For CommonJS default export support\n\n\n generateUUID.DNS = DNS;\n generateUUID.URL = URL;\n return generateUUID;\n}","/*\n * Browser-compatible JavaScript MD5\n *\n * Modification of JavaScript MD5\n * https://github.com/blueimp/JavaScript-MD5\n *\n * Copyright 2011, Sebastian Tschan\n * https://blueimp.net\n *\n * Licensed under the MIT license:\n * https://opensource.org/licenses/MIT\n *\n * Based on\n * A JavaScript implementation of the RSA Data Security, Inc. MD5 Message\n * Digest Algorithm, as defined in RFC 1321.\n * Version 2.2 Copyright (C) Paul Johnston 1999 - 2009\n * Other contributors: Greg Holt, Andrew Kepert, Ydnar, Lostinet\n * Distributed under the BSD License\n * See http://pajhome.org.uk/crypt/md5 for more info.\n */\nfunction md5(bytes) {\n if (typeof bytes === 'string') {\n var msg = unescape(encodeURIComponent(bytes)); // UTF8 escape\n\n bytes = new Uint8Array(msg.length);\n\n for (var i = 0; i < msg.length; ++i) {\n bytes[i] = msg.charCodeAt(i);\n }\n }\n\n return md5ToHexEncodedArray(wordsToMd5(bytesToWords(bytes), bytes.length * 8));\n}\n/*\n * Convert an array of little-endian words to an array of bytes\n */\n\n\nfunction md5ToHexEncodedArray(input) {\n var output = [];\n var length32 = input.length * 32;\n var hexTab = '0123456789abcdef';\n\n for (var i = 0; i < length32; i += 8) {\n var x = input[i >> 5] >>> i % 32 & 0xff;\n var hex = parseInt(hexTab.charAt(x >>> 4 & 0x0f) + hexTab.charAt(x & 0x0f), 16);\n output.push(hex);\n }\n\n return output;\n}\n/**\n * Calculate output length with padding and bit length\n */\n\n\nfunction getOutputLength(inputLength8) {\n return (inputLength8 + 64 >>> 9 << 4) + 14 + 1;\n}\n/*\n * Calculate the MD5 of an array of little-endian words, and a bit length.\n */\n\n\nfunction wordsToMd5(x, len) {\n /* append padding */\n x[len >> 5] |= 0x80 << len % 32;\n x[getOutputLength(len) - 1] = len;\n var a = 1732584193;\n var b = -271733879;\n var c = -1732584194;\n var d = 271733878;\n\n for (var i = 0; i < x.length; i += 16) {\n var olda = a;\n var oldb = b;\n var oldc = c;\n var oldd = d;\n a = md5ff(a, b, c, d, x[i], 7, -680876936);\n d = md5ff(d, a, b, c, x[i + 1], 12, -389564586);\n c = md5ff(c, d, a, b, x[i + 2], 17, 606105819);\n b = md5ff(b, c, d, a, x[i + 3], 22, -1044525330);\n a = md5ff(a, b, c, d, x[i + 4], 7, -176418897);\n d = md5ff(d, a, b, c, x[i + 5], 12, 1200080426);\n c = md5ff(c, d, a, b, x[i + 6], 17, -1473231341);\n b = md5ff(b, c, d, a, x[i + 7], 22, -45705983);\n a = md5ff(a, b, c, d, x[i + 8], 7, 1770035416);\n d = md5ff(d, a, b, c, x[i + 9], 12, -1958414417);\n c = md5ff(c, d, a, b, x[i + 10], 17, -42063);\n b = md5ff(b, c, d, a, x[i + 11], 22, -1990404162);\n a = md5ff(a, b, c, d, x[i + 12], 7, 1804603682);\n d = md5ff(d, a, b, c, x[i + 13], 12, -40341101);\n c = md5ff(c, d, a, b, x[i + 14], 17, -1502002290);\n b = md5ff(b, c, d, a, x[i + 15], 22, 1236535329);\n a = md5gg(a, b, c, d, x[i + 1], 5, -165796510);\n d = md5gg(d, a, b, c, x[i + 6], 9, -1069501632);\n c = md5gg(c, d, a, b, x[i + 11], 14, 643717713);\n b = md5gg(b, c, d, a, x[i], 20, -373897302);\n a = md5gg(a, b, c, d, x[i + 5], 5, -701558691);\n d = md5gg(d, a, b, c, x[i + 10], 9, 38016083);\n c = md5gg(c, d, a, b, x[i + 15], 14, -660478335);\n b = md5gg(b, c, d, a, x[i + 4], 20, -405537848);\n a = md5gg(a, b, c, d, x[i + 9], 5, 568446438);\n d = md5gg(d, a, b, c, x[i + 14], 9, -1019803690);\n c = md5gg(c, d, a, b, x[i + 3], 14, -187363961);\n b = md5gg(b, c, d, a, x[i + 8], 20, 1163531501);\n a = md5gg(a, b, c, d, x[i + 13], 5, -1444681467);\n d = md5gg(d, a, b, c, x[i + 2], 9, -51403784);\n c = md5gg(c, d, a, b, x[i + 7], 14, 1735328473);\n b = md5gg(b, c, d, a, x[i + 12], 20, -1926607734);\n a = md5hh(a, b, c, d, x[i + 5], 4, -378558);\n d = md5hh(d, a, b, c, x[i + 8], 11, -2022574463);\n c = md5hh(c, d, a, b, x[i + 11], 16, 1839030562);\n b = md5hh(b, c, d, a, x[i + 14], 23, -35309556);\n a = md5hh(a, b, c, d, x[i + 1], 4, -1530992060);\n d = md5hh(d, a, b, c, x[i + 4], 11, 1272893353);\n c = md5hh(c, d, a, b, x[i + 7], 16, -155497632);\n b = md5hh(b, c, d, a, x[i + 10], 23, -1094730640);\n a = md5hh(a, b, c, d, x[i + 13], 4, 681279174);\n d = md5hh(d, a, b, c, x[i], 11, -358537222);\n c = md5hh(c, d, a, b, x[i + 3], 16, -722521979);\n b = md5hh(b, c, d, a, x[i + 6], 23, 76029189);\n a = md5hh(a, b, c, d, x[i + 9], 4, -640364487);\n d = md5hh(d, a, b, c, x[i + 12], 11, -421815835);\n c = md5hh(c, d, a, b, x[i + 15], 16, 530742520);\n b = md5hh(b, c, d, a, x[i + 2], 23, -995338651);\n a = md5ii(a, b, c, d, x[i], 6, -198630844);\n d = md5ii(d, a, b, c, x[i + 7], 10, 1126891415);\n c = md5ii(c, d, a, b, x[i + 14], 15, -1416354905);\n b = md5ii(b, c, d, a, x[i + 5], 21, -57434055);\n a = md5ii(a, b, c, d, x[i + 12], 6, 1700485571);\n d = md5ii(d, a, b, c, x[i + 3], 10, -1894986606);\n c = md5ii(c, d, a, b, x[i + 10], 15, -1051523);\n b = md5ii(b, c, d, a, x[i + 1], 21, -2054922799);\n a = md5ii(a, b, c, d, x[i + 8], 6, 1873313359);\n d = md5ii(d, a, b, c, x[i + 15], 10, -30611744);\n c = md5ii(c, d, a, b, x[i + 6], 15, -1560198380);\n b = md5ii(b, c, d, a, x[i + 13], 21, 1309151649);\n a = md5ii(a, b, c, d, x[i + 4], 6, -145523070);\n d = md5ii(d, a, b, c, x[i + 11], 10, -1120210379);\n c = md5ii(c, d, a, b, x[i + 2], 15, 718787259);\n b = md5ii(b, c, d, a, x[i + 9], 21, -343485551);\n a = safeAdd(a, olda);\n b = safeAdd(b, oldb);\n c = safeAdd(c, oldc);\n d = safeAdd(d, oldd);\n }\n\n return [a, b, c, d];\n}\n/*\n * Convert an array bytes to an array of little-endian words\n * Characters >255 have their high-byte silently ignored.\n */\n\n\nfunction bytesToWords(input) {\n if (input.length === 0) {\n return [];\n }\n\n var length8 = input.length * 8;\n var output = new Uint32Array(getOutputLength(length8));\n\n for (var i = 0; i < length8; i += 8) {\n output[i >> 5] |= (input[i / 8] & 0xff) << i % 32;\n }\n\n return output;\n}\n/*\n * Add integers, wrapping at 2^32. This uses 16-bit operations internally\n * to work around bugs in some JS interpreters.\n */\n\n\nfunction safeAdd(x, y) {\n var lsw = (x & 0xffff) + (y & 0xffff);\n var msw = (x >> 16) + (y >> 16) + (lsw >> 16);\n return msw << 16 | lsw & 0xffff;\n}\n/*\n * Bitwise rotate a 32-bit number to the left.\n */\n\n\nfunction bitRotateLeft(num, cnt) {\n return num << cnt | num >>> 32 - cnt;\n}\n/*\n * These functions implement the four basic operations the algorithm uses.\n */\n\n\nfunction md5cmn(q, a, b, x, s, t) {\n return safeAdd(bitRotateLeft(safeAdd(safeAdd(a, q), safeAdd(x, t)), s), b);\n}\n\nfunction md5ff(a, b, c, d, x, s, t) {\n return md5cmn(b & c | ~b & d, a, b, x, s, t);\n}\n\nfunction md5gg(a, b, c, d, x, s, t) {\n return md5cmn(b & d | c & ~d, a, b, x, s, t);\n}\n\nfunction md5hh(a, b, c, d, x, s, t) {\n return md5cmn(b ^ c ^ d, a, b, x, s, t);\n}\n\nfunction md5ii(a, b, c, d, x, s, t) {\n return md5cmn(c ^ (b | ~d), a, b, x, s, t);\n}\n\nexport default md5;","import v35 from './v35.js';\nimport md5 from './md5.js';\nvar v3 = v35('v3', 0x30, md5);\nexport default v3;","import rng from './rng.js';\nimport stringify from './stringify.js';\n\nfunction v4(options, buf, offset) {\n options = options || {};\n var rnds = options.random || (options.rng || rng)(); // Per 4.4, set bits for version and `clock_seq_hi_and_reserved`\n\n rnds[6] = rnds[6] & 0x0f | 0x40;\n rnds[8] = rnds[8] & 0x3f | 0x80; // Copy bytes to buffer, if provided\n\n if (buf) {\n offset = offset || 0;\n\n for (var i = 0; i < 16; ++i) {\n buf[offset + i] = rnds[i];\n }\n\n return buf;\n }\n\n return stringify(rnds);\n}\n\nexport default v4;","// Adapted from Chris Veness' SHA1 code at\n// http://www.movable-type.co.uk/scripts/sha1.html\nfunction f(s, x, y, z) {\n switch (s) {\n case 0:\n return x & y ^ ~x & z;\n\n case 1:\n return x ^ y ^ z;\n\n case 2:\n return x & y ^ x & z ^ y & z;\n\n case 3:\n return x ^ y ^ z;\n }\n}\n\nfunction ROTL(x, n) {\n return x << n | x >>> 32 - n;\n}\n\nfunction sha1(bytes) {\n var K = [0x5a827999, 0x6ed9eba1, 0x8f1bbcdc, 0xca62c1d6];\n var H = [0x67452301, 0xefcdab89, 0x98badcfe, 0x10325476, 0xc3d2e1f0];\n\n if (typeof bytes === 'string') {\n var msg = unescape(encodeURIComponent(bytes)); // UTF8 escape\n\n bytes = [];\n\n for (var i = 0; i < msg.length; ++i) {\n bytes.push(msg.charCodeAt(i));\n }\n } else if (!Array.isArray(bytes)) {\n // Convert Array-like to Array\n bytes = Array.prototype.slice.call(bytes);\n }\n\n bytes.push(0x80);\n var l = bytes.length / 4 + 2;\n var N = Math.ceil(l / 16);\n var M = new Array(N);\n\n for (var _i = 0; _i < N; ++_i) {\n var arr = new Uint32Array(16);\n\n for (var j = 0; j < 16; ++j) {\n arr[j] = bytes[_i * 64 + j * 4] << 24 | bytes[_i * 64 + j * 4 + 1] << 16 | bytes[_i * 64 + j * 4 + 2] << 8 | bytes[_i * 64 + j * 4 + 3];\n }\n\n M[_i] = arr;\n }\n\n M[N - 1][14] = (bytes.length - 1) * 8 / Math.pow(2, 32);\n M[N - 1][14] = Math.floor(M[N - 1][14]);\n M[N - 1][15] = (bytes.length - 1) * 8 & 0xffffffff;\n\n for (var _i2 = 0; _i2 < N; ++_i2) {\n var W = new Uint32Array(80);\n\n for (var t = 0; t < 16; ++t) {\n W[t] = M[_i2][t];\n }\n\n for (var _t = 16; _t < 80; ++_t) {\n W[_t] = ROTL(W[_t - 3] ^ W[_t - 8] ^ W[_t - 14] ^ W[_t - 16], 1);\n }\n\n var a = H[0];\n var b = H[1];\n var c = H[2];\n var d = H[3];\n var e = H[4];\n\n for (var _t2 = 0; _t2 < 80; ++_t2) {\n var s = Math.floor(_t2 / 20);\n var T = ROTL(a, 5) + f(s, b, c, d) + e + K[s] + W[_t2] >>> 0;\n e = d;\n d = c;\n c = ROTL(b, 30) >>> 0;\n b = a;\n a = T;\n }\n\n H[0] = H[0] + a >>> 0;\n H[1] = H[1] + b >>> 0;\n H[2] = H[2] + c >>> 0;\n H[3] = H[3] + d >>> 0;\n H[4] = H[4] + e >>> 0;\n }\n\n return [H[0] >> 24 & 0xff, H[0] >> 16 & 0xff, H[0] >> 8 & 0xff, H[0] & 0xff, H[1] >> 24 & 0xff, H[1] >> 16 & 0xff, H[1] >> 8 & 0xff, H[1] & 0xff, H[2] >> 24 & 0xff, H[2] >> 16 & 0xff, H[2] >> 8 & 0xff, H[2] & 0xff, H[3] >> 24 & 0xff, H[3] >> 16 & 0xff, H[3] >> 8 & 0xff, H[3] & 0xff, H[4] >> 24 & 0xff, H[4] >> 16 & 0xff, H[4] >> 8 & 0xff, H[4] & 0xff];\n}\n\nexport default sha1;","import v35 from './v35.js';\nimport sha1 from './sha1.js';\nvar v5 = v35('v5', 0x50, sha1);\nexport default v5;","export default '00000000-0000-0000-0000-000000000000';","import validate from './validate.js';\n\nfunction version(uuid) {\n if (!validate(uuid)) {\n throw TypeError('Invalid UUID');\n }\n\n return parseInt(uuid.substr(14, 1), 16);\n}\n\nexport default version;","module.exports = __WEBPACK_EXTERNAL_MODULE__990__;","// The module cache\nvar __webpack_module_cache__ = {};\n\n// The require function\nfunction __webpack_require__(moduleId) {\n\t// Check if module is in cache\n\tvar cachedModule = __webpack_module_cache__[moduleId];\n\tif (cachedModule !== undefined) {\n\t\treturn cachedModule.exports;\n\t}\n\t// Create a new module (and put it into the cache)\n\tvar module = __webpack_module_cache__[moduleId] = {\n\t\t// no module.id needed\n\t\t// no module.loaded needed\n\t\texports: {}\n\t};\n\n\t// Execute the module function\n\t__webpack_modules__[moduleId](module, module.exports, __webpack_require__);\n\n\t// Return the exports of the module\n\treturn module.exports;\n}\n\n","// getDefaultExport function for compatibility with non-harmony modules\n__webpack_require__.n = (module) => {\n\tvar getter = module && module.__esModule ?\n\t\t() => (module['default']) :\n\t\t() => (module);\n\t__webpack_require__.d(getter, { a: getter });\n\treturn getter;\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__.g = (function() {\n\tif (typeof globalThis === 'object') return globalThis;\n\ttry {\n\t\treturn this || new Function('return this')();\n\t} catch (e) {\n\t\tif (typeof window === 'object') return window;\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};","var scriptUrl;\nif (__webpack_require__.g.importScripts) scriptUrl = __webpack_require__.g.location + \"\";\nvar document = __webpack_require__.g.document;\nif (!scriptUrl && document) {\n\tif (document.currentScript)\n\t\tscriptUrl = document.currentScript.src\n\tif (!scriptUrl) {\n\t\tvar scripts = document.getElementsByTagName(\"script\");\n\t\tif(scripts.length) scriptUrl = scripts[scripts.length - 1].src\n\t}\n}\n// When supporting browsers where an automatic publicPath is not supported you must specify an output.publicPath manually via configuration\n// or pass an empty string (\"\") and set the __webpack_public_path__ variable from your code to use your own logic.\nif (!scriptUrl) throw new Error(\"Automatic publicPath is not supported in this browser\");\nscriptUrl = scriptUrl.replace(/#.*$/, \"\").replace(/\\?.*$/, \"\").replace(/\\/[^\\/]+$/, \"/\");\n__webpack_require__.p = scriptUrl;","export default __webpack_public_path__ + \"02188894d5236b1517df3210b79c2a7f.svg\";","import './d3-context-menu.css';\nimport ArrowIcon from './img/play.svg';\n\nimport d3 from 'd3';\nimport slugid from 'slugid';\n\nexport function contextMenu(menu, opts) {\n let previouslyMouseUp = false;\n let clickAway = () => {};\n let uid = slugid.nice();\n let rootElement = null;\n let orientation = 'right'; // display the menu to the right of the mouse click\n // or parent elemement\n let initialPos = null;\n let parentStart = null;\n\n var openCallback,\n closeCallback;\n\n if (typeof opts === 'function') {\n openCallback = opts;\n } else {\n opts = opts || {};\n openCallback = opts.onOpen;\n closeCallback = opts.onClose;\n }\n\n if ('rootElement' in opts)\n rootElement = opts['rootElement']\n\n if ('pos' in opts) {\n // do we want to place this menu somewhere specific?\n initialPos = opts.pos;\n }\n\n if ('orientation' in opts) {\n orientation = opts.orientation;\n }\n\n if ('parentStart' in opts) {\n parentStart = opts.parentStart;\n }\n\n // create the div element that will hold the context menu\n d3.selectAll('.d3-context-menu-' + uid).data([1])\n .enter()\n .append('div')\n .classed('d3-context-menu', true)\n .classed('d3-context-menu-' + uid, true)\n\n // close menu\n d3.select('body').on('click.d3-context-menu-' + uid, function() {\n if (previouslyMouseUp) {\n previouslyMouseUp = false;\n return;\n }\n console.log('body click close');\n\n d3.select('.d3-context-menu-' + uid).style('display', 'none');\n orientation = 'right';\n\n if (closeCallback) {\n closeCallback();\n }\n });\n\n // this gets executed when a contextmenu event occurs\n return function(data, index, pMouseUp=false,\n clickAwayFunc = function() { } ) {\n var elm = this;\n var contextMenuPos = null;\n let mousePos = null;\n let currentThis = this;\n\n if (rootElement == null)\n mousePos = d3.mouse(this);\n else\n mousePos = d3.mouse(rootElement); // for recursive menus, we need the mouse\n // position relative to another element\n\n clickAway = clickAwayFunc;\n let openChildMenuUid = null;\n\n previouslyMouseUp = pMouseUp;\n\n d3.selectAll('.d3-context-menu-' + uid).html('');\n var list = d3.selectAll('.d3-context-menu-' + uid)\n .on('contextmenu', function(d) {\n console.log('context-menu close');\n d3.select('.d3-context-menu-' + uid).style('display', 'none'); \n orientation = 'right';\n\n d3.event.preventDefault();\n d3.event.stopPropagation();\n })\n .append('ul');\n\n list.selectAll('li').data(typeof menu === 'function' ? menu(data) : menu).enter()\n .append('li')\n .attr('class', function(d) {\n console.log('d:', d);\n var ret = '';\n if (d.divider) {\n ret += ' is-divider';\n }\n if (d.disabled) {\n ret += ' is-disabled';\n }\n if (!d.action) {\n ret += ' is-header';\n }\n if ('children' in d) {\n ret += ' d3-context-menu-recursive';\n }\n return ret;\n })\n .html(function(d) {\n if (d.divider) {\n return '
';\n }\n if (!d.title) {\n console.error('No title attribute set. Check the spelling of your options.');\n }\n return (typeof d.title === 'string') ? d.title : d.title(data);\n })\n .on('click', function(d, i) {\n if (d.disabled) return; // do nothing if disabled\n if (!d.action) return; // headers have no \"action\"\n d.action(elm, data, index, mousePos);\n console.log('click close');\n\n // close all context menus\n d3.selectAll('.d3-context-menu').style('display', 'none');\n orientation = 'right';\n\n if (closeCallback) {\n closeCallback();\n }\n })\n .on('mouseenter', function(d, i) {\n d3.select(this)\n .classed('d3-context-menu-selected', true)\n\n if (openChildMenuUid != null) {\n // there's a child menu open\n\n // unselect all items\n d3.select('.d3-context-menu-' + uid)\n .selectAll('li')\n .classed('d3-context-menu-selected', false);\n\n if (typeof d.children == 'undefined') {\n console.log(\"no children close\");\n // no children, so hide any open child menus\n d3.select('.d3-context-menu-' + openChildMenuUid)\n .style('display', 'none');\n\n openChildMenuUid = null;\n return;\n }\n\n if (d.childUid == openChildMenuUid) {\n // the correct child menu is already open\n return;\n\n } else {\n // need to open a different child menu\n console.log('open different child menu close');\n \n // close the already open one\n d3.select('.d3-context-menu-' + openChildMenuUid)\n .style('display', 'none');\n\n openChildMenuUid = null;\n\n }\n } \n\n // there should be no menu open right now\n if (typeof d.children != 'undefined') {\n let boundingRect = this.getBoundingClientRect();\n\n let childrenContextMenu = null\n if (orientation == 'left') {\n childrenContextMenu = contextMenu(d.children, {'rootElement': currentThis,\n 'pos': [ boundingRect.left + window.pageXOffset,\n boundingRect.top - 2 + window.pageYOffset],\n 'orientation': 'left'});\n } else {\n childrenContextMenu = contextMenu(d.children, \n {\n 'pos': [ boundingRect.left + boundingRect.width + window.pageXOffset,\n boundingRect.top - 2 + window.pageYOffset],\n 'rootElement': currentThis,\n 'parentStart': [boundingRect.left + window.pageXOffset,\n boundingRect.top - 2 + window.pageYOffset]});\n }\n\n d.childUid = childrenContextMenu.apply(this, [data,i,true,\n function() { }]);\n openChildMenuUid = d.childUid;\n }\n\n\n d3.select(this)\n .classed('d3-context-menu-selected', true)\n \n })\n .on('mouseleave', function(d, i) {\n\n if (openChildMenuUid == null) {\n d3.select(this)\n .classed('d3-context-menu-selected', false);\n }\n });\n\n list.selectAll('.d3-context-menu-recursive')\n .append('img')\n .attr('src', ArrowIcon)\n .attr('width', '14px')\n .attr('height', '14px')\n .style('position', 'absolute')\n .style('right', '5px')\n ;\n\n // the openCallback allows an action to fire before the menu is displayed\n // an example usage would be closing a tooltip\n if (openCallback) {\n if (openCallback(data, index) === false) {\n return uid;\n }\n }\n\n let contextMenuSelection = d3.select('.d3-context-menu-' + uid)\n .style('display', 'block');\n\n if (initialPos == null) {\n d3.select('.d3-context-menu-' + uid)\n .style('left', (d3.event.pageX - 2) + 'px')\n .style('top', (d3.event.pageY - 2) + 'px')\n } else {\n d3.select('.d3-context-menu-' + uid)\n .style('left', initialPos[0] + 'px')\n .style('top', initialPos[1] + 'px')\n }\n\n // check if the menu disappears off the side of the window\n let boundingRect = contextMenuSelection.node().getBoundingClientRect();\n\n if (boundingRect.left + boundingRect.width > window.innerWidth || orientation == 'left') {\n orientation = 'left';\n\n // menu goes of the end of the window, position it the other way\n if (initialPos == null) {\n // place the menu where the user clicked\n d3.select('.d3-context-menu-' + uid)\n .style('left', (d3.event.pageX - 2 - boundingRect.width) + 'px')\n .style('top', (d3.event.pageY - 2) + 'px')\n } else {\n if (parentStart != null) {\n d3.select('.d3-context-menu-' + uid)\n .style('left', (parentStart[0] - boundingRect.width) + 'px')\n .style('top', parentStart[1] + 'px')\n } else {\n d3.select('.d3-context-menu-' + uid)\n .style('left', (initialPos[0] - boundingRect.width) + 'px')\n .style('top', initialPos[1] + 'px')\n }\n }\n \n }\n\n // display context menu\n\n if (previouslyMouseUp)\n return uid;\n\n d3.event.preventDefault();\n d3.event.stopPropagation();\n //d3.event.stopImmediatePropagation();\n //\n return uid;\n };\n};\n","var numberSort = function(a,b) { return a - b; };\n\nexport function arraysEqual(a, b) {\n // courtesy of \n // http://stackoverflow.com/questions/3115982/how-to-check-if-two-arrays-are-equal-with-javascript\n if (a === b) return true;\n if (a === null || b === null) return false;\n if (a.length != b.length) return false;\n\n // If you don't care about the order of the elements inside\n // the array, you should sort both arrays here.\n\n for (var i = 0; i < a.length; ++i) {\n if (a[i] !== b[i]) return false;\n }\n return true;\n}\n\nexport function RNAUtilities() {\n var self = this;\n\n // the brackets to use when constructing dotbracket strings\n // with pseudoknots\n self.bracketLeft = \"([{abcdefghijklmnopqrstuvwxyz\".split(\"\");\n\n self.inverseBrackets = function(bracket) {\n var res = {};\n for (var i = 0; i < bracket.length; i++) {\n res[bracket[i]] = i;\n }\n return res;\n };\n\n self.maximumMatching = function maximumMatching(pt){\n // Courtesy of the great Ronny Lorenz\n\n var n = pt[0];\n var TURN = 0; //minimal number of nucleotides in the hairpin\n\n /* array init */\n var mm = new Array(n + 1);\n for(var i = 0; i <= n; i++){\n mm[i] = new Array(n + 1);\n for(var j = i; j <= n; j++)\n mm[i][j] = 0;\n }\n var maximum = 0;\n\n /* actual computation */\n for(var i = n - TURN - 1; i > 0; i--)\n\n for(var j = i + TURN + 1; j <= n; j++){\n maximum = mm[i][j-1];\n\n for(var l = j - TURN - 1; l >= i; l--) {\n if(pt[l] === j) {\n\n // we have a base pair here\n maximum = Math.max(maximum, ((l > i) ? mm[i][l-1] : 0) + 1 + ((j - l - 1 > 0) ? mm[l+1][j-1] : 0));\n }\n }\n\n mm[i][j] = maximum;\n }\n\n maximum = mm[1][n];\n\n return mm;\n };\n\n self.backtrackMaximumMatching = function(mm, oldPt) {\n var pt = Array.apply(null, \n Array(mm.length)).map(function() { return 0 }); \n //create an array containing zeros\n\n self.mmBt(mm, pt, oldPt, 1, mm.length-1);\n return pt;\n }\n\n self.mmBt = function(mm, pt, oldPt, i, j){\n // Create a pairtable from the backtracking\n var maximum = mm[i][j];\n var TURN = 0;\n\n if(j - i - 1 < TURN) return; /* no more pairs */\n\n if(mm[i][j-1] == maximum){ /* j is unpaired */\n self.mmBt(mm, pt, oldPt, i, j-1);\n return;\n }\n\n for(var q = j - TURN - 1; q >= i; q--){ /* j is paired with some q */\n if (oldPt[j] !== q)\n continue;\n\n var leftPart = (q > i) ? mm[i][q-1] : 0;\n var enclosedPart = (j - q - 1 > 0) ? mm[q+1][j-1] : 0;\n\n if(leftPart + enclosedPart + 1 == maximum) {\n // there's a base pair between j and q\n pt[q] = j;\n pt[j] = q;\n\n if(i < q) \n self.mmBt(mm, pt, oldPt, i, q - 1);\n\n self.mmBt(mm, pt, oldPt, q + 1, j - 1);\n return;\n }\n }\n\n //alert(i + \",\" + j + \": backtracking failed!\");\n console.log('FAILED!!!' + i + ',' + j + ': backtracking failed!');\n\n };\n\n self.dotbracketToPairtable = function(dotbracket) {\n // create an array and initialize it to 0\n var pt = Array.apply(null, new Array(dotbracket.length + 1)).map(Number.prototype.valueOf,0);\n \n // the first element is always the length of the RNA molecule\n pt[0] = dotbracket.length;\n\n // store the pairing partners for each symbol\n var stack = {};\n for (var i = 0; i < self.bracketLeft.length; i++) {\n stack[i] = [];\n }\n\n // lookup the index of each symbol in the bracket array\n var inverseBracketLeft = self.inverseBrackets(self.bracketLeft);\n var inverseBracketRight = self.inverseBrackets(self.bracketRight);\n\n for (var i = 0; i < dotbracket.length; i++) {\n var a = dotbracket[i];\n var ni = i + 1;\n\n if (a == '.' || a == 'o') {\n // unpaired\n pt[ni] = 0;\n } else {\n if (a in inverseBracketLeft) {\n // open pair?\n stack[inverseBracketLeft[a]].push(ni);\n } else if (a in inverseBracketRight){\n // close pair?\n var j = stack[inverseBracketRight[a]].pop();\n\n pt[ni] = j;\n pt[j] = ni;\n } else {\n throw \"Unknown symbol in dotbracket string\";\n }\n }\n }\n\n for (var key in stack) {\n if (stack[key].length > 0) {\n throw \"Unmatched base at position \" + stack[key][0];\n }\n }\n\n return pt;\n };\n\n self.insertIntoStack = function(stack, i, j) {\n var k = 0;\n while (stack[k].length > 0 && stack[k][stack[k].length - 1] < j) {\n k += 1;\n }\n\n stack[k].push(j);\n return k;\n };\n\n self.deleteFromStack = function(stack, j) {\n var k = 0;\n while (stack[k].length === 0 || stack[k][stack[k].length-1] != j) {\n k += 1;\n }\n stack[k].pop();\n return k;\n };\n\n self.pairtableToDotbracket = function(pt) {\n // store the pairing partners for each symbol\n var stack = {};\n for (var i = 0; i < pt[0]; i++) {\n stack[i] = [];\n }\n\n var seen = {};\n var res = \"\";\n var i;\n for (var i = 1; i < pt[0] + 1; i++) {\n if (pt[i] !== 0 && pt[i] in seen) {\n throw \"Invalid pairtable contains duplicate entries\";\n }\n seen[pt[i]] = true;\n\n if (pt[i] === 0) {\n res += '.';\n } else {\n if (pt[i] > i) {\n res += self.bracketLeft[self.insertIntoStack(stack, i, pt[i])];\n } else {\n res += self.bracketRight[self.deleteFromStack(stack, i)];\n }\n }\n }\n\n return res;\n };\n\n self.findUnmatched = function(pt, from, to) {\n /*\n * Find unmatched nucleotides in this molecule.\n */\n var toRemove = [];\n var unmatched = [];\n\n var origFrom = from;\n var origTo = to;\n var i;\n\n for (var i = from; i <= to; i++)\n if (pt[i] !== 0 && (pt[i] < from || pt[i] > to))\n unmatched.push([i,pt[i]]);\n\n for (var i = origFrom; i <= origTo; i++) {\n while (pt[i] === 0 && i <= origTo) i++;\n\n to = pt[i];\n\n while (pt[i] === to) {\n i++;\n to--;\n }\n \n toRemove = toRemove.concat(self.findUnmatched(pt, i, to));\n }\n\n if (unmatched.length > 0)\n toRemove.push(unmatched);\n\n return toRemove;\n };\n\n self.removePseudoknotsFromPairtable = function(pt) {\n /* Remove the pseudoknots from this structure in such a fashion\n * that the least amount of base-pairs need to be broken\n *\n * The pairtable is manipulated in place and a list of tuples\n * indicating the broken base pairs is returned.\n */\n\n var mm = self.maximumMatching(pt);\n var newPt = self.backtrackMaximumMatching(mm, pt);\n var removed = [];\n\n for (var i = 1; i < pt.length; i++) {\n if (pt[i] < i)\n continue;\n\n if (newPt[i] != pt[i]) {\n removed.push([i, pt[i]]);\n pt[pt[i]] = 0;\n pt[i] = 0;\n }\n }\n\n return removed;\n };\n\n self.ptToElements = function(pt, level, i, j, dotBracketBreaks) {\n /* Convert a pair table to a list of secondary structure \n * elements:\n *\n * [['s',1,[2,3]]\n *\n * The 's' indicates that an element can be a stem. It can also be\n * an interior loop ('i'), a hairpin loop ('h') or a multiloop ('m')\n *\n * The second number (1 in this case) indicates the depth or\n * how many base pairs have to be broken to get to this element.\n *\n * Finally, there is the list of nucleotides which are part of\n * of this element.\n */\n var elements = [];\n var u5 = [i-1];\n var u3 = [j+1];\n\n if (arguments.length < 5)\n dotBracketBreaks = [];\n\n if (i > j)\n return [];\n \n //iterate over the unpaired regions on either side\n //this is either 5' and 3' unpaired if level == 0\n //or an interior loop or a multiloop\n for (; pt[i] === 0; i++) { u5.push(i); }\n for (; pt[j] === 0; j--) { u3.push(j); }\n\n if (i > j) {\n //hairpin loop or one large unpaired molecule\n u5.push(i);\n if (level === 0)\n return [['e',level, u5.sort(numberSort)]];\n else {\n // check to see if we have chain breaks due\n // to multiple strands in the input\n var external = false;\n var left = [];\n var right = [];\n for (var k = 0; k < u5.length; k++) {\n if (external)\n right.push(u5[k]);\n else\n left.push(u5[k]);\n\n if (dotBracketBreaks.indexOf(u5[k]) >= 0)\n external = true;\n }\n\n if (external) {\n return [['h',level, u5.sort(numberSort)]];\n }\n else\n // if not, this is a simple hairpin loop\n return [['h',level, u5.sort(numberSort)]];\n }\n }\n\n if (pt[i] != j) {\n //multiloop\n var m = u5;\n var k = i;\n\n // the nucleotide before and the starting nucleotide\n m.push(k);\n while (k <= j) {\n // recurse into a stem\n elements = elements.concat(self.ptToElements(pt, level, k, pt[k], dotBracketBreaks));\n\n // add the nucleotides between stems\n m.push(pt[k]);\n k = pt[k] + 1;\n for (; pt[k] === 0 && k <= j; k++) { m.push(k);}\n m.push(k);\n }\n m.pop();\n m = m.concat(u3);\n \n if (m.length > 0) {\n if (level === 0)\n elements.push(['e', level, m.sort(numberSort)]);\n else\n elements.push(['m', level, m.sort(numberSort)]);\n }\n \n return elements;\n }\n\n if (pt[i] === j) {\n //interior loop\n u5.push(i);\n u3.push(j);\n\n var combined = u5.concat(u3);\n if (combined.length > 4) {\n if (level === 0)\n elements.push(['e',level, u5.concat(u3).sort(numberSort)]);\n else\n elements.push(['i',level, u5.concat(u3).sort(numberSort)]);\n }\n } \n\n var s = [];\n //go through the stem\n while (pt[i] === j && i < j) {\n //one stem\n s.push(i);\n s.push(j);\n\n i += 1;\n j -= 1;\n\n level += 1;\n }\n\n u5 = [i-1];\n u3 = [j+1];\n elements.push(['s', level, s.sort(numberSort)]);\n\n return elements.concat(self.ptToElements(pt, level, i, j, dotBracketBreaks));\n };\n\n}\n\nexport var rnaUtilities = new RNAUtilities();\n\nexport function ColorScheme(colorsText) {\n var self = this;\n self.colorsText = colorsText;\n\n self.parseRange = function(rangeText) {\n //parse a number range such as 1-10 or 3,7,9 or just 7\n var parts = rangeText.split(',')\n var nums = [];\n\n for (var i = 0; i < parts.length; i++) {\n //could be 1 or 10-11 or something like that\n var parts1 = parts[i].split('-');\n\n if (parts1.length == 1)\n nums.push(parseInt(parts1[0]));\n else if (parts1.length == 2) {\n var from = parseInt(parts1[0]);\n var to = parseInt(parts1[1]);\n\n // add each number in this range\n for (var j = from; j <= to; j++) \n nums.push(j)\n } else {\n console.log('Malformed range (too many dashes):', rangeText);\n }\n }\n\n return nums;\n }\n\n self.parseColorText = function(colorText) {\n /* Parse the text of an RNA color string. Instructions and description\n * of the format are given below.\n *\n * The return is a json double dictionary indexed first by the \n * molecule name, then by the nucleotide. This is then applied\n * by force.js to the RNAs it is displaying. When no molecule\n * name is specified, the color is applied to all molecules*/\n var lines = colorText.split('\\n');\n var currMolecule = '';\n var counter = 1;\n var colorsJson = {colorValues: {'':{}}, range:['white', 'steelblue']};\n var domainValues = [];\n\n\n for (var i = 0; i < lines.length; i++) {\n\n if (lines[i][0] == '>') {\n // new molecule\n currMolecule = lines[i].trim().slice(1);\n counter = 1;\n\n colorsJson.colorValues[currMolecule] = {};\n continue;\n }\n\n let words = lines[i].trim().split(/[\\s]+/);\n\n for (var j = 0; j < words.length; j++) {\n if (isNaN(words[j])) {\n if (words[j].search('range') === 0) {\n //there's a color scale in this entry\n let parts = words[j].split('=');\n let partsRight = parts[1].split(':')\n colorsJson.range = [partsRight[0], partsRight[1]];\n continue;\n }\n\n if (words[j].search('domain') == 0) {\n //there's a color scale in this entry\n let parts = words[j].split('=');\n let partsRight = parts[1].split(':')\n colorsJson.domain = [partsRight[0], partsRight[1]];\n continue;\n }\n\n // it's not a number, should be a combination \n // of a number (nucleotide #) and a color\n let parts = words[j].split(':');\n let nums = self.parseRange(parts[0]);\n let color = parts[1]\n\n for (var k = 0; k < nums.length; k++) {\n if (isNaN(color)) {\n colorsJson.colorValues[currMolecule][nums[k]] = color;\n } else {\n colorsJson.colorValues[currMolecule][nums[k]] = +color;\n domainValues.push(Number(color));\n }\n }\n } else {\n //it's a number, so we add it to the list of values\n //seen for this molecule\n colorsJson.colorValues[currMolecule][counter] = Number(words[j]);\n counter += 1;\n\n domainValues.push(Number(words[j]));\n }\n }\n }\n\n if (!('domain' in colorsJson))\n colorsJson.domain = [Math.min.apply(null, domainValues), Math.max.apply(null, domainValues)];\n\n self.colorsJson = colorsJson;\n\n return self;\n };\n\n self.normalizeColors = function() {\n /* \n * Normalize the passed in values so that they range from\n * 0 to 1\n */\n var value;\n\n for (var moleculeName in self.colorsJson) {\n var minNum = Number.MAX_VALUE;\n var maxNum = Number.MIN_VALUE;\n\n // iterate once to find the min and max values;\n for (var resnum in self.colorsJson.colorValues[moleculeName]) {\n value = self.colorsJson.colorValues[moleculeName][resnum];\n if (typeof value == 'number') {\n if (value < minNum)\n minNum = value;\n if (value > maxNum)\n maxNum = value;\n }\n }\n\n // iterate again to normalize\n for (resnum in self.colorsJson.colorValues[moleculeName]) {\n value = self.colorsJson.colorValues[moleculeName][resnum];\n if (typeof value == 'number') {\n self.colorsJson.colorValues[moleculeName][resnum] = (value - minNum ) / (maxNum - minNum);\n }\n }\n }\n\n return self;\n };\n\n self.parseColorText(self.colorsText);\n return self;\n}\n","import {arraysEqual,RNAUtilities,rnaUtilities} from './rnautils.js';\nimport slugid from 'slugid';\n\nvar numberSort = function(a,b) { return a - b; };\n\nif (typeof(String.prototype.trim) === 'undefined') {\n String.prototype.trim = function() {\n return String(this).replace(/^\\s+|\\s+$/g, '');\n };\n}\n\nexport function ProteinGraph(structName, size, uid) {\n var self = this;\n\n self.type = 'protein';\n self.size = size;\n self.nodes = [{'name': 'P',\n 'num': 1,\n 'radius': 3 * Math.sqrt(size),\n 'rna': self,\n 'nodeType': 'protein',\n 'structName': structName,\n 'elemType': 'p',\n 'size': size,\n 'uid': slugid.nice()}];\n\n self.links = [];\n self.uid = slugid.nice();\n\n self.addUids = function(uids) {\n for (let i = 0; i < uids.length; i++)\n self.nodes[i].uid = uids[i];\n\n return self;\n };\n\n self.getUids = function() {\n /* Get the positions of each node so that they\n * can be passed to elementsToJson later\n */\n uids = [];\n for (let i = 0; i < self.dotbracket.length; i++)\n uids.push(self.nodes[i].uid);\n\n return uids;\n };\n\n}\n\nexport function RNAGraph(seq = '', dotbracket = '', structName = '', startNumber = 1) {\n var self = this;\n\n self.type = 'rna';\n self.circularizeExternal = false;\n self.seq = seq;\n self.dotbracket = dotbracket; //i.e. ..((..))..\n self.structName = structName;\n self.circular = false;\n\n if (self.dotbracket.slice(-1) == '*') {\n //circular RNA\n self.dotbracket = self.dotbracket.slice(0, -1);\n self.circular = true;\n }\n\n self.uid = slugid.nice();\n\n self.elements = []; //store the elements and the\n //nucleotides they contain\n self.pseudoknotPairs = [];\n self.nucsToNodes = {};\n\n self.addUids = function(uids) {\n let nucleotideNodes = self.nodes.filter(function(d) { return d.nodeType == 'nucleotide'; });\n\n for (let i = 0; i < uids.length && i < nucleotideNodes.length; i++) {\n nucleotideNodes[i].uid = uids[i];\n }\n\n return self;\n };\n\n self.computePairtable = function() {\n self.pairtable = rnaUtilities.dotbracketToPairtable(self.dotbracket);\n };\n\n self.removeBreaks = function(targetString) {\n // Remove all chain breaks (denoted with a '&', which indicate\n // that the input represents more than one strand)\n var breaks = [];\n var breakIndex = -1;\n\n while ((breakIndex = targetString.indexOf('&')) >= 0) {\n breaks.push(breakIndex);\n targetString = targetString.substring(0, breakIndex) + targetString.substring(breakIndex+1, targetString.length);\n\n }\n\n return {targetString: targetString, breaks: breaks};\n };\n\n var ret = self.removeBreaks(self.dotbracket);\n self.dotbracket = ret.targetString;\n self.dotBracketBreaks = ret.breaks;\n\n ret = self.removeBreaks(self.seq);\n self.seq = ret.targetString;\n self.seqBreaks = ret.breaks;\n\n self.rnaLength = self.dotbracket.length;\n\n if (!arraysEqual(self.dotBracketBreaks, self.seqBreaks)) {\n console.log('WARNING: Sequence and structure breaks not equal');\n console.log('WARNING: Using the breaks in the structure');\n }\n\n self.computePairtable();\n\n self.addPositions = function(nodeType, positions) {\n let labelNodes = self.nodes.filter(function(d) { return d.nodeType == nodeType; });\n\n for (let i = 0; i < labelNodes.length; i++) {\n labelNodes[i].x = positions[i][0];\n labelNodes[i].y = positions[i][1];\n }\n\n return self;\n };\n\n self.breakNodesToFakeNodes = function() {\n // convert all the nodes following breaks to fake nodes\n let labelNodes = self.nodes.filter(function(d) { return d.nodeType == 'nucleotide'; });\n\n // if a node was an artifical break node, convert it to a middle\n for (let i = 0; i < labelNodes.length; i++) {\n if (self.dotBracketBreaks.indexOf(i) >= 0) {\n labelNodes[i].nodeType = 'middle';\n labelNodes[i+1].nodeType = 'middle';\n }\n }\n\n for (let i = 0; i < self.elements.length; i++) {\n var broken = false;\n\n // change the elemType of the other nodes in the element containing\n // the break\n for (let j = 0; j < self.elements[i][2].length; j++) {\n if (self.dotBracketBreaks.indexOf(self.elements[i][2][j]) >= 0)\n broken = true;\n }\n\n if (broken) {\n self.elements[i][2].map(function(x) {\n if (x == 0)\n return;\n self.nodes[x-1].elemType = 'e';\n });\n } else {\n self.elements[i][2].map(function(x) {\n if (x == 0)\n return;\n self.nodes[x-1].elemType = self.elements[i][0];\n });\n }\n }\n return self;\n };\n\n self.getPositions = function(nodeType) {\n var positions = [];\n let nucleotideNodes = self.nodes.filter(function(d) { return d.nodeType == nodeType; });\n\n for (let i = 0; i < nucleotideNodes.length; i++)\n positions.push([nucleotideNodes[i].x, nucleotideNodes[i].y]);\n\n return positions;\n };\n\n self.getUids = function() {\n /* Get the positions of each node so that they\n * can be passed to elementsToJson later\n */\n var uids = [];\n for (let i = 0; i < self.dotbracket.length; i++)\n uids.push(self.nodes[i].uid);\n\n return uids;\n };\n\n self.reinforceStems = function() {\n var pt = self.pairtable;\n let relevantElements = self.elements.filter( function(d) {\n return d[0] == 's' && d[2].length >= 4;\n });\n\n for (let i = 0; i < relevantElements.length; i++) {\n let allNucs = relevantElements[i][2];\n let nucs = allNucs.slice(0, allNucs.length / 2);\n\n for (let j = 0; j < nucs.length-1; j++) {\n self.addFakeNode([nucs[j], nucs[j+1], pt[nucs[j+1]], pt[nucs[j]]]);\n }\n }\n\n return self;\n };\n\n self.reinforceLoops = function() {\n /*\n * Add a set of fake nodes to enforce the structure\n */\n var filterNucs = function(d) {\n return d !== 0 && d <= self.dotbracket.length;\n };\n\n for (let i = 0; i < self.elements.length; i++) {\n if (self.elements[i][0] == 's' || (!self.circularizeExternal && self.elements[i][0] == 'e'))\n continue;\n\n var nucs = self.elements[i][2].filter(filterNucs);\n\n if (self.elements[i][0] == 'e') {\n var newNode1 = {'name': '',\n 'num': -3,\n //'radius': 18 * radius -6,\n 'radius': 0,\n 'rna': self,\n 'nodeType': 'middle',\n 'elemType': 'f',\n 'nucs': [],\n 'x': self.nodes[self.rnaLength-1].x,\n 'y': self.nodes[self.rnaLength-1].y,\n 'px': self.nodes[self.rnaLength-1].px,\n 'py': self.nodes[self.rnaLength-1].py,\n 'uid': slugid.nice() };\n var newNode2 = {'name': '',\n 'num': -2,\n //'radius': 18 * radius -6,\n 'radius': 0,\n 'rna': self,\n 'nodeType': 'middle',\n 'elemType': 'f',\n 'nucs': [],\n 'x': self.nodes[0].x,\n 'y': self.nodes[0].y,\n 'px': self.nodes[0].px,\n 'py': self.nodes[0].py,\n 'uid': slugid.nice() };\n\n nucs.push(self.nodes.length+1);\n nucs.push(self.nodes.length+2);\n self.nodes.push(newNode1);\n self.nodes.push(newNode2);\n }\n\n\n self.addFakeNode(nucs);\n }\n\n return self;\n };\n\n self.updateLinkUids = function() {\n for (let i = 0; i < self.links.length; i++) {\n self.links[i].uid = self.links[i].source.uid + self.links[i].target.uid;\n }\n\n return self;\n };\n\n self.addFakeNode = function(nucs) {\n var linkLength = 18; //make sure this is consistent with the value in force.js\n var nodeWidth = 6;\n var angle = (3.1415 * 2) / (2 * nucs.length);\n var radius = linkLength / (2 * Math.tan(angle));\n\n var fakeNodeUid = '';\n\n for (let i = 0; i < nucs.length; i++)\n fakeNodeUid += self.nodes[nucs[i]-1].uid;\n\n var newNode = {'name': '',\n 'num': -1,\n //'radius': 18 * radius -6,\n 'radius': radius,\n 'rna': self,\n 'nodeType': 'middle',\n 'elemType': 'f',\n 'nucs': nucs,\n 'uid': fakeNodeUid };\n self.nodes.push(newNode);\n\n var newX = 0;\n var newY = 0;\n var coordsCounted = 0;\n\n angle = (nucs.length - 2) * 3.14159 / (2 * nucs.length);\n radius = 0.5 / Math.cos(angle);\n\n for (let j = 0; j < nucs.length; j++) {\n if (nucs[j] === 0 || nucs[j] > self.dotbracket.length)\n continue;\n\n //link to the center node\n self.links.push({'source': self.nodes[nucs[j] - 1],\n 'target': self.nodes[self.nodes.length-1],\n 'linkType': 'fake',\n 'value': radius,\n 'uid': slugid.nice() });\n\n if (nucs.length > 4) {\n //link across the loop\n self.links.push({'source': self.nodes[nucs[j] - 1],\n 'target': self.nodes[nucs[(j + Math.floor(nucs.length / 2)) % nucs.length] - 1],\n 'linkType': 'fake',\n 'value': radius * 2,\n 'uid': slugid.nice() });\n }\n\n var ia = ((nucs.length - 2) * 3.14159) / nucs.length;\n var c = 2 * Math.cos(3.14159 / 2 - ia / 2);\n //link to over-neighbor\n self.links.push({'source': self.nodes[nucs[j] - 1],\n 'target': self.nodes[nucs[(j + 2) % nucs.length] - 1],\n 'linkType': 'fake',\n 'value': c});\n\n // calculate the mean of the coordinats in this loop\n // and place the fake node there\n var fromNode = self.nodes[nucs[j]-1];\n if ('x' in fromNode) {\n newX += fromNode.x;\n newY += fromNode.y;\n\n coordsCounted += 1;\n }\n }\n\n if (coordsCounted > 0) {\n // the nucleotides had set positions so we can calculate the position\n // of the fake node\n newNode.x = newX / coordsCounted;\n newNode.y = newY / coordsCounted;\n newNode.px = newNode.x;\n newNode.py = newNode.y;\n }\n\n return self;\n };\n\n self.connectFakeNodes = function() {\n var linkLength = 18;\n\n // We want to be able to connect all of the fake nodes\n // and create a structure consisting of just them\n var filterOutNonFakeNodes = function(d) {\n return d.nodeType == 'middle';\n }\n\n var nucsToNodes = {};\n var fakeNodes = self.nodes.filter(filterOutNonFakeNodes);\n var linked = {};\n\n // initialize the nucleotides to nodes\n for (var i = 1; i <= self.nodes.length; i++)\n nucsToNodes[i] = [];\n\n for (var i = 0; i < fakeNodes.length; i++) {\n var thisNode = fakeNodes[i];\n\n // each fake node represents a certain set of nucleotides (thisNode.nucs)\n for (var j = 0; j < thisNode.nucs.length; j++) {\n var thisNuc = thisNode.nucs[j];\n\n // check to see if this nucleotide has been seen in another fake node\n // if it has, then we add a link between the two nodes\n for (var k = 0; k < nucsToNodes[thisNuc].length; k++) {\n if (JSON.stringify([nucsToNodes[thisNuc][k].uid, thisNode.uid].sort()) in linked)\n continue; //already linked\n\n var distance = nucsToNodes[thisNuc][k].radius + thisNode.radius;\n\n self.links.push({'source': nucsToNodes[thisNuc][k],\n 'target': thisNode,\n 'value': distance / linkLength,\n 'linkType': 'fake_fake'});\n\n // note that we've already seen this link\n linked[JSON.stringify([nucsToNodes[thisNuc][k].uid, thisNode.uid].sort())] = true;\n }\n\n nucsToNodes[thisNuc].push(thisNode);\n }\n }\n\n return self;\n\n };\n\n self.addExtraLinks = function(extraLinks) {\n if (typeof extraLinks == 'undefined')\n return self;\n\n for (var i = 0; i < extraLinks.length; i++) {\n var source = self.getNodeFromNucleotides(extraLinks[i].from);\n var target = self.getNodeFromNucleotides(extraLinks[i].to);\n\n var newLink = {'source': source, 'target': target, 'linkType': 'extra',\n 'extraLinkType': extraLinks[i].linkType, 'uid': slugid.nice() };\n\n self.links.push(newLink);\n }\n\n return self;\n }\n\n\n self.elementsToJson = function() {\n /* Convert a set of secondary structure elements to a json\n * representation of the graph that can be used with d3's\n * force-directed layout to generate a visualization of\n * the structure.\n */\n var pt = self.pairtable;\n var elements = self.elements;\n\n self.nodes = [];\n self.links = [];\n\n //create a reverse lookup so we can find out the type\n //of element that a node is part of\n var elemTypes = {};\n\n //sort so that we count stems last\n self.elements.sort();\n\n for (let i = 0; i < self.elements.length; i++) {\n var nucs = self.elements[i][2];\n for (let j = 0; j < nucs.length; j++) {\n elemTypes[nucs[j]] = self.elements[i][0];\n }\n }\n\n for (let i = 1; i <= pt[0]; i++) {\n var nodeName = self.seq[i-1];\n\n if (self.dotBracketBreaks.indexOf(i-1) >= 0 ||\n self.dotBracketBreaks.indexOf(i-2) >= 0) {\n nodeName = '';\n }\n\n //create a node for each nucleotide\n self.nodes.push({'name': nodeName,\n 'num': startNumber + i - 1,\n 'radius': 5,\n 'rna': self,\n 'nodeType': 'nucleotide',\n 'structName': self.structName,\n 'elemType': elemTypes[i],\n 'uid': slugid.nice(),\n 'linked': false});\n }\n\n for (let i = 0; i < self.nodes.length; i++) {\n if (i === 0)\n self.nodes[i].prevNode = null;\n else {\n self.nodes[i].prevNode = self.nodes[i-1];\n }\n\n if (i == self.nodes.length-1)\n self.nodes[i].nextNode = null;\n else {\n self.nodes[i].nextNode = self.nodes[i+1];\n }\n }\n\n for (let i = 1; i <= pt[0]; i++) {\n\n if (pt[i] !== 0) {\n // base-pair links\n self.links.push({'source': self.nodes[i-1],\n 'target': self.nodes[pt[i]-1],\n 'linkType': 'basepair',\n 'value': 1,\n 'uid': slugid.nice() });\n }\n\n if (i > 1) {\n // backbone links\n if (self.dotBracketBreaks.indexOf(i-1) === -1 &&\n self.dotBracketBreaks.indexOf(i-2) == -1 &&\n self.dotBracketBreaks.indexOf(i-3) == -1) {\n // there is no break in the strands here\n // we can add a backbone link\n self.links.push({'source': self.nodes[i-2],\n 'target': self.nodes[i-1],\n 'linkType': 'backbone',\n 'value': 1,\n 'uid': slugid.nice() });\n self.nodes[i-1].linked = true;\n }\n }\n }\n\n //add the pseudoknot links\n for (let i = 0; i < self.pseudoknotPairs.length; i++) {\n self.links.push({'source': self.nodes[self.pseudoknotPairs[i][0]-1],\n 'target': self.nodes[self.pseudoknotPairs[i][1]-1],\n 'linkType': 'pseudoknot',\n 'value': 1,\n 'uid': slugid.nice()});\n }\n\n if (self.circular) {\n self.links.push({'source': self.nodes[0],\n 'target': self.nodes[self.rnaLength-1],\n 'linkType': 'backbone',\n 'value': 1,\n 'uid': slugid.nice() });\n\n }\n\n return self;\n };\n\n self.ptToElements = function(pt, level, i, j) {\n /* Convert a pair table to a list of secondary structure\n * elements:\n *\n * [['s',1,[2,3]]\n *\n * The 's' indicates that an element can be a stem. It can also be\n * an interior loop ('i'), a hairpin loop ('h') or a multiloop ('m')\n *\n * The second number (1 in this case) indicates the depth or\n * how many base pairs have to be broken to get to this element.\n *\n * Finally, there is the list of nucleotides which are part of\n * of this element.\n */\n var elements = [];\n var u5 = [i-1];\n var u3 = [j+1];\n\n if (i > j)\n return [];\n\n //iterate over the unpaired regions on either side\n //this is either 5' and 3' unpaired if level == 0\n //or an interior loop or a multiloop\n for (; pt[i] === 0; i++) { u5.push(i); }\n for (; pt[j] === 0; j--) { u3.push(j); }\n\n if (i > j) {\n //hairpin loop or one large unpaired molecule\n u5.push(i);\n if (level === 0)\n return [['e',level, u5.sort(numberSort)]];\n else {\n // check to see if we have chain breaks due\n // to multiple strands in the input\n var external = false;\n var left = [];\n var right = [];\n for (var k = 0; k < u5.length; k++) {\n if (external)\n right.push(u5[k]);\n else\n left.push(u5[k]);\n\n if (self.dotBracketBreaks.indexOf(u5[k]) >= 0)\n external = true;\n }\n\n if (external) {\n return [['h',level, u5.sort(numberSort)]];\n }\n else\n // if not, this is a simple hairpin loop\n return [['h',level, u5.sort(numberSort)]];\n }\n }\n\n if (pt[i] != j) {\n //multiloop\n var m = u5;\n var k = i;\n\n // the nucleotide before and the starting nucleotide\n m.push(k);\n while (k <= j) {\n // recurse into a stem\n elements = elements.concat(self.ptToElements(pt, level, k, pt[k]));\n\n // add the nucleotides between stems\n m.push(pt[k]);\n k = pt[k] + 1;\n for (; pt[k] === 0 && k <= j; k++) { m.push(k);}\n m.push(k);\n }\n m.pop();\n m = m.concat(u3);\n\n if (m.length > 0) {\n if (level === 0)\n elements.push(['e', level, m.sort(numberSort)]);\n else\n elements.push(['m', level, m.sort(numberSort)]);\n }\n\n return elements;\n }\n\n if (pt[i] === j) {\n //interior loop\n u5.push(i);\n u3.push(j);\n\n var combined = u5.concat(u3);\n if (combined.length > 4) {\n if (level === 0)\n elements.push(['e',level, u5.concat(u3).sort(numberSort)]);\n else\n elements.push(['i',level, u5.concat(u3).sort(numberSort)]);\n }\n }\n\n var s = [];\n //go through the stem\n while (pt[i] === j && i < j) {\n //one stem\n s.push(i);\n s.push(j);\n\n i += 1;\n j -= 1;\n\n level += 1;\n }\n\n u5 = [i-1];\n u3 = [j+1];\n elements.push(['s', level, s.sort(numberSort)]);\n\n return elements.concat(self.ptToElements(pt, level, i, j));\n };\n\n self.addLabels = function(startNumber = 1, labelInterval = 10) {\n if (labelInterval === 0)\n return self;\n\n for (let i = 1; i <= self.rnaLength; i++) {\n // add labels\n if (i % labelInterval === 0) {\n //create a node for each label\n let newX, newY;\n\n let thisNode = self.nodes[i-1];\n let prevNode, nextNode;\n let prevVec, nextVec;\n\n if (self.rnaLength == 1) {\n nextVec = [thisNode.x - 15, thisNode.y];\n prevVec = [thisNode.x - 15, thisNode.y];\n } else {\n // if we're labelling the first node, then label it in relation to the last\n if (i == 1)\n prevNode = self.nodes[self.rnaLength - 1];\n else\n prevNode = self.nodes[i - 2];\n\n // if we're labelling the last node, then label it in relation to the first\n if (i == self.rnaLength)\n nextNode = self.nodes[0];\n else\n nextNode = self.nodes[i];\n\n // this nucleotide and its neighbors are paired\n if (self.pairtable[nextNode.num - startNumber+1] !== 0 &&\n self.pairtable[prevNode.num - startNumber+1] !== 0 &&\n self.pairtable[thisNode.num - startNumber+1] !== 0) {\n\n prevNode = nextNode = self.nodes[self.pairtable[thisNode.num - startNumber+1]-1];\n }\n\n // this node is paired but at least one of its neighbors is unpaired\n // place the label in the direction of the two neighbors\n if (self.pairtable[thisNode.num - startNumber+1] !== 0 && (\n self.pairtable[nextNode.num - startNumber+1] === 0 ||\n self.pairtable[prevNode.num - startNumber+1] === 0)) {\n nextVec = [thisNode.x - nextNode.x, thisNode.y - nextNode.y];\n prevVec = [thisNode.x - prevNode.x, thisNode.y - prevNode.y];\n\n } else {\n nextVec = [nextNode.x - thisNode.x, nextNode.y - thisNode.y];\n prevVec = [prevNode.x - thisNode.x, prevNode.y - thisNode.y];\n }\n }\n\n var combinedVec = [nextVec[0] + prevVec[0], nextVec[1] + prevVec[1]];\n var vecLength = Math.sqrt(combinedVec[0] * combinedVec[0] + combinedVec[1] * combinedVec[1]);\n var normedVec = [combinedVec[0] / vecLength, combinedVec[1] / vecLength];\n var offsetVec = [-15 * normedVec[0], -15 * normedVec[1]];\n\n newX = self.nodes[i-1].x + offsetVec[0];\n newY = self.nodes[i-1].y + offsetVec[1];\n\n var newNode = {'name': i + startNumber -1,\n 'num': -1,\n 'radius': 6,\n 'rna': self,\n 'nodeType': 'label',\n 'structName': self.structName,\n 'elemType': 'l',\n 'x': newX,\n 'y': newY,\n 'px': newX,\n 'py': newY,\n 'uid': slugid.nice() };\n var newLink = {'source': self.nodes[i-1],\n 'target': newNode,\n 'value': 1,\n 'linkType': 'label_link',\n 'uid': slugid.nice() };\n\n self.nodes.push(newNode);\n self.links.push(newLink);\n }\n }\n\n return self;\n };\n\n self.recalculateElements = function() {\n self.removePseudoknots();\n self.elements = self.ptToElements(self.pairtable, 0, 1, self.dotbracket.length);\n\n if (self.circular) {\n //check to see if the external loop is a hairpin or a multiloop\n let externalLoop = self.elements.filter(function(d) { if (d[0] == 'e') return true; });\n\n if (externalLoop.length > 0) {\n eloop = externalLoop[0];\n nucs = eloop[2].sort(numberSort);\n\n prev = nucs[0];\n hloop = true;\n numGreater = 0;\n for (let i = 1; i < nucs.length; i++) {\n if (nucs[i] - prev > 1) {\n numGreater += 1;\n }\n prev = nucs[i];\n }\n\n if (numGreater == 1) {\n eloop[0] = 'h';\n } else if (numGreater == 2) {\n eloop[0] = 'i';\n } else {\n eloop[0] = 'm';\n }\n }\n }\n\n return self;\n };\n\n self.reassignLinkUids = function() {\n // reassign uids to the links, corresponding to the uids of the two nodes\n // they connect\n var i;\n\n for (var i = 0; i < self.links.length; i++) {\n self.links[i].uid = self.links[i].source.uid + self.links[i].target.uid;\n }\n\n return self;\n }\n\n self.removePseudoknots = function() {\n if (self.pairtable.length > 1)\n self.pseudoknotPairs = self.pseudoknotPairs.concat(rnaUtilities.removePseudoknotsFromPairtable(self.pairtable));\n\n return self;\n };\n\n self.addPseudoknots = function() {\n /* Add all of the pseudoknot pairs which are stored outside\n * of the pairtable back to the pairtable\n */\n var pt = self.pairtable;\n var pseudoknotPairs = self.pseudoknotPairs;\n\n for (var i = 0; i < pseudoknotPairs.length; i++) {\n pt[pseudoknotPairs[i][0]] = pseudoknotPairs[i][1];\n pt[pseudoknotPairs[i][1]] = pseudoknotPairs[i][0];\n }\n\n self.pseudoknotPairs = [];\n return self;\n };\n\n self.addName = function(name) {\n if (typeof name == 'undefined') {\n self.name = '';\n return self;\n } else {\n self.name = name;\n return self;\n }\n };\n\n\n if (self.rnaLength > 0)\n self.recalculateElements();\n\n self.getNodeFromNucleotides = function(nucs) {\n /* Get a node given a nucleotide number or an array of nucleotide\n * numbers indicating an element node */\n if (Object.prototype.toString.call(nucs) === '[object Array]') {\n for (let j = 0; j < self.nodes.length; j++) {\n if ('nucs' in self.nodes[j]) {\n if (self.nodes[j].nucs.equals(nucs)) {\n return self.nodes[j];\n }\n }\n }\n } else {\n for (let j = 0; j < self.nodes.length; j++) {\n if (self.nodes[j].num == nucs) {\n return self.nodes[j];\n }\n }\n }\n\n console.log('ERROR: No node found for nucs:', nucs);\n return null;\n }\n}\n\nexport function moleculesToJson(moleculesJson) {\n /* Convert a list of RNA and protein molecules to a list of RNAGraph\n * ProteinGraph and extraLinks structure */\n\n var nodes = {}; //index the nodes by uid\n var graphs = [];\n var extraLinks = [];\n\n\n // Create the graphs for each molecule\n for (var i = 0; i < moleculesJson.molecules.length; i++) {\n var molecule = moleculesJson.molecules[i];\n var rg;\n\n if (molecule.type == 'rna') {\n rg = new RNAGraph(molecule.seq, molecule.ss, molecule.header);\n rg.circularizeExternal = true;\n rg.elementsToJson()\n .addPositions('nucleotide', molecule.positions)\n .addLabels()\n .reinforceStems()\n .reinforceLoops();\n\n\n } else if (molecule.type == 'protein') {\n rg = new ProteinGraph(molecule.header, molecule.size);\n\n }\n\n rg.addUids(molecule.uids);\n\n for (var j = 0; j < rg.nodes.length; j++) {\n nodes[rg.nodes[j].uid] = rg.nodes[j];\n }\n\n graphs.push(rg);\n }\n\n //Add the extra links\n for (var i = 0; i < moleculesJson.extraLinks.length; i++) {\n link = moleculesJson.extraLinks[i];\n\n link.source = nodes[link.source];\n link.target = nodes[link.target];\n link.uid = slugid.nice();\n\n extraLinks.push(link);\n }\n\n return {'graphs': graphs, 'extraLinks': extraLinks};\n};\n","export function simpleXyCoordinates (pair_table) {\n var INIT_ANGLE=0.; /* initial bending angle */\n var INIT_X = 100.; /* coordinate of first digit */\n var INIT_Y = 100.; /* see above */\n var RADIUS = 15.;\n\n var x = [], y = [];\n\n var i, len;\n var alpha;\n\n len = pair_table[0];\n var angle = Array.apply(null, new Array(len+5)).map(Number.prototype.valueOf,0); \n var loop_size = Array.apply(null, new Array(16+Math.floor(len/5)))\n .map(Number.prototype.valueOf, 0); \n var stack_size = Array.apply(null, new Array(16+Math.floor(len/5)))\n .map(Number.prototype.valueOf, 0); \n\n var lp = 0;\n var stk = 0;\n var PIHALF = Math.PI / 2;\n\n\n var loop = function(i, j, pair_table)\n /* i, j are the positions AFTER the last pair of a stack; i.e\n i-1 and j+1 are paired. */\n {\n var count = 2; /* counts the VERTICES of a loop polygon; that's\n NOT necessarily the number of unpaired bases!\n Upon entry the loop has already 2 vertices, namely\n the pair i-1/j+1. */\n\n var r = 0, bubble = 0; /* bubble counts the unpaired digits in loops */\n\n var i_old, partner, k, l, start_k, start_l, fill, ladder;\n var begin, v, diff;\n var polygon;\n\n var remember = Array.apply(null, new Array((3+Math.floor((j-i)/5)*2))).map(Number.prototype.valueOf, 0);\n\n i_old = i-1, j++; /* j has now been set to the partner of the\n previous pair for correct while-loop\n termination. */\n while (i != j) {\n partner = pair_table[i];\n if ((!partner) || (i==0))\n i++, count++, bubble++;\n else {\n count += 2;\n k = i, l = partner; /* beginning of stack */\n remember[++r] = k;\n remember[++r] = l;\n i = partner+1; /* next i for the current loop */\n\n start_k = k, start_l = l;\n ladder = 0;\n do {\n k++, l--, ladder++; /* go along the stack region */\n }\n while ((pair_table[k] == l) && (pair_table[k] > k));\n\n fill = ladder-2;\n if (ladder >= 2) {\n angle[start_k+1+fill] += PIHALF; /* Loop entries and */\n angle[start_l-1-fill] += PIHALF; /* exits get an */\n angle[start_k] += PIHALF; /* additional PI/2. */\n angle[start_l] += PIHALF; /* Why ? (exercise) */\n if (ladder > 2) {\n for (; fill >= 1; fill--) {\n angle[start_k+fill] = Math.PI; /* fill in the angles */\n angle[start_l-fill] = Math.PI; /* for the backbone */\n }\n }\n }\n stack_size[++stk] = ladder;\n if (k <= l)\n loop(k, l, pair_table);\n }\n }\n\n polygon = Math.PI*(count-2)/count; /* bending angle in loop polygon */\n remember[++r] = j;\n begin = i_old < 0 ? 0 : i_old;\n for (v = 1; v <= r; v++) {\n diff = remember[v]-begin;\n for (fill = 0; fill <= diff; fill++)\n angle[begin+fill] += polygon;\n if (v > r)\n break;\n begin = remember[++v];\n }\n loop_size[++lp] = bubble;\n }\n\n loop(0, len+1, pair_table);\n loop_size[lp] -= 2; /* correct for cheating with function loop */\n\n alpha = INIT_ANGLE;\n x[0] = INIT_X;\n y[0] = INIT_Y;\n\n var poss = [];\n\n poss.push([x[0], y[0]]);\n for (i = 1; i < len; i++) {\n x[i] = x[i-1]+RADIUS*Math.cos(alpha);\n y[i] = y[i-1]+RADIUS*Math.sin(alpha);\n\n poss.push([x[i], y[i]]);\n alpha += Math.PI-angle[i+1];\n }\n\n return poss;\n}\n","export function Radloop() {\n\tthis.radius = null;\n\tthis.loopnumber = null;\n\tthis.next = null;\n this.prev = null;\n}\n\nRadloop.prototype.getRadius = function(){\n\treturn this.radius;\n}\n\nRadloop.prototype.setRadius = function(radius){\n\tthis.radius = radius;\n}\n\nRadloop.prototype.getLoopnumber = function(){\n\treturn this.loopnumber;\n}\n\nRadloop.prototype.setLoopnumber = function(loopnumber){\n\tthis.loopnumber = loopnumber;\n}\n\nRadloop.prototype.getNext = function(){\n\treturn this.next;\n}\n\nRadloop.prototype.setNext = function(next){\n\tthis.next = next;\n}\n\nRadloop.prototype.getPrev = function(){\n\treturn this.prev;\n}\n\nRadloop.prototype.setPrev = function(prev){\n\tthis.prev = prev;\n}\n","import {Region} from './region.js';\n\nexport function Base() {\n\tthis.mate = null;\n\tthis.x = null;\n this.y = null;\n\tthis.extracted = null;\n\tthis.region = new Region();\n}\n\nBase.prototype.getMate = function(){\n\treturn this.mate;\n}\n\nBase.prototype.setMate = function(mate){\n\tthis.mate = mate;\n}\n\nBase.prototype.getX = function(){\n\treturn this.x;\n}\n\nBase.prototype.setX = function(x){\n\tthis.x = x;\n}\n\nBase.prototype.getY = function(){\n\treturn this.y;\n}\n\nBase.prototype.setY = function(y){\n\tthis.y = y;\n}\n\nBase.prototype.isExtracted = function(){\n\treturn this.extracted;\n}\n\nBase.prototype.setExtracted = function(extracted){\n\tthis.extracted = extracted;\n}\n\nBase.prototype.getRegion = function(){\n\treturn this.region;\n}\n\nBase.prototype.setRegion = function(region){\n\tthis.region = region;\n}\n","import {Radloop} from './radloop.js';\nimport {Connection} from './connection.js';\nimport {Region} from './region.js';\nimport {Base} from './base.js';\nimport {Loop} from './loop.js';\n\nexport function NAView(){\n this.ANUM = 9999.0;\n\tthis.MAXITER = 500;\n\n\tthis.bases = [];\n\tthis.nbase = null;\n this.nregion = null;\n this.loop_count = null;\n\n\tthis.root = new Loop();\n\tthis.loops = [];\n\n\tthis.regions = [];\n\n\tthis.rlphead = new Radloop();\n\n\tthis.lencut = 0.8;\n\tthis.RADIUS_REDUCTION_FACTOR = 1.4;\n\n\t// show algorithm step by step\n\tthis.angleinc = null;\n\n\tthis._h = null;\n\n\t// private boolean noIterationFailureYet = true;\n\n\tthis.HELIX_FACTOR = 0.6;\n\tthis.BACKBONE_DISTANCE = 27;\n}\n\nNAView.prototype.naview_xy_coordinates = function(pair_table){\n var x = [];\n\tvar y = [];\n if (pair_table.length === 0 || pair_table[0] === 0){\n return 0;\n }\n var i;\n this.nbase = pair_table[0];\n this.bases = [];\n for (var index = 0; index < this.nbase + 1; index++){\n this.bases.push(new Base());\n }\n this.regions = [];\n for (var index = 0; index < this.nbase + 1; index++){\n this.regions.push(new Region());\n }\n this.read_in_bases(pair_table);\n this.rlphead = null;\n this.find_regions();\n this.loop_count = 0;\n this.loops = [];\n for (var index = 0; index < this.nbase + 1; index++){\n this.loops.push(new Loop());\n }\n this.construct_loop(0);\n this.find_central_loop();\n this.traverse_loop(this.root, null);\n\n for (i = 0; i < this.nbase; i++){\n x.push(100 + this.BACKBONE_DISTANCE * this.bases[i + 1].getX());\n y.push(100 + this.BACKBONE_DISTANCE * this.bases[i + 1].getY());\n }\n\n return {\n nbase: this.nbase,\n x: x,\n y: y\n }\n}\n\nNAView.prototype.read_in_bases = function read_in_bases(pair_table){\n var i = null;\n var npairs = null;\n\n // Set up an origin.\n this.bases.push(new Base());\n this.bases[0].setMate(0);\n this.bases[0].setExtracted(false);\n this.bases[0].setX(this.ANUM);\n this.bases[0].setY(this.ANUM);\n\n for (npairs = 0, i = 1; i <= this.nbase; i++){\n this.bases.push(new Base());\n this.bases[i].setExtracted(false);\n this.bases[i].setX(this.ANUM);\n this.bases[i].setY(this.ANUM);\n this.bases[i].setMate(pair_table[i]);\n if (pair_table[i] > i)\n npairs++;\n }\n // must have at least 1 pair to avoid segfault\n if (npairs == 0){\n this.bases[1].setMate(this.nbase);\n this.bases[this.nbase].setMate(1);\n }\n}\n\nNAView.prototype.find_regions = function find_regions(){\n var i = null;\n var mate = null;\n var nb1 = null;\n\n nb1 = this.nbase + 1;\n var mark = [];\n for (i = 0; i < nb1; i++){\n mark.push(false);\n }\n this.nregion = 0;\n for (i = 0; i <= this.nbase; i++) {\n if ((mate = this.bases[i].getMate()) != 0 && !mark[i]) {\n this.regions[this.nregion].setStart1(i);\n this.regions[this.nregion].setEnd2(mate);\n mark[i] = true;\n mark[mate] = true;\n this.bases[i].setRegion(this.regions[this.nregion]);\n this.bases[mate].setRegion(this.regions[this.nregion]);\n for (i++, mate--; i < mate && this.bases[i].getMate() == mate; i++, mate--) {\n mark[mate] = true;\n mark[i]= true;\n this.bases[i].setRegion(this.regions[this.nregion]);\n this.bases[mate].setRegion(this.regions[this.nregion]);\n }\n this.regions[this.nregion].setEnd1(--i);\n this.regions[this.nregion].setStart2(mate + 1);\n\n this.nregion++;\n }\n }\n}\n\nNAView.prototype.construct_loop = function construct_loop(ibase){\n var i = null;\n var mate = null;\n var retloop = new Loop();\n var lp = new Loop();\n var cp = new Connection();\n var rp = new Region();\n var rlp = new Radloop();\n retloop = this.loops[this.loop_count++];\n retloop.setNconnection(0);\n retloop.setDepth(0);\n retloop.setNumber(this.loop_count);\n retloop.setRadius(0.0);\n\n for (rlp = this.rlphead; rlp != null; rlp = rlp.getNext())\n if (rlp.getLoopnumber() == this.loop_count)\n retloop.setRadius(rlp.getRadius());\n i = ibase;\n do {\n if ((mate = this.bases[i].getMate()) != 0) {\n rp = this.bases[i].getRegion();\n if (!this.bases[rp.getStart1()].isExtracted()) {\n if (i == rp.getStart1()) {\n this.bases[rp.getStart1()].setExtracted(true);\n this.bases[rp.getEnd1()].setExtracted(true);\n this.bases[rp.getStart2()].setExtracted(true);\n this.bases[rp.getEnd2()].setExtracted(true);\n lp = this.construct_loop(rp.getEnd1() < this.nbase ? rp.getEnd1() + 1\n : 0);\n } else if (i == rp.getStart2()) {\n this.bases[rp.getStart2()].setExtracted(true);\n this.bases[rp.getEnd2()].setExtracted(true);\n this.bases[rp.getStart1()].setExtracted(true);\n this.bases[rp.getEnd1()].setExtracted(true);\n lp = this.construct_loop(rp.getEnd2() < this.nbase ? rp.getEnd2() + 1\n : 0);\n } else {\n console.log(\"Something went terribly wrong ....\");\n }\n retloop.setNconnection(retloop.getNconnection() + 1);\n cp = new Connection();\n retloop.setConnection(retloop.getNconnection() - 1,\tcp);\n retloop.setConnection(retloop.getNconnection(), null);\n cp.setLoop(lp);\n cp.setRegion(rp);\n if(i == rp.getStart1()) {\n cp.setStart(rp.getStart1());\n cp.setEnd(rp.getEnd2());\n } else {\n cp.setStart(rp.getStart2());\n cp.setEnd(rp.getEnd1());\n }\n cp.setExtruded(false);\n cp.setBroken(false);\n lp.setNconnection(lp.getNconnection() + 1);\n cp = new Connection();\n lp.setConnection(lp.getNconnection() - 1, cp);\n lp.setConnection(lp.getNconnection(), null);\n cp.setLoop(retloop);\n cp.setRegion(rp);\n if (i == rp.getStart1()) {\n cp.setStart(rp.getStart2());\n cp.setEnd(rp.getEnd1());\n } else {\n cp.setStart(rp.getStart1());\n cp.setEnd(rp.getEnd2());\n }\n cp.setExtruded(false);\n cp.setBroken(false);\n }\n i = mate;\n }\n if (++i > this.nbase)\n i = 0;\n } while (i != ibase);\n return retloop;\n}\n\nNAView.prototype.find_central_loop = function find_central_loop(){\n var lp = new Loop();\n var maxconn = null;\n var maxdepth = null;\n var i = null;\n\n determine_depths.bind(this)();\n maxconn = 0;\n maxdepth = -1;\n for (i = 0; i < this.loop_count; i++) {\n lp = this.loops[i];\n if (lp.getNconnection() > maxconn) {\n maxdepth = lp.getDepth();\n maxconn = lp.getNconnection();\n this.root = lp;\n } else if (lp.getDepth() > maxdepth\n && lp.getNconnection() == maxconn) {\n maxdepth = lp.getDepth();\n this.root = lp;\n }\n }\n}\n\nfunction determine_depths() {\n var lp = new Loop();\n var i = null;\n var j = null;\n\n for (i = 0; i < this.loop_count; i++) {\n lp = this.loops[i];\n for (j = 0; j < this.loop_count; j++){\n this.loops[j].setMark(false);\n }\n lp.setDepth(depth(lp));\n }\n}\n\nfunction depth(lp){\n var count = null;\n var ret = null;\n var d = null;\n\n if (lp.getNconnection() <= 1){\n return 0;\n }\n if (lp.isMark()){\n return -1;\n }\n lp.setMark(true);\n count = 0;\n ret = 0;\n for (var i = 0; lp.getConnection(i) != null; i++) {\n d = depth(lp.getConnection(i).getLoop());\n if (d >= 0) {\n if (++count == 1){\n ret = d;\n }\n else if (ret > d){\n ret = d;\n }\n }\n }\n lp.setMark(false);\n return ret + 1;\n}\n\nNAView.prototype.traverse_loop = function traverse_loop(lp, anchor_connection){\n var xs, ys, xe, ye, xn, yn, angleinc, r;\n var radius, xc, yc, xo, yo, astart, aend, a;\n var cp, cpnext, acp, cpprev;\n var i, j, n, ic;\n var da, maxang;\n var count, icstart, icend, icmiddle, icroot;\n var done, done_all_connections, rooted;\n var sign;\n var midx, midy, nrx, nry, mx, my, vx, vy, dotmv, nmidx, nmidy;\n var icstart1, icup, icdown, icnext, direction;\n var dan, dx, dy, rr;\n var cpx, cpy, cpnextx, cpnexty, cnx, cny, rcn, rc, lnx, lny, rl, ac, acn, sx, sy, dcp;\n var imaxloop = 0;\n\n angleinc = 2 * Math.PI / (this.nbase + 1);\n acp = null;\n icroot = -1;\n var indice = 0;\n\n for (ic = 0; (cp = lp.getConnection(indice)) != null; indice++, ic++) {\n xs = -Math.sin(angleinc * cp.getStart());\n ys = Math.cos(angleinc * cp.getStart());\n xe = -Math.sin(angleinc * cp.getEnd());\n ye = Math.cos(angleinc * cp.getEnd());\n xn = ye - ys;\n yn = xs - xe;\n r = Math.sqrt(xn * xn + yn * yn);\n cp.setXrad(xn / r);\n cp.setYrad(yn / r);\n cp.setAngle(Math.atan2(yn, xn));\n if (cp.getAngle() < 0.0){\n cp.setAngle(cp.getAngle() + 2 * Math.PI);\n }\n if (anchor_connection != null\n && anchor_connection.getRegion() == cp.getRegion()) {\n acp = cp;\n icroot = ic;\n }\n }\n set_radius: while (true) {\n this.determine_radius(lp, this.lencut);\n radius = lp.getRadius()/this.RADIUS_REDUCTION_FACTOR;\n if (anchor_connection == null){\n xc = yc = 0.0;\n }\n else {\n xo = (this.bases[acp.getStart()].getX() + this.bases\n [acp.getEnd()].getX()) / 2.0;\n yo = (this.bases[acp.getStart()].getY() + this.bases\n [acp.getEnd()].getY()) / 2.0;\n xc = xo - radius * acp.getXrad();\n yc = yo - radius * acp.getYrad();\n }\n\n // The construction of the connectors will proceed in blocks of\n // connected connectors, where a connected connector pairs means two\n // connectors that are forced out of the drawn circle because they\n // are too close together in angle.\n\n // First, find the start of a block of connected connectors\n\n if (icroot == -1){\n icstart = 0;\n }\n else {\n icstart = icroot;\n }\n cp = lp.getConnection(icstart);\n count = 0;\n done = false;\n do {\n j = icstart - 1;\n if (j < 0){\n j = lp.getNconnection() - 1;\n }\n cpprev = lp.getConnection(j);\n if (!this.connected_connection(cpprev, cp)) {\n done = true;\n }\n else {\n icstart = j;\n cp = cpprev;\n }\n if (++count > lp.getNconnection()) {\n // Here everything is connected. Break on maximum angular\n // separation between connections.\n maxang = -1.0;\n for (ic = 0; ic < lp.getNconnection(); ic++) {\n j = ic + 1;\n if (j >= lp.getNconnection()){\n j = 0;\n }\n cp = lp.getConnection(ic);\n cpnext = lp.getConnection(j);\n ac = cpnext.getAngle() - cp.getAngle();\n if (ac < 0.0){\n ac += 2 * Math.PI;\n }\n if (ac > maxang) {\n maxang = ac;\n imaxloop = ic;\n }\n }\n icend = imaxloop;\n icstart = imaxloop + 1;\n if (icstart >= lp.getNconnection()){\n icstart = 0;\n }\n cp = lp.getConnection(icend);\n cp.setBroken(true);\n done = true;\n }\n } while (!done);\n done_all_connections = false;\n icstart1 = icstart;\n while (!done_all_connections) {\n count = 0;\n done = false;\n icend = icstart;\n rooted = false;\n while (!done) {\n cp = lp.getConnection(icend);\n if (icend == icroot){\n rooted = true;\n }\n j = icend + 1;\n if (j >= lp.getNconnection()) {\n j = 0;\n }\n cpnext = lp.getConnection(j);\n if (this.connected_connection(cp, cpnext)) {\n if (++count >= lp.getNconnection()){\n break;\n }\n icend = j;\n }\n else {\n done = true;\n }\n }\n icmiddle = this.find_ic_middle(icstart, icend, anchor_connection,\n acp, lp);\n ic = icup = icdown = icmiddle;\n done = false;\n direction = 0;\n while (!done) {\n if (direction < 0) {\n ic = icup;\n }\n else if (direction == 0) {\n ic = icmiddle;\n }\n else {\n ic = icdown;\n }\n if (ic >= 0) {\n cp = lp.getConnection(ic);\n if (anchor_connection == null || acp != cp) {\n if (direction == 0) {\n astart = cp.getAngle()\n - Math.asin(1.0 / 2.0 / radius);\n aend = cp.getAngle()\n + Math.asin(1.0 / 2.0 / radius);\n this.bases[cp.getStart()].setX(\n xc + radius * Math.cos(astart));\n this.bases[cp.getStart()].setY(\n yc + radius * Math.sin(astart));\n this.bases[cp.getEnd()].setX(\n xc + radius * Math.cos(aend));\n this.bases[cp.getEnd()].setY(\n yc + radius * Math.sin(aend));\n }\n else if (direction < 0) {\n j = ic + 1;\n if (j >= lp.getNconnection()){\n j = 0;\n }\n cp = lp.getConnection(ic);\n cpnext = lp.getConnection(j);\n cpx = cp.getXrad();\n cpy = cp.getYrad();\n ac = (cp.getAngle() + cpnext.getAngle()) / 2.0;\n if (cp.getAngle() > cpnext.getAngle()){\n ac -= Math.PI;\n }\n cnx = Math.cos(ac);\n cny = Math.sin(ac);\n lnx = cny;\n lny = -cnx;\n da = cpnext.getAngle() - cp.getAngle();\n if (da < 0.0){\n da += 2 * Math.PI;\n }\n if (cp.isExtruded()) {\n if (da <= Math.PI / 2){\n rl = 2.0;\n }\n else {\n rl = 1.5;\n }\n }\n else {\n rl = 1.0;\n }\n this.bases[cp.getEnd()].setX(\n this.bases[cpnext.getStart()].getX()\n + rl * lnx);\n this.bases[cp.getEnd()].setY(\n this.bases[cpnext.getStart()].getY()\n + rl * lny);\n this.bases[cp.getStart()].setX(\n this.bases[cp.getEnd()].getX() + cpy);\n this.bases[cp.getStart()].setY(\n this.bases[cp.getEnd()].getY() - cpx);\n } else {\n j = ic - 1;\n if (j < 0){\n j = lp.getNconnection() - 1;\n }\n cp = lp.getConnection(j);\n cpnext = lp.getConnection(ic);\n cpnextx = cpnext.getXrad();\n cpnexty = cpnext.getYrad();\n ac = (cp.getAngle() + cpnext.getAngle()) / 2.0;\n if (cp.getAngle() > cpnext.getAngle()){\n ac -= Math.PI;\n }\n cnx = Math.cos(ac);\n cny = Math.sin(ac);\n lnx = -cny;\n lny = cnx;\n da = cpnext.getAngle() - cp.getAngle();\n if (da < 0.0){\n da += 2 * Math.PI;\n }\n if (cp.isExtruded()) {\n if (da <= Math.PI / 2){\n rl = 2.0;\n }\n else {\n rl = 1.5;\n }\n }\n else {\n rl = 1.0;\n }\n this.bases[cpnext.getStart()].setX(\n this.bases[cp.getEnd()].getX() + rl\n * lnx);\n this.bases[cpnext.getStart()].setY(\n this.bases[cp.getEnd()].getY() + rl\n * lny);\n this.bases[cpnext.getEnd()].setX(\n this.bases[cpnext.getStart()].getX()\n - cpnexty);\n this.bases[cpnext.getEnd()].setY(\n this.bases[cpnext.getStart()].getY()\n + cpnextx);\n }\n }\n }\n if (direction < 0) {\n if (icdown == icend) {\n icdown = -1;\n }\n else if (icdown >= 0) {\n if (++icdown >= lp.getNconnection()) {\n icdown = 0;\n }\n }\n direction = 1;\n }\n else {\n if (icup == icstart){\n icup = -1;\n }\n else if (icup >= 0) {\n if (--icup < 0) {\n icup = lp.getNconnection() - 1;\n }\n }\n direction = -1;\n }\n done = icup == -1 && icdown == -1;\n }\n icnext = icend + 1;\n if (icnext >= lp.getNconnection()){\n icnext = 0;\n }\n if (icend != icstart\n && (!(icstart == icstart1 && icnext == icstart1))) {\n\n // Move the bases just constructed (or the radius) so that\n // the bisector of the end points is radius distance away\n // from the loop center.\n\n cp = lp.getConnection(icstart);\n cpnext = lp.getConnection(icend);\n dx = this.bases[cpnext.getEnd()].getX()\n - this.bases[cp.getStart()].getX();\n dy = this.bases[cpnext.getEnd()].getY()\n - this.bases[cp.getStart()].getY();\n midx = this.bases[cp.getStart()].getX() + dx / 2.0;\n midy = this.bases[cp.getStart()].getY() + dy / 2.0;\n rr = Math.sqrt(dx * dx + dy * dy);\n mx = dx / rr;\n my = dy / rr;\n vx = xc - midx;\n vy = yc - midy;\n rr = Math.sqrt(dx * dx + dy * dy);\n vx /= rr;\n vy /= rr;\n dotmv = vx * mx + vy * my;\n nrx = dotmv * mx - vx;\n nry = dotmv * my - vy;\n rr = Math.sqrt(nrx * nrx + nry * nry);\n nrx /= rr;\n nry /= rr;\n\n // Determine which side of the bisector the center should\n // be.\n\n dx = this.bases[cp.getStart()].getX() - xc;\n dy = this.bases[cp.getStart()].getY() - yc;\n ac = Math.atan2(dy, dx);\n if (ac < 0.0){\n ac += 2 * Math.PI;\n }\n dx = this.bases[cpnext.getEnd()].getX() - xc;\n dy = this.bases[cpnext.getEnd()].getY() - yc;\n acn = Math.atan2(dy, dx);\n if (acn < 0.0){\n acn += 2 * Math.PI;\n }\n if (acn < ac){\n acn += 2 * Math.PI;\n }\n if (acn - ac > Math.PI){\n sign = -1;\n }\n else {\n sign = 1;\n }\n nmidx = xc + sign * radius * nrx;\n nmidy = yc + sign * radius * nry;\n if (rooted) {\n xc -= nmidx - midx;\n yc -= nmidy - midy;\n }\n else {\n for (ic = icstart;;) {\n cp = lp.getConnection(ic);\n i = cp.getStart();\n this.bases[i].setX(\n this.bases[i].getX() + nmidx - midx);\n this.bases[i].setY(\n this.bases[i].getY() + nmidy - midy);\n i = cp.getEnd();\n this.bases[i].setX(\n this.bases[i].getX() + nmidx - midx);\n this.bases[i].setY(\n this.bases[i].getY() + nmidy - midy);\n if (ic == icend){\n break;\n }\n if (++ic >= lp.getNconnection()){\n ic = 0;\n }\n }\n }\n }\n icstart = icnext;\n done_all_connections = icstart == icstart1;\n }\n for (ic = 0; ic < lp.getNconnection(); ic++) {\n cp = lp.getConnection(ic);\n j = ic + 1;\n if (j >= lp.getNconnection()){\n j = 0;\n }\n cpnext = lp.getConnection(j);\n dx = this.bases[cp.getEnd()].getX() - xc;\n dy = this.bases[cp.getEnd()].getY() - yc;\n rc = Math.sqrt(dx * dx + dy * dy);\n ac = Math.atan2(dy, dx);\n if (ac < 0.0){\n ac += 2 * Math.PI;\n }\n dx = this.bases[cpnext.getStart()].getX() - xc;\n dy = this.bases[cpnext.getStart()].getY() - yc;\n rcn = Math.sqrt(dx * dx + dy * dy);\n acn = Math.atan2(dy, dx);\n if (acn < 0.0){\n acn += 2 * Math.PI;\n }\n if (acn < ac){\n acn += 2 * Math.PI;\n }\n dan = acn - ac;\n dcp = cpnext.getAngle() - cp.getAngle();\n if (dcp <= 0.0){\n dcp += 2 * Math.PI;\n }\n if (Math.abs(dan - dcp) > Math.PI) {\n if (cp.isExtruded()) {\n console.log(\"Warning from traverse_loop. Loop \"\n + lp.getNumber() + \" has crossed regions\\n\");\n }\n else if ((cpnext.getStart() - cp.getEnd()) != 1) {\n cp.setExtruded(true);\n continue set_radius; // remplacement du goto\n }\n }\n if (cp.isExtruded()) {\n this.construct_extruded_segment(cp, cpnext);\n }\n else {\n n = cpnext.getStart() - cp.getEnd();\n if (n < 0){\n n += this.nbase + 1;\n }\n angleinc = dan / n;\n for (j = 1; j < n; j++) {\n i = cp.getEnd() + j;\n if (i > this.nbase){\n i -= this.nbase + 1;\n }\n a = ac + j * angleinc;\n rr = rc + (rcn - rc) * (a - ac) / dan;\n this.bases[i].setX(xc + rr * Math.cos(a));\n this.bases[i].setY(yc + rr * Math.sin(a));\n }\n }\n }\n break;\n }\n for (ic = 0; ic < lp.getNconnection(); ic++) {\n if (icroot != ic) {\n cp = lp.getConnection(ic);\n //IM HERE\n this.generate_region(cp);\n this.traverse_loop(cp.getLoop(), cp);\n }\n }\n n = 0;\n sx = 0.0;\n sy = 0.0;\n for (ic = 0; ic < lp.getNconnection(); ic++) {\n j = ic + 1;\n if (j >= lp.getNconnection()){\n j = 0;\n }\n cp = lp.getConnection(ic);\n cpnext = lp.getConnection(j);\n n += 2;\n sx += this.bases[cp.getStart()].getX()\n + this.bases[cp.getEnd()].getX();\n sy += this.bases[cp.getStart()].getY()\n + this.bases[cp.getEnd()].getY();\n if (!cp.isExtruded()) {\n for (j = cp.getEnd() + 1; j != cpnext.getStart(); j++) {\n if (j > this.nbase){\n j -= this.nbase + 1;\n }\n n++;\n sx += this.bases[j].getX();\n sy += this.bases[j].getY();\n }\n }\n }\n lp.setX(sx / n);\n lp.setY(sy / n);\n}\n\nNAView.prototype.determine_radius = function determine_radius(lp, lencut){\n var mindit, ci, dt, sumn, sumd, radius, dit;\n var i, j, end, start, imindit = 0;\n var cp = new Connection(), cpnext = new Connection();\n var rt2_2 = 0.7071068;\n\n do {\n mindit = 1.0e10;\n for (sumd = 0.0, sumn = 0.0, i = 0; i < lp.getNconnection(); i++) {\n cp = lp.getConnection(i);\n j = i + 1;\n if (j >= lp.getNconnection()){\n j = 0;\n }\n cpnext = lp.getConnection(j);\n end = cp.getEnd();\n start = cpnext.getStart();\n if (start < end){\n start += this.nbase + 1;\n }\n dt = cpnext.getAngle() - cp.getAngle();\n if (dt <= 0.0){\n dt += 2 * Math.PI;\n }\n if (!cp.isExtruded()){\n ci = start - end;\n }\n else {\n if (dt <= Math.PI / 2){\n ci = 2.0;\n }\n else {\n ci = 1.5;\n }\n }\n sumn += dt * (1.0 / ci + 1.0);\n sumd += dt * dt / ci;\n dit = dt / ci;\n if (dit < mindit && !cp.isExtruded() && ci > 1.0) {\n mindit = dit;\n imindit = i;\n }\n }\n radius = sumn / sumd;\n if (radius < rt2_2){\n radius = rt2_2;\n }\n if (mindit * radius < lencut) {\n lp.getConnection(imindit).setExtruded(true);\n }\n } while (mindit * radius < lencut);\n if (lp.getRadius() > 0.0){\n radius = lp.getRadius();\n }\n else {\n lp.setRadius(radius);\n }\n}\n\nNAView.prototype.find_ic_middle = function find_ic_middle(icstart, icend, anchor_connection, acp, lp){\n var count, ret, ic, i;\n var done;\n\n count = 0;\n ret = -1;\n ic = icstart;\n done = false;\n while (!done) {\n if (count++ > lp.getNconnection() * 2) {\n console.log(\"Infinite loop in 'find_ic_middle'\");\n }\n if (anchor_connection != null && lp.getConnection(ic) == acp) {\n ret = ic;\n }\n done = ic == icend;\n if (++ic >= lp.getNconnection()) {\n ic = 0;\n }\n }\n if (ret == -1) {\n for (i = 1, ic = icstart; i < (count + 1) / 2; i++) {\n if (++ic >= lp.getNconnection())\n ic = 0;\n }\n ret = ic;\n }\n return ret;\n}\n\nNAView.prototype.construct_extruded_segment = function construct_extruded_segment(cp, cpnext){\n var astart, aend1, aend2, aave, dx, dy, a1, a2, ac, rr, da, dac;\n var start, end, n, nstart, nend;\n var collision;\n\n astart = cp.getAngle();\n aend2 = aend1 = cpnext.getAngle();\n if (aend2 < astart){\n aend2 += 2 * Math.PI;\n }\n aave = (astart + aend2) / 2.0;\n start = cp.getEnd();\n end = cpnext.getStart();\n n = end - start;\n if (n < 0){\n n += this.nbase + 1;\n }\n da = cpnext.getAngle() - cp.getAngle();\n if (da < 0.0) {\n da += 2 * Math.PI;\n }\n if (n == 2) {\n this.construct_circle_segment(start, end);\n }\n else {\n dx = this.bases[end].getX() - this.bases[start].getX();\n dy = this.bases[end].getY() - this.bases[start].getY();\n rr = Math.sqrt(dx * dx + dy * dy);\n dx /= rr;\n dy /= rr;\n if (rr >= 1.5 && da <= Math.PI / 2) {\n nstart = start + 1;\n if (nstart > this.nbase){\n nstart -= this.nbase + 1;\n }\n nend = end - 1;\n if (nend < 0){\n nend += this.nbase + 1;\n }\n this.bases[nstart].setX(this.bases[start].getX() + 0.5 * dx);\n this.bases[nstart].setY(this.bases[start].getY() + 0.5 * dy);\n this.bases[nend].setX(this.bases[end].getX() - 0.5 * dx);\n this.bases[nend].setY(this.bases[end].getY() - 0.5 * dy);\n start = nstart;\n end = nend;\n }\n do {\n collision = false;\n this.construct_circle_segment(start, end);\n nstart = start + 1;\n if (nstart > this.nbase) {\n nstart -= this.nbase + 1;\n }\n dx = this.bases[nstart].getX() - this.bases[start].getX();\n dy = this.bases[nstart].getY() - this.bases[start].getY();\n a1 = Math.atan2(dy, dx);\n if (a1 < 0.0){\n a1 += 2 * Math.PI;\n }\n dac = a1 - astart;\n if (dac < 0.0){\n dac += 2 * Math.PI;\n }\n if (dac > Math.PI){\n collision = true;\n }\n nend = end - 1;\n if (nend < 0){\n nend += this.nbase + 1;\n }\n dx = this.bases[nend].getX() - this.bases[end].getX();\n dy = this.bases[nend].getY() - this.bases[end].getY();\n a2 = Math.atan2(dy, dx);\n if (a2 < 0.0){\n a2 += 2 * Math.PI;\n }\n dac = aend1 - a2;\n if (dac < 0.0){\n dac += 2 * Math.PI;\n }\n if (dac > Math.PI){\n collision = true;\n }\n if (collision) {\n ac = this.minf2(aave, astart + 0.5);\n this.bases[nstart].setX(\n this.bases[start].getX() + Math.cos(ac));\n this.bases[nstart].setY(\n this.bases[start].getY() + Math.sin(ac));\n start = nstart;\n ac = this.maxf2(aave, aend2 - 0.5);\n this.bases[nend].setX(this.bases[end].getX() + Math.cos(ac));\n this.bases[nend].setY(this.bases[end].getY() + Math.sin(ac));\n end = nend;\n n -= 2;\n }\n } while (collision && n > 1);\n }\n}\n\nNAView.prototype.construct_circle_segment = function construct_circle_segment(start, end){\n var dx, dy, rr, midx, midy, xn, yn, nrx, nry, mx, my, a;\n var l, j, i;\n\n dx = this.bases[end].getX() - this.bases[start].getX();\n dy = this.bases[end].getY() - this.bases[start].getY();\n rr = Math.sqrt(dx * dx + dy * dy);\n l = end - start;\n if (l < 0){\n l += this.nbase + 1;\n }\n if (rr >= l) {\n dx /= rr;\n dy /= rr;\n for (j = 1; j < l; j++) {\n i = start + j;\n if (i > this.nbase){\n i -= this.nbase + 1;\n }\n this.bases[i].setX(\n this.bases[start].getX() + dx * j / l);\n this.bases[i].setY(\n this.bases[start].getY() + dy * j / l);\n }\n }\n else {\n this.find_center_for_arc((l - 1), rr);\n dx /= rr;\n dy /= rr;\n midx = this.bases[start].getX() + dx * rr / 2.0;\n midy = this.bases[start].getY() + dy * rr / 2.0;\n xn = dy;\n yn = -dx;\n nrx = midx + this._h * xn;\n nry = midy + this._h * yn;\n mx = this.bases[start].getX() - nrx;\n my = this.bases[start].getY() - nry;\n rr = Math.sqrt(mx * mx + my * my);\n a = Math.atan2(my, mx);\n for (j = 1; j < l; j++) {\n i = start + j;\n if (i > this.nbase){\n i -= this.nbase + 1;\n }\n this.bases[i].setX(nrx + rr * Math.cos(a + j * this.angleinc));\n this.bases[i].setY(nry + rr * Math.sin(a + j * this.angleinc));\n }\n }\n}\n\nNAView.prototype.find_center_for_arc = function find_center_for_arc(n, b){\n var h, hhi, hlow, r, disc, theta, e, phi;\n var iter;\n\n hhi = (n + 1.0) / Math.PI;\n // changed to prevent div by zero if (ih)\n hlow = -hhi - b / (n + 1.000001 - b);\n if (b < 1){\n // otherwise we might fail below (ih)\n hlow = 0;\n }\n iter = 0;\n do {\n h = (hhi + hlow) / 2.0;\n r = Math.sqrt(h * h + b * b / 4.0);\n disc = 1.0 - 0.5 / (r * r);\n if (Math.abs(disc) > 1.0) {\n console.log(\"Unexpected large magnitude discriminant = \" + disc\n + \" \" + r);\n }\n theta = Math.acos(disc);\n phi = Math.acos(h / r);\n e = theta * (n + 1) + 2 * phi - 2 * Math.PI;\n if (e > 0.0) {\n hlow = h;\n }\n else {\n hhi = h;\n }\n } while (Math.abs(e) > 0.0001 && ++iter < this.MAXITER);\n if (iter >= this.MAXITER) {\n if (noIterationFailureYet) {\n console.log(\"Iteration failed in find_center_for_arc\");\n noIterationFailureYet = false;\n }\n h = 0.0;\n theta = 0.0;\n }\n this._h = h;\n this.angleinc = theta;\n}\n\nNAView.prototype.generate_region = function generate_region(cp){\n var l, start, end, i, mate;\n var rp;\n\n rp = cp.getRegion();\n l = 0;\n if (cp.getStart() == rp.getStart1()) {\n start = rp.getStart1();\n end = rp.getEnd1();\n }\n else {\n start = rp.getStart2();\n end = rp.getEnd2();\n }\n if (this.bases[cp.getStart()].getX() > this.ANUM - 100.0\n || this.bases[cp.getEnd()].getX() > this.ANUM - 100.0) {\n console.log(\n \"Bad region passed to generate_region. Coordinates not defined.\");\n }\n for (i = start + 1; i <= end; i++) {\n l++;\n this.bases[i].setX(\n this.bases[cp.getStart()].getX() + this.HELIX_FACTOR * l\n * cp.getXrad());\n this.bases[i].setY(\n this.bases[cp.getStart()].getY() + this.HELIX_FACTOR * l\n * cp.getYrad());\n mate = this.bases[i].getMate();\n this.bases[mate].setX(\n this.bases[cp.getEnd()].getX() + this.HELIX_FACTOR * l\n * cp.getXrad());\n this.bases[mate].setY(\n this.bases[cp.getEnd()].getY() + this.HELIX_FACTOR * l\n * cp.getYrad());\n\n }\n}\n\nNAView.prototype.minf2 = function minf2(x1, x2) {\n return ((x1) < (x2)) ? (x1) : (x2);\n}\n\nNAView.prototype.maxf2 = function maxf2(x1, x2) {\n return ((x1) > (x2)) ? (x1) : (x2);\n}\n\nNAView.prototype.connected_connection = function connected_connection(cp, cpnext) {\n if (cp.isExtruded()) {\n return true;\n }\n else if (cp.getEnd() + 1 == cpnext.getStart()) {\n return true;\n }\n else {\n return false;\n }\n}\n","/* Version: 0.2\n* Date: 2015-03-15\n*/\n\nimport fstyle from './fornac.css';\n\nimport d3 from 'd3';\nimport slugid from 'slugid';\nimport {contextMenu} from './d3-context-menu.js';\n\nimport {RNAGraph} from './rnagraph.js';\nimport {ColorScheme, rnaUtilities} from './rnautils.js';\n\nimport {simpleXyCoordinates} from './simplernaplot.js';\nimport {NAView} from './naview/naview.js';\n\nexport function FornaContainer(element, passedOptions = {}) {\n var self = this;\n\n let options = {\n 'editable': false,\n 'zoomable': true,\n 'animation': true,\n 'displayAllLinks': false,\n 'labelInterval': 10,\n 'chargeDistance': 110,\n 'friction': 0.35,\n 'middleCharge': -30,\n 'otherCharge': -30,\n 'linkDistanceMultiplier': 15,\n 'initialSize': null,\n 'layout': 'standard-polygonal',\n 'transitionDuration': 500,\n 'maxNodeRadius': 80 // the maximum radius of a node when the view is centered\n };\n\n self.options = Object.assign(options, passedOptions);\n\n if (self.options.initialSize !== null) {\n self.options.svgW = self.options.initialSize[0];\n self.options.svgH = self.options.initialSize[1];\n } else {\n self.options.svgW = 300;\n self.options.svgH = 300;\n }\n\n self.linkStrengths = {\n 'pseudoknot': 0.00,\n 'proteinChain': 0.00,\n 'chainChain': 0.00,\n 'intermolecule': 10.00,\n 'external': 0.00,\n 'other': 10.00\n };\n\n self.displayParameters = {\n 'displayNumbering': true,\n 'displayNodeOutline': true,\n 'displayNodeLabel': true,\n 'displayLinks': true,\n 'displayPseudoknotLinks': true,\n 'displayProteinLinks': true,\n 'displayDirectionArrows': true\n };\n\n self.colorScheme = 'structure';\n self.customColors = {};\n self.rnas = {};\n self.extraLinks = []; //store links between different RNAs\n\n // global mouse event vars\n var mousedownLink = null,\n mousedownNode = null,\n mouseupNode = null;\n let linkContextMenuShown = false;\n\n let resetMouseVars = () => {\n mousedownNode = null;\n mouseupNode = null;\n mousedownLink = null;\n }\n\n var graph = self.graph = {\n 'nodes':[],\n 'links':[]\n };\n\n Array.prototype.equals = function (array) {\n // if the other array is a falsy value, return\n if (!array)\n return false;\n\n // compare lengths - can save a lot of time\n if (this.length != array.length)\n return false;\n\n for (var i = 0, l=this.length; i < l; i++) {\n // Check if we have nested arrays\n if (this[i] instanceof Array && array[i] instanceof Array) {\n // recurse into the nested arrays\n if (!this[i].equals(array[i]))\n return false;\n }\n else if (this[i] != array[i]) {\n // Warning - two different object instances will never be equal: {x:20} != {x:20}\n return false;\n }\n }\n return true;\n };\n\n /* Register global mouse and key events */\n if (self.options.editable || self.options.animation) {\n var shiftKeydown = false;\n var ctrlKeydown = false;\n\n let keydown = () => {\n switch (d3.event.keyCode) {\n case 68: //'d' key\n console.log('dotbracket:', self.getStructuresDotBracket());\n break;\n case 16:\n shiftKeydown = true;\n break;\n case 17:\n ctrlKeydown = true;\n break;\n case 67: //c\n self.centerView();\n break;\n }\n\n if (ctrlKeydown) {\n // Ctrl key must disable panning and zooming\n if (self.options.zoomable)\n disableZooming()\n // Ctrl Button must enable crosshair and start brusher\n if (self.options.editable || self.options.animation) {\n enableBrushing()\n }\n }\n }\n\n let keyup = () => {\n shiftKeydown = false;\n ctrlKeydown = false;\n\n // enable zoomer\n if (self.options.zoomable)\n enableZooming()\n // disable brushing events\n disableBrushing()\n }\n\n d3.select('body')\n .on('keydown', keydown)\n .on('keyup', keyup)\n .on('contextmenu', function() {\n d3.event.preventDefault();\n });\n }\n\n /* Register global context menu */\n if (self.options.editable) {\n let backgroundMenu = [\n {\n title: 'Add Node',\n action: function(elm, d, i, mousePos) {\n\n },\n children: [{\n 'title': 'A',\n action: function(elm, d, i, mousePos) {\n console.log('mousePos:', mousePos, self.options.svgW, self.options.svgH);\n let canvasMousePos = [xScale.invert(mousePos[0]),\n yScale.invert(mousePos[1])];\n console.log('canvasMousePos', canvasMousePos);\n\n self.addRNA('.', {'sequence': 'A', 'centerPos': canvasMousePos});\n }\n },\n {\n 'title': 'C',\n action: function(elm, d, i, mousePos) {\n console.log('mousePos:', mousePos, self.options.svgW, self.options.svgH);\n let canvasMousePos = [xScale.invert(mousePos[0]),\n yScale.invert(mousePos[1])];\n console.log('canvasMousePos', canvasMousePos);\n\n self.addRNA('.', {'sequence': 'C', 'centerPos': canvasMousePos});\n }\n\n },\n {\n 'title': 'G',\n action: function(elm, d, i, mousePos) {\n console.log('mousePos:', mousePos, self.options.svgW, self.options.svgH);\n let canvasMousePos = [xScale.invert(mousePos[0]),\n yScale.invert(mousePos[1])];\n console.log('canvasMousePos', canvasMousePos);\n\n self.addRNA('.', {'sequence': 'G', 'centerPos': canvasMousePos});\n }\n\n },\n {\n 'title': 'U',\n action: function(elm, d, i, mousePos) {\n console.log('mousePos:', mousePos, self.options.svgW, self.options.svgH);\n let canvasMousePos = [xScale.invert(mousePos[0]),\n yScale.invert(mousePos[1])];\n console.log('canvasMousePos', canvasMousePos);\n\n self.addRNA('.', {'sequence': 'U', 'centerPos': canvasMousePos});\n\n }\n }\n ],\n disabled: false // optional, defaults to false\n }\n ]\n\n let nodeMenu = [\n {\n title: 'Delete Node',\n action: function(elm, d, i) {\n deleteNode(d);\n },\n disabled: false // optional, defaults to false\n },\n {\n title: 'Change Node',\n action: function(elm, d, i) {\n console.log('You have clicked the second item!');\n console.log('The data for this circle is: ' + d);\n },\n children: [\n {\n title: 'A',\n action: function(elm, d, i) {\n changeNode('A', d);\n }\n },\n {\n title: 'C',\n action: function(elm, d, i) {\n changeNode('C', d);\n\n }\n },\n {\n title: 'G',\n action: function(elm, d, i) {\n changeNode('G', d);\n\n }\n },\n {\n title: 'U',\n action: function(elm, d, i) {\n changeNode('U', d);\n }\n },\n ]\n },\n {\n title: 'Insert Before',\n action: function(elm, d, i) {\n\n },\n children: [\n {\n title: 'A',\n action: function(elm, d, i) {\n insertNodeBeforeOrAfter('A', d, -1);\n }\n },\n {\n title: 'C',\n action: function(elm, d, i) {\n insertNodeBeforeOrAfter('C', d, -1);\n\n }\n },\n {\n title: 'G',\n action: function(elm, d, i) {\n insertNodeBeforeOrAfter('G', d, -1);\n\n }\n },\n {\n title: 'U',\n action: function(elm, d, i) {\n insertNodeBeforeOrAfter('U', d, -1);\n }\n },\n ]\n },\n {\n title: 'Insert After',\n action: function(elm, d, i) {\n console.log('d:', d);\n\n },\n children: [\n {\n title: 'A',\n action: function(elm, d, i) {\n insertNodeBeforeOrAfter('A', d, 0);\n\n }\n },\n {\n title: 'C',\n action: function(elm, d, i) {\n insertNodeBeforeOrAfter('C', d, 0);\n }\n },\n {\n title: 'G',\n action: function(elm, d, i) {\n insertNodeBeforeOrAfter('G', d, 0);\n }\n },\n {\n title: 'U',\n action: function(elm, d, i) {\n insertNodeBeforeOrAfter('U', d, 0);\n }\n },\n ]\n }\n ]\n\n self.nodeContextMenu = contextMenu(nodeMenu);\n self.backgroundContextMenu = contextMenu(backgroundMenu);\n\n } else {\n //console.log('empty context menu');\n self.nodeContextMenu = function() {};\n }\n\n /* Draw the plot here */\n d3.select(element).select('svg').remove();\n\n var svg = d3.select(element)\n .attr('tabindex', 1)\n .each(function() { this.focus(); })\n .append('svg:svg')\n .attr('preserveAspectRatio', 'xMidYMid meet')\n .attr('viewBox', '0 0 ' + self.options.svgW + ' ' + self.options.svgH)\n\n self.options.svg = svg;\n\n if (self.options.editable || self.options.animation) {\n var mouseEventHelper = svg.append('svg:g')\n .on('mousemove', () => {\n // only if we are dragging\n if (!mousedownNode) return;\n\n // update drag line\n let mpos = d3.mouse(vis.node());\n dragLine\n .attr('x1', mousedownNode.x)\n .attr('y1', mousedownNode.y)\n .attr('x2', mpos[0])\n .attr('y2', mpos[1]);\n })\n .on('mousedown', () => {\n })\n .on('mouseup', () => {\n if (mousedownNode && !linkContextMenuShown) {\n dragLine.classed(fstyle.transparent, true);\n }\n // clear mouse event vars\n resetMouseVars();\n //update()\n })\n .classed(fstyle.mouseEventHelper, true)\n .style('pointer-events', 'all')\n\n // draw a background layer for mouse events\n mouseEventHelper.append('svg:rect')\n .classed('background', true)\n .style('visibility', 'hidden')\n .attr('width', self.options.svgW)\n .attr('height', self.options.svgH)\n .on('mousedown', function() {\n //console.log('background click');\n deselectAllNodes()\n })\n } else {\n var mouseEventHelper = svg;\n }\n\n var vis = mouseEventHelper.append('svg:g')\n .classed(fstyle.plot, true)\n var visLinks = vis.append('svg:g')\n .classed('fornac-links', true);\n var visNodes = vis.append('svg:g')\n .classed('fornac-nodes', true);\n\n // line displayed when dragging new nodes\n if (self.options.editable) {\n var dragLine = vis.append('line')\n .attr('class', fstyle.dragLine)\n .attr('x1', 0)\n .attr('y1', 0)\n .attr('x2', 0)\n .attr('y2', 0);\n\n svg.on('contextmenu', self.backgroundContextMenu);\n }\n\n /* Zooming related objects and functions */\n var xScale = d3.scale.linear()\n .domain([0,self.options.svgW]).range([0,self.options.svgW]);\n var yScale = d3.scale.linear()\n .domain([0,self.options.svgH]).range([0, self.options.svgH]);\n\n self.zoomer = d3.behavior.zoom()\n .scaleExtent([0.1,10])\n .x(xScale)\n .y(yScale)\n .on('zoom', () => {\n vis.attr('transform',\n 'translate(' + d3.event.translate + ')' + ' scale(' + d3.event.scale + ')');\n });\n\n let enableZooming = () => {\n svg.call(self.zoomer)\n .on(\"dblclick.zoom\", null);\n }\n\n let disableZooming = () => {\n svg.call(self.zoomer)\n .on(\"dblclick.zoom\", null)\n .on('mousedown.zoom', null)\n .on('touchstart.zoom', null)\n .on('touchmove.zoom', null)\n .on('touchend.zoom', null);\n }\n\n if (self.options.zoomable)\n enableZooming()\n\n /* Node selection related objects and functions */\n let toggleSelectNode = (node) => {\n node.selected = !node.selected;\n visNodes.selectAll('g.gnode').filter((d) => { return node.uid == d.uid; })\n .classed(fstyle.selectedNode, function(p) { return p.selected; });\n }\n\n let selectNode = (node) => {\n node.selected = true;\n visNodes.selectAll('g.gnode').filter((d) => { return node.uid == d.uid; })\n .classed(fstyle.selectedNode, function(p) { return p.selected; });\n }\n\n let deselectAllNodes = () => {\n visNodes.selectAll('g.gnode')\n .classed(fstyle.selectedNode, function(p) { return p.selected = false; });\n }\n\n let selectedNodes = () => {\n // return all selected nodes\n return visNodes.selectAll('g.gnode').filter(function(d) { return d.selected; });\n }\n\n self.brusher = d3.svg.brush()\n .x(xScale)\n .y(yScale)\n .on('brushstart', function(d) {})\n .on('brush', function() {\n // during brushing invert styling of selection as preview\n let extent = d3.event.target.extent();\n\n visNodes.selectAll('g.gnode')\n .classed(fstyle.selectedNode, function (d) {\n return d.selected ^ (extent[0][0] <= d.x && d.x < extent[1][0]\n && extent[0][1] <= d.y && d.y < extent[1][1])\n })\n })\n .on('brushend', function() {\n // after brushing finally toggle the selection\n let extent = d3.event.target.extent();\n\n visNodes.selectAll('g.gnode')\n .filter(function (d) {\n return extent[0][0] <= d.x && d.x < extent[1][0]\n && extent[0][1] <= d.y && d.y < extent[1][1]\n })\n .each(toggleSelectNode)\n\n d3.event.target.clear();\n d3.select(this).call(d3.event.target);\n });\n\n let enableBrushing = () => {\n // crosshair curson\n mouseEventHelper.select('.background').style('cursor', 'crosshair');\n // bind brusher\n mouseEventHelper.call(self.brusher);\n }\n\n let disableBrushing = () => {\n // normal cursor\n mouseEventHelper.select('.background').style('cursor', 'auto');\n // disable brushing events\n mouseEventHelper.call(self.brusher)\n .on('mousedown.brush', null)\n .on('touchstart.brush', null)\n .on('touchmove.brush', null)\n .on('touchend.brush', null);\n }\n\n /* Force related objects and functions */\n self.force = d3.layout.force()\n .charge(function(d) {\n if (d.nodeType == 'middle')\n return self.options.middleCharge;\n else\n return self.options.otherCharge;\n })\n .friction(self.options.friction)\n .linkDistance(function(d) { return self.options.linkDistanceMultiplier * d.value; })\n .linkStrength(function(d) { if (d.linkType in self.linkStrengths) {\n return self.linkStrengths[d.linkType];\n } else {\n return self.linkStrengths.other; }\n })\n .gravity(0.000)\n .nodes(self.graph.nodes)\n .links(self.graph.links)\n .chargeDistance(self.options.chargeDistance)\n .size([self.options.svgW, self.options.svgH]);\n\n var drag = d3.behavior.drag()\n .on('dragstart', function(d) {\n console.log('dragstart')\n d3.event.sourceEvent.stopPropagation();\n\n selectedNodes().each(function(d1) {\n d1.fixed |= 2;\n });\n })\n .on('drag', (d) => {\n if (shiftKeydown) return\n selectedNodes().each(function(d1) {\n d1.x += d3.event.dx;\n d1.y += d3.event.dy;\n\n d1.px += d3.event.dx;\n d1.py += d3.event.dy;\n });\n\n self.resumeForce();\n d3.event.sourceEvent.preventDefault();\n })\n .on('dragend', (d) => {\n console.log('dragend')\n selectedNodes().each(function(d1) {\n d1.fixed &= ~6;\n });\n });\n\n /* Main plot drawing functions */\n let createInitialLayout = function(structure, passedOptions = {}) {\n // the default options\n let options = {\n 'sequence': '',\n 'name': 'empty',\n 'positions': [],\n 'labelInterval': self.options.labelInterval,\n 'avoidOthers': true,\n 'uids': [],\n 'circularizeExternal': true\n };\n\n options = Object.assign(options, passedOptions);\n\n //console.log('options.uids:', options.uids);\n let rg = new RNAGraph(options.sequence, structure, options.name);\n rg.circularizeExternal = options.circularizeExternal;\n\n let rnaJson = rg.recalculateElements();\n\n if (options.positions.length === 0) {\n // no provided positions means we need to calculate an initial layout\n\n if (self.options.layout == 'naview') {\n let naview = new NAView();\n\n let naViewPositions = naview.naview_xy_coordinates(rg.pairtable);\n options.positions = []\n for (let i = 0; i < naViewPositions.nbase; i++)\n options.positions.push([naViewPositions.x[i], naViewPositions.y[i]]);\n } else {\n options.positions = simpleXyCoordinates(rnaJson.pairtable);\n }\n }\n\n rnaJson = rnaJson.elementsToJson()\n .addUids(options.uids)\n .addPositions('nucleotide', options.positions)\n .addLabels(1, options.labelInterval)\n .reinforceStems()\n .reinforceLoops()\n .connectFakeNodes()\n .reassignLinkUids()\n .breakNodesToFakeNodes();\n\n return rnaJson;\n };\n\n let createNewNodes = function(gnodesEnter) {\n gnodesEnter = gnodesEnter.append('g')\n .classed('gnode', true)\n .attr('struct_name', function(d) { return d.structName; })\n .attr('transform', function(d) {\n if (typeof d.x != 'undefined' && typeof d.y != 'undefined')\n return 'translate(' + [d.x, d.y] + ')';\n else\n return '';\n })\n .each( function(d) { d.selected = d.previouslySelected = false; });\n\n gnodesEnter\n .attr('num', function(d) { return 'n' + d.num; })\n .attr('rnum', function(d) {\n return 'n' + (d.rna.rnaLength - d.num + 1); })\n .transition()\n .duration(750)\n .ease('elastic');\n\n if (self.options.editable || self.options.animation) {\n gnodesEnter.on('mousedown', nodeMousedown)\n //.on('mousedrag', function(d) {})\n .on('mouseup', nodeMouseup)\n .on('contextmenu', self.nodeContextMenu)\n .call(drag)\n }\n\n let labelAndProteinNodes = gnodesEnter.filter(function(d) {\n return d.nodeType == 'label' || d.nodeType == 'protein';\n });\n\n let nucleotideNodes = gnodesEnter.filter(function(d) {\n return d.nodeType == 'nucleotide';\n });\n\n labelAndProteinNodes.append('svg:circle')\n .classed(fstyle.node, true)\n .attr('r', function(d) {\n if (d.nodeType == 'middle') return 0;\n else {\n return d.radius;\n }\n })\n .attr('node_type', function(d) { return d.nodeType; })\n .attr('node_num', function(d) { return d.num; });\n\n // direction arrows\n nucleotideNodes.append('svg:path')\n .attr('class', fstyle.directionArrow)\n .attr('node_num', function(d) { return d.num; })\n\n // nucleotide outlines\n nucleotideNodes.append('svg:circle')\n .attr('class', fstyle.node)\n .attr('node_type', function(d) { return d.nodeType; })\n .attr('node_num', function(d) { return d.num; })\n .attr('r', function(d) { return d.radius; })\n .append('svg:title')\n .text(function(d) {\n if (d.nodeType == 'nucleotide') {\n return d.structName + ':' + d.num;\n } else {\n return '';\n }\n });\n\n // nucleotide labels\n var labelsEnter = gnodesEnter.append('text')\n .text(function(d) { return d.name; })\n .attr('class', fstyle.nodeLabel)\n .attr('label_type', function(d) { return d.nodeType; })\n\n // nucleotide label title\n labelsEnter.append('svg:title')\n .text(function(d) {\n if (d.nodeType == 'nucleotide') {\n return d.structName + ':' + d.num;\n } else {\n return '';\n }\n });\n\n return gnodesEnter;\n };\n\n let createNewLinks = function(linksEnter) {\n var linkLines = linksEnter.append('svg:line');\n\n linkLines.append('svg:title')\n .text((d) => { return d.linkType + ':' + d.source.num + '-' + d.target.num });\n\n linkLines\n .classed('link', true)\n .classed(fstyle.link, true)\n .attr('x1', function(d) { return d.source.x; })\n .attr('y1', function(d) { return d.source.y; })\n .attr('x2', function(d) { return d.target.x; })\n .attr('y2', function(d) { return d.target.y; })\n .attr('link_type', function(d) { return d.linkType; } )\n .attr('pointer-events', function(d) { if (d.linkType == 'fake') return 'none'; else return 'all';});\n\n if (self.options.editable)\n linkLines.on('click', linkClick);\n\n /* We don't need to update the positions of the stabilizing links */\n /*\n basepairLinks = visLinks.selectAll('[link_type=basepair]');\n basepairLinks.classed('basepair', true);\n\n fakeLinks = visLinks.selectAll('[link_type=fake]')\n fakeLinks.classed('fake', true);\n\n intermolecule_links = vis_links.selectAll('[link_type=intermolecule]');\n intermolecule_links.classed('intermolecule', true);\n\n plink = vis_links.selectAll('[link_type=protein_chain],[link_type=chain_chain]');\n plink.classed('chain_chain', true);\n */\n\n return linkLines;\n };\n\n function drawDirectionArrow(d) {\n let magnitude = (x) => {\n return Math.sqrt(x[0] * x[0] + x[1] * x[1]);\n }\n\n let endPoint = d;\n let startPoint = d.prevNode;\n // get stroke width and arrow size values from css\n let nodeStroke = parseFloat(fstyle.nodeStrokeWidth) / 2;\n let lengthMult = parseFloat(fstyle.directionArrowSize);\n let arrowWidth = parseFloat(fstyle.directionArrowWidth);\n\n if (startPoint === null)\n return;\n\n // does this node have a link pointing to it?\n if (!d.linked)\n return;\n\n // point back toward the previous node\n let u = [-(endPoint.x - startPoint.x), -(endPoint.y - startPoint.y)];\n\n if (u[0] == 0 && u[1] == 0)\n return; // will lead to a NaN error\n\n // scale u to unit length\n u = [u[0] / magnitude(u), u[1] / magnitude(u)];\n // normal vector of u\n let v = [-u[1], u[0]];\n\n // calculate the tip position\n let arrowTip = [(d.radius + nodeStroke) * u[0], (d.radius + nodeStroke) * u[1]];\n\n let path = 'M' + (arrowTip[0] + lengthMult * (u[0]/2 + v[0]*arrowWidth/2)) + ',' + (arrowTip[1] + lengthMult * (u[1]/2 + v[1]*arrowWidth/2)) +\n 'L' + (arrowTip[0]) + ',' + (arrowTip[1]) +\n 'L' + (arrowTip[0] + lengthMult * (u[0]/2 - v[0]*arrowWidth/2)) + ',' + (arrowTip[1] + lengthMult * (u[1]/2 - v[1]*arrowWidth/2));\n\n d3.select(this).attr('d', path);\n }\n\n let realLinkFilter = (d) => {\n return d.linkType == 'basepair' ||\n d.linkType == 'backbone' ||\n d.linkType == 'intermolecule' ||\n d.linkType == 'pseudoknot' ||\n d.linkType == 'label_link' ||\n d.linkType == 'external' ||\n d.linkType == 'chain_chain';\n }\n\n let recalculateGraph = () => {\n // Condense all of the individual RNAs into one\n // collection of nodes and links\n self.graph.nodes = [];\n self.graph.links = [];\n for (let uid in self.rnas) {\n self.graph.nodes = self.graph.nodes.concat(self.rnas[uid].nodes);\n self.graph.links = self.graph.links.concat(self.rnas[uid].links);\n }\n\n // Create a lookup table so that we can access each node\n // based on its uid. This will be used to create the links\n // between different RNAs\n var uidsToNodes = {};\n\n for (let i = 0; i < self.graph.nodes.length; i++)\n uidsToNodes[self.graph.nodes[i].uid] = self.graph.nodes[i];\n\n self.graph.links.forEach(function(link) {\n link.source = uidsToNodes[link.source.uid];\n link.target = uidsToNodes[link.target.uid];\n });\n\n for (let i = 0; i < self.extraLinks.length; i++) {\n // the actual node objects may have changed, so we hae to recreate\n // the extra links based on the uids\n if (!(self.extraLinks[i].target.uid in uidsToNodes)) {\n console.log('not there:', self.extraLinks[i]);\n continue;\n }\n\n self.extraLinks[i].source = uidsToNodes[self.extraLinks[i].source.uid];\n self.extraLinks[i].target = uidsToNodes[self.extraLinks[i].target.uid];\n\n if (self.extraLinks[i].linkType == 'intermolecule') {\n //remove links to middle nodes\n let fakeLinks = self.graph.links.filter(function(d) {\n return ((d.source == self.extraLinks[i].source || d.source == self.extraLinks[i].target ||\n d.target == self.extraLinks[i].source || d.target == self.extraLinks[i].source) &&\n d.linkType == 'fake');\n });\n\n for (let j = 0; j < fakeLinks.length; j++) {\n let linkIndex = self.graph.links.indexOf(fakeLinks[j]);\n self.graph.links.splice(linkIndex, 1);\n }\n }\n\n graph.links.push(self.extraLinks[i]);\n }\n };\n\n self.update = function () {\n self.force.nodes(self.graph.nodes)\n .links(self.graph.links);\n\n if (self.options.animation) {\n self.force.start();\n }\n\n let allLinks = visLinks.selectAll('line.link')\n .data(self.graph.links.filter(realLinkFilter), elementKey);\n\n allLinks.attr('class', '')\n .classed('link', true)\n .classed(fstyle.link, true)\n .attr('link_type', function(d) { return d.linkType; } )\n\n let linksEnter = allLinks.enter();\n createNewLinks(linksEnter);\n\n allLinks.exit().remove();\n\n let gnodes = visNodes.selectAll('g.gnode')\n .data(self.graph.nodes, elementKey);\n //.attr('pointer-events', 'all');\n\n let gnodesEnter = gnodes.enter();\n createNewNodes(gnodesEnter);\n gnodes.exit().remove();\n\n\n //fake_nodes = self.graph.nodes.filter(function(d) { return d.nodeType == 'middle'; });\n //fakeNodes = self.graph.nodes.filter(function(d) { return true; });\n let realNodes = self.graph.nodes.filter(function(d) { return d.nodeType == 'nucleotide' || d.nodeType == 'label';});\n\n gnodes.select('.' + fstyle.directionArrow).each(drawDirectionArrow);\n\n self.force.on('tick', function() {\n let q = d3.geom.quadtree(realNodes);\n let i = 0;\n let n = realNodes.length;\n\n let collide = (node) => {\n let r = node.radius + 16,\n nx1 = node.x - r,\n nx2 = node.x + r,\n ny1 = node.y - r,\n ny2 = node.y + r;\n return function(quad, x1, y1, x2, y2) {\n if (quad.point && (quad.point !== node)) {\n let x = node.x - quad.point.x,\n y = node.y - quad.point.y,\n l = Math.sqrt(x * x + y * y),\n r = node.radius + quad.point.radius;\n if (l < r) {\n l = (l - r) / l * 0.1;\n node.x -= x *= l;\n node.y -= y *= l;\n quad.point.x += x;\n quad.point.y += y;\n }\n }\n return x1 > nx2 || x2 < nx1 || y1 > ny2 || y2 < ny1;\n };\n }\n\n while (++i < n) q.visit(collide(realNodes[i]));\n\n allLinks.attr('x1', function(d) { return d.source.x; })\n .attr('y1', function(d) { return d.source.y; })\n .attr('x2', function(d) { return d.target.x; })\n .attr('y2', function(d) { return d.target.y; });\n\n // Translate the groups\n gnodes.attr('transform', function(d) {\n return 'translate(' + [d.x, d.y] + ')';\n });\n\n gnodes.select('.' + fstyle.directionArrow).each(drawDirectionArrow);\n\n });\n\n self.force.on('end', () => {\n gnodes.selectAll('[node_type=nucleotide]')\n .filter((d,i) => { if (i == 0) return true; else return false; })\n .each((d,i) => {\n //console.log(\"pos\", d.num, d.x, d.y);\n });\n\n //for (let uid in self.rnas) {\n // for (let i = 1; i < self.rnas[uid].pairtable[0]; i++) {\n // console.log('pt', i, self.rnas[uid].pairtable[i]);\n // }\n //}\n\n });\n\n self.changeColorScheme(self.colorScheme);\n\n if (self.options.animation) {\n self.force.start();\n }\n\n updateStyle();\n };\n\n self.transitionRNA = function(newStructure, nextFunction) {\n if (self.dotbracket == newStructure) {\n return;\n } else {\n self.dotbracket = newStructure;\n }\n //transition from an RNA which is already displayed to a new structure\n var duration = self.options.transitionDuration;\n\n var uids = self.graph.nodes\n .filter(function(d) { return d.nodeType == 'nucleotide'; })\n .map(function(d) { return d.uid; });\n\n let options = {'uids': uids};\n var newRNAJson = createInitialLayout(newStructure, options);\n\n let gnodes = visNodes.selectAll('g.gnode').data(newRNAJson.nodes, elementKey);\n var links = visLinks.selectAll('line.link').data(newRNAJson.links.filter(realLinkFilter), elementKey);\n\n if (duration === 0)\n gnodes.attr('transform', function(d) {\n return 'translate(' + [d.x, d.y] + ')';\n });\n else {\n gnodes.transition()\n .attr('transform', function(d) {\n return 'translate(' + [d.x, d.y] + ')'; }).duration(duration);\n }\n\n\n var newNodes = createNewNodes(gnodes.enter())\n .attr('transform', function(d) {\n if (typeof d.x != 'undefined' && typeof d.y != 'undefined')\n return 'translate(' + [0, 0] + ')';\n else\n return '';\n });\n\n if (duration === 0)\n gnodes.exit().remove();\n else\n gnodes.exit().transition()\n .attr('transform', function(d) {\n if (typeof d.x != 'undefined' && typeof d.y != 'undefined')\n return 'translate(' + [0, 0] + ')';\n else\n return '';\n });\n\n self.graph.nodes = gnodes.data();\n gnodes.select('.' + fstyle.directionArrow).each(drawDirectionArrow);\n self.changeColorScheme(self.colorScheme);\n updateStyle();\n self.centerView(duration);\n\n function endall(transition, callback) {\n if (transition.size() === 0) { setTimeout(callback, duration); }\n var n = 0;\n transition\n .each(function() { ++n; })\n .each('end', function() { if (!--n) callback.apply(this, arguments); });\n }\n\n function afterAnimation() {\n var newLinks = createNewLinks(links.enter());\n self.graph.links = links.data();\n self.changeColorScheme(self.colorScheme);\n updateStyle();\n\n if (typeof nextFunction != 'undefined')\n nextFunction();\n\n }\n\n links.exit().remove();\n\n if (duration === 0) {\n links\n .attr('x1', function(d) { return d.source.x; })\n .attr('y1', function(d) { return d.source.y; })\n .attr('x2', function(d) { return d.target.x; })\n .attr('y2', function(d) { return d.target.y; });\n\n var newLinks = createNewLinks(links.enter());\n self.graph.links = links.data();\n\n updateStyle();\n } else {\n links.transition()\n .attr('x1', function(d) { return d.source.x; })\n .attr('y1', function(d) { return d.source.y; })\n .attr('x2', function(d) { return d.target.x; })\n .attr('y2', function(d) { return d.target.y; })\n .duration(duration)\n .call(endall, afterAnimation);\n }\n\n if (duration === 0) {\n newNodes\n .attr('transform', function(d) {\n if (typeof d.x != 'undefined' && typeof d.y != 'undefined')\n return 'translate(' + [d.x, d.y] + ')';\n else\n return '';\n });\n } else {\n newNodes.transition()\n .attr('transform', function(d) {\n if (typeof d.x != 'undefined' && typeof d.y != 'undefined')\n return 'translate(' + [d.x, d.y] + ')';\n else\n return '';\n });\n }\n\n };\n\n /* Plot presentation related functions */\n let getBoundingBoxTransform = () => {\n // Center the view on the molecule(s) and scale it so that everything\n // fits in the window\n\n //no molecules, nothing to do\n if (self.graph.nodes.length === 0)\n return {'translate': [0,0], 'scale': 1};\n\n // Get the bounding box\n var minX = d3.min(self.graph.nodes.map(function(d) {return d.x;}));\n var minY = d3.min(self.graph.nodes.map(function(d) {return d.y;}));\n\n var maxX = d3.max(self.graph.nodes.map(function(d) {return d.x;}));\n var maxY = d3.max(self.graph.nodes.map(function(d) {return d.y;}));\n\n var maxRadius = d3.max(self.graph.nodes.map(function(d) { return d.radius; }));\n\n // The width and the height of the molecule\n var molWidth = maxX - minX;\n var molHeight = maxY - minY;\n\n // how much larger the drawing area is than the width and the height\n var widthRatio = self.options.svgW / (molWidth + 1);\n var heightRatio = self.options.svgH / (molHeight + 1);\n\n // we need to fit it in both directions, so we scale according to\n // the direction in which we need to shrink the most\n var minRatio = Math.min(widthRatio, heightRatio,\n self.options.maxNodeRadius / maxRadius) * 0.8;\n\n // the new dimensions of the molecule\n var newMolWidth = molWidth * minRatio;\n var newMolHeight = molHeight * minRatio;\n\n // translate so that it's in the center of the window\n var xTrans = -(minX) * minRatio + (self.options.svgW - newMolWidth) / 2;\n var yTrans = -(minY) * minRatio + (self.options.svgH - newMolHeight) / 2;\n\n return {'translate': [xTrans, yTrans], 'scale': minRatio};\n };\n\n self.centerView = function(duration = 0) {\n var bbTransform = getBoundingBoxTransform();\n\n if (bbTransform === null)\n return;\n\n // do the actual moving\n vis.transition().attr('transform',\n 'translate(' + bbTransform.translate + ')' + ' scale(' + bbTransform.scale + ')').duration(duration);\n\n // tell the zoomer what we did so that next we zoom, it uses the\n // transformation we entered here\n self.zoomer.translate(bbTransform.translate);\n self.zoomer.scale(bbTransform.scale);\n };\n\n self.setSize = (\n svgW = d3.select(element).node().offsetWidth,\n svgH = d3.select(element).node().offsetHeight\n ) => {\n // save width and height\n self.options.svgW = svgW;\n self.options.svgH = svgH;\n\n // set the viewBox\n svg.attr('viewBox', \"0 0 \" + svgW + \" \" + svgH)\n\n //Set the output range of the scales\n xScale.range([0, svgW]).domain([0, svgW]);\n yScale.range([0, svgH]).domain([0, svgH]);\n\n //re-attach the scales to the zoom behaviour\n self.zoomer.x(xScale)\n .y(yScale);\n self.brusher.x(xScale)\n .y(yScale);\n\n //resize the background\n svg.select('.background')\n .attr('width', svgW)\n .attr('height', svgH);\n\n // center the view\n self.centerView();\n }\n\n /* Style and color related functions */\n self.setOutlineColor = function(color) {\n var nodes = visNodes.selectAll('g.gnode').select('[node_type=nucleotide]');\n nodes.style('fill', color);\n }\n\n self.addCustomColors = function addCustomColors(json) {\n // Add a json file containing the custom colors\n self.customColors = json;\n self.changeColorScheme('custom');\n };\n\n self.addCustomColorsText = function(customColorsText) {\n let cs = new ColorScheme(customColorsText);\n self.customColors = cs.colorsJson;\n self.changeColorScheme('custom');\n };\n\n self.changeColorScheme = function(newColorScheme) {\n var proteinNodes = visNodes.selectAll('[node_type=protein]');\n\n proteinNodes.classed(fstyle.node, true)\n .attr('r', function(d) { return d.radius; });\n\n var gnodes = visNodes.selectAll('g.gnode');\n var circles = visNodes.selectAll('g.gnode').selectAll('circle');\n var nodes = visNodes.selectAll('g.gnode').select('[node_type=nucleotide]');\n self.colorScheme = newColorScheme;\n\n\n if (newColorScheme == 'sequence') {\n var scale = d3.scale.ordinal()\n .range(['#dbdb8d', '#98df8a', '#ff9896', '#aec7e8', '#aec7e8'])\n .domain(['A','C','G','U','T']);\n nodes.style('fill', function(d) {\n return scale(d.name);\n });\n\n } else if (newColorScheme == 'structure') {\n var scale = d3.scale.category10()\n .domain(['s','m','i','e','t','h','x'])\n .range(['lightgreen', '#ff9896', '#dbdb8d', 'lightsalmon',\n 'lightcyan', 'lightblue', 'transparent']);\n\n nodes.style('fill', function(d) {\n return scale(d.elemType);\n });\n\n } else if (newColorScheme == 'positions') {\n nodes.style('fill', function(d) {\n var scale = d3.scale.linear()\n .range(['#98df8a', '#dbdb8d', '#ff9896'])\n .interpolate(d3.interpolateLab)\n .domain([1, 1 + (d.rna.rnaLength - 1) / 2, d.rna.rnaLength]);\n\n return scale(d.num);\n });\n } else if (newColorScheme == 'custom') {\n // scale to be used in case the user passes scalar\n // values rather than color names\n if (typeof self.customColors != 'undefined' &&\n 'domain' in self.customColors &&\n 'range' in self.customColors) {\n var scale = d3.scale.linear()\n .interpolate(d3.interpolateLab)\n .domain(self.customColors.domain)\n .range(self.customColors.range);\n }\n\n let changeColors = (moleculeColors, d, scale) => {\n if (moleculeColors.hasOwnProperty(d.num)) {\n let val = parseFloat(moleculeColors[d.num]);\n\n if (isNaN(val)) {\n // passed in color is not a scalar, so\n // treat it as a color\n return moleculeColors[d.num];\n } else {\n // the user passed in a float, let's use a colormap\n // to convert it to a color\n return scale(val);\n }\n } else {\n return 'white';\n }\n }\n\n nodes.style('fill', function(d) {\n if (typeof self.customColors == 'undefined' ||\n !self.customColors.hasOwnProperty('colorValues')) {\n return 'white';\n }\n\n if (self.customColors.colorValues.hasOwnProperty(d.structName) &&\n self.customColors.colorValues[d.structName].hasOwnProperty(d.num)) {\n // if a molecule name is specified, it supercedes the default colors\n // (for which no molecule name has been specified)\n let moleculeColors = self.customColors.colorValues[d.structName];\n return changeColors(moleculeColors, d, scale);\n } else if (self.customColors.colorValues.hasOwnProperty('')) {\n let moleculeColors = self.customColors.colorValues[''];\n return changeColors(moleculeColors, d, scale);\n }\n\n return 'white';\n });\n }\n };\n\n let updateStyle = () => {\n // Numbering\n visNodes.selectAll('[node_type=label]').classed(fstyle.transparent, !self.displayParameters.displayNumbering);\n visNodes.selectAll('[label_type=label]').classed(fstyle.transparent, !self.displayParameters.displayNumbering);\n visLinks.selectAll('[link_type=label_link]').classed(fstyle.transparent, !self.displayParameters.displayNumbering);\n // Node Outline\n svg.selectAll('[node_type=nucleotide]').classed(fstyle.transparent, !self.displayParameters.displayNodeOutline);\n // Node Labels\n visNodes.selectAll('[label_type=nucleotide]').classed(fstyle.transparent, !self.displayParameters.displayNodeLabel);\n // Links\n svg.selectAll('[link_type=real],[link_type=basepair],[link_type=backbone],[link_type=pseudoknot],[link_type=protein_chain],[link_type=chain_chain],[link_type=external]').classed(fstyle.transparent, !self.displayParameters.displayLinks);\n // Pseudoknot Links\n svg.selectAll('[link_type=pseudoknot]').classed(fstyle.transparent, !self.displayParameters.displayPseudoknotLinks);\n // Protein Links\n svg.selectAll('[link_type=protein_chain]').classed(fstyle.transparent, !self.displayParameters.displayProteinLinks);\n // Fake Links\n visLinks.selectAll('[link_type=fake]').classed(fstyle.transparent, !self.options.displayAllLinks);\n visLinks.selectAll('[link_type=fake_fake]').classed(fstyle.transparent, !self.options.displayAllLinks);\n // direction Arrows\n svg.selectAll('.' + fstyle.directionArrow).classed(fstyle.transparent, !self.displayParameters.displayDirectionArrows);\n };\n\n /* RNA edditing related functions */\n let changeNode = function(nodeName, referenceNode) {\n // change the label of a node\n let rna = referenceNode.rna;\n\n let dotbracket = rnaUtilities.pairtableToDotbracket(rna.pairtable);\n let positions = rna.getPositions('nucleotide');\n let sequence = rna.seq\n let uids = rna.getUids();\n\n let newNodeNum = referenceNode.num;\n\n let newDotbracket = dotbracket;\n let newSequence = sequence.slice(0,newNodeNum-1) + nodeName + sequence.slice(newNodeNum);\n\n console.log('newSequence:', newSequence);\n\n console.log('uids:', uids);\n uids.splice(newNodeNum-1, 1, slugid.nice());\n let newPositions = positions;\n\n delete self.rnas[rna.uid];\n let newRNA = self.addRNA(newDotbracket, {'sequence': newSequence,\n 'positions': newPositions,\n 'uids': uids,\n 'centerView': false});\n }\n\n let insertNodeBeforeOrAfter = function(nodeName, referenceNode, positionOffset) {\n //insert a new node before or after another one\n //positionOffset specifies who far from the original to insert the new node\n let rna = referenceNode.rna;\n\n let dotbracket = rnaUtilities.pairtableToDotbracket(rna.pairtable);\n let positions = rna.getPositions('nucleotide');\n let sequence = rna.seq\n let uids = rna.getUids();\n\n let newNodeNum = referenceNode.num + positionOffset;\n\n let newDotbracket = dotbracket.slice(0,newNodeNum) + '.' + dotbracket.slice(newNodeNum);\n let newSequence = sequence.slice(0,newNodeNum) + nodeName + sequence.slice(newNodeNum);\n\n console.log('newSequence:', newSequence);\n\n uids.splice(newNodeNum, 0, slugid.nice());\n positions.splice(newNodeNum, 0, positions[newNodeNum - positionOffset-1]);\n\n let newUids = uids;\n let newPositions = positions;\n\n console.log('positions:', positions);\n console.log('new node positions:', newPositions);\n\n delete self.rnas[rna.uid];\n let newRNA = self.addRNA(newDotbracket, {'sequence': newSequence,\n 'positions': newPositions,\n 'uids': newUids,\n 'centerView': false});\n }\n\n let deleteNode = function(node) {\n console.log('deleting...', node);\n // get the dotbracket string for this rna\n let rna = node.rna;\n let pair = rna.pairtable[node.num];\n\n // remove basepairs for this node\n if (pair != 0) {\n rna.pairtable[node.num] = 0;\n rna.pairtable[pair] = 0;\n }\n\n let dotbracket = rnaUtilities.pairtableToDotbracket(rna.pairtable);\n let positions = rna.getPositions('nucleotide');\n let sequence = rna.seq\n let uids = rna.getUids();\n\n let newDotbracket = dotbracket.slice(0, node.num-1) + dotbracket.slice(node.num)\n let newPositions = positions.slice(0, node.num-1)\n .concat(positions.slice(node.num));\n let newSequence = sequence.slice(0, node.num-1) + sequence.slice(node.num)\n let newUids = uids.slice(0, node.num-1)\n .concat(uids.slice(node.num));\n\n delete self.rnas[rna.uid];\n let newRNA = self.addRNA(newDotbracket, {'sequence': newSequence,\n 'positions': newPositions,\n 'uids': newUids,\n 'centerView': false});\n\n console.log('new dotbracket:', newDotbracket);\n //recalculateGraph();\n\n //remove backbone links associated with this node\n\n //remove this node\n\n }\n\n let elementKey = (d) => {\n return d.uid;\n };\n\n let updateRnaGraph = function(r) {\n let nucleotidePositions = r.getPositions('nucleotide');\n let labelPositions = r.getPositions('label');\n\n let uids = r.getUids();\n\n r.recalculateElements()\n .elementsToJson()\n .addPseudoknots()\n .addPositions('nucleotide', nucleotidePositions)\n .addUids(uids)\n .addLabels(1, self.options.labelInterval)\n .addPositions('label', labelPositions)\n .reinforceStems()\n .reinforceLoops()\n .updateLinkUids();\n };\n\n let removeBackBoneLink = function(d) {\n if (d.target.num - d.source.num != 1) {\n console.log('ERROR: non adjacent nodes. Target:', d.target,\n 'Source:', d.source, 'Link:', d);\n return;\n }\n\n let rna = d.target.rna;\n let toRemove = [];\n\n for (let i = 0; i < rna.links.length; i++) {\n let link = rna.links[i];\n\n if (link.linkType != 'basepair')\n continue;\n\n if (link.source.num <= d.source.num && link.target.num >= d.target.num) {\n console.log('crossing basepair', link);\n toRemove.push(link);\n }\n }\n\n\n // Remove all base pairs that are between these two nodes and add them as extra\n // links\n console.log('toRemove:', toRemove);\n\n for (let i = 0; i < toRemove.length; i++) {\n rna.pairtable[toRemove[i].source.num] = 0;\n rna.pairtable[toRemove[i].target.num] = 0;\n\n toRemove[i].from = toRemove[i].source.num;\n toRemove[i].to = toRemove[i].target.num - d.source.num;\n }\n\n // extract the dotbracket string of the rna\n // cut it at the position of this backbone bond\n let sequence = rna.seq;\n let sequence1 = rna.seq.slice(0, d.source.num);\n let sequence2 = rna.seq.slice(d.source.num);\n\n let rnaDotBracket = rnaUtilities.pairtableToDotbracket(rna.pairtable);\n let dotBracket1 = rnaDotBracket.slice(0, d.source.num);\n let dotBracket2 = rnaDotBracket.slice(d.source.num)\n\n // get the nucleotide positions\n // cut them at the positions of the backbone bond\n let positions = rna.getPositions('nucleotide')\n let uids = rna.getUids();\n\n let positions1 = positions.slice(0, d.source.num);\n let positions2 = positions.slice(d.source.num);\n\n let uids1 = uids.slice(0, d.source.num);\n let uids2 = uids.slice(d.source.num);\n\n console.log('positions1:', positions1);\n console.log('positions2:', positions2);\n\n delete self.rnas[rna.uid];\n let rna1 = self.addRNA(dotBracket1, { 'sequence': sequence1,\n 'positions': positions1,\n 'uids': uids1 });\n let rna2 = self.addRNA(dotBracket2, { 'sequence': sequence2,\n 'positions': positions2,\n 'uids': uids2 });\n for (let i = 0; i < toRemove.length; i++) {\n console.log('rna1:', rna1);\n console.log('rna2:', rna2);\n console.log('toRemove[i]', toRemove[i]);\n self.extraLinks.push(\n {'source': rna1.nodes[toRemove[i].from-1],\n 'target': rna2.nodes[toRemove[i].to-1],\n 'value': 1,\n 'uid': slugid.nice(),\n 'linkType': 'intermolecule'});\n recalculateGraph();\n self.update();\n\n }\n console.log('self.extraLinks:', self.extraLinks);\n //self.extraLinks.push({'source': rna1.nodes[\n\n // create two new rnas\n // add their positions\n // add them back to the plot\n }\n\n var removeLink = function(d) {\n // remove a link between two nodes\n let index = self.graph.links.indexOf(d);\n console.log('removing link:', index);\n\n if (index > -1) {\n //remove a link\n //graph.links.splice(index, 1);\n\n // there should be two cases\n // 1. The link is within a single molecule\n\n if (d.source.rna == d.target.rna) {\n if (d.linkType == 'backbone') {\n console.log('trying to remove a backbone link', d.source.num, d.target.num);\n removeBackBoneLink(d);\n return;\n } else {\n let r = d.source.rna;\n r.addPseudoknots();\n r.pairtable[d.source.num] = 0;\n r.pairtable[d.target.num] = 0;\n\n updateRnaGraph(r);\n }\n } else {\n // 2. The link is between two different molecules\n let extraLinkIndex = self.extraLinks.indexOf(d);\n\n self.extraLinks.splice(extraLinkIndex, 1);\n }\n recalculateGraph();\n }\n self.update();\n };\n\n let addBackBoneLink = function(newLink) {\n // opposite of deleting a link\n // get the two dotbracket strings\n let rna1 = newLink.target.rna;\n let rna2 = newLink.source.rna;\n if (newLink.target.num == 1) {\n rna1 = newLink.source.rna;\n rna2 = newLink.target.rna;\n }\n\n let dotbracket1 = rnaUtilities.pairtableToDotbracket(rna1.pairtable);\n let dotbracket2 = rnaUtilities.pairtableToDotbracket(rna2.pairtable);\n\n let seq1 = rna1.seq;\n let seq2 = rna2.seq;\n\n let positions1 = rna1.getPositions('nucleotide');\n let positions2 = rna2.getPositions('nucleotide');\n\n // concatenate them\n let newDotbracket = dotbracket1 + dotbracket2;\n let newSeq = seq1 + seq2;\n let newPositions = positions1.concat(positions2);\n\n let toAddInternal = [];\n let toAddExternal = [];\n let toDelete = {};\n\n for (let i = 0; i < self.extraLinks.length; i++) {\n console.log('self.extraLinks[i]', self.extraLinks[i]);\n console.log('rna1:', rna1);\n console.log('rna2:', rna2);\n if (self.extraLinks[i].source.rna == rna1) {\n if ( self.extraLinks[i].target.rna == rna2) {\n // both ends of the extra link are within what will become the new molecule\n // need to be added as base pairs afterwards\n //self.extraLinks[i].from = self.extraLinks[i].source.num;\n //self.extraLinks[i].to = dotbracket1.length + self.extraLinks[i].target.num;\n //toAddInternal.push(self.extraLinks[i]);\n } else {\n // only one end of the extra link is within what will become the newly\n // created molecule, needs to remain an extra link\n // source will always be the unchanged molecule, whereas target will be\n // the newly created one\n toAddExternal.push({\n 'source': self.extraLinks[i].target,\n 'target': self.extraLinks[i].source.num\n });\n\n toDelete[self.extraLinks[i].uid] = true;\n }\n } else if (self.extraLinks[i].source.rna == rna2) {\n if ( self.extraLinks[i].target.rna == rna1) {\n // add internal link\n // both ends of the extra link are within what will become the new molecule\n // need to be added as base pairs afterwards\n //self.extraLinks[i].from = self.extraLinks[i].target.num;\n //self.extraLinks[i].to = dotbracket1.length + self.extraLinks[i].source.num;\n\n //toAddInternal.push(self.extraLinks[i]);\n } else {\n toAddExternal.push({\n 'source': self.extraLinks[i].target,\n 'target': self.extraLinks[i].source.num + dotbracket1.length\n });\n toDelete[self.extraLinks[i].uid] = true;\n }\n }\n\n if (self.extraLinks[i].target.rna == rna1) {\n if (self.extraLinks[i].source.rna == rna2) {\n // covered in previous if statement\n } else {\n // only one end of the extra link is within what will become the newly\n // created molecule, needs to remain an extra link\n toAddExternal.push({\n 'source': self.extraLinks[i].source,\n 'target': self.extraLinks[i].target.num\n });\n\n toDelete[self.extraLinks[i].uid] = true;\n }\n } else if (self.extraLinks[i].target.rna == rna2) {\n if (self.extraLinks[i].source.rna == rna1) {\n toAddExternal.push({\n 'source': self.extraLinks[i].source,\n 'target': self.extraLinks[i].target.num + dotbracket1.length\n });\n\n toDelete[self.extraLinks[i].uid] = true;\n }\n }\n }\n\n\n self.extraLinks = self.extraLinks.filter((e) => { return !(e.uid in toDelete) });\n\n delete self.rnas[rna1.uid];\n delete self.rnas[rna2.uid];\n\n let newRna = null;\n // create a new RNA\n if (self.options.animation)\n newRna = self.addRNA(newDotbracket, { 'sequence': newSeq,\n 'positions': newPositions,\n 'centerView': false});\n else\n newRna = self.addRNA(newDotbracket, { 'sequence': newSeq,\n 'centerView': false });\n\n\n\n // add new external links\n for (let i = 0; i < toAddExternal.length; i++) {\n self.extraLinks.push({\n 'source': toAddExternal[i].source,\n 'target': newRna.nodes[toAddExternal[i].target-1],\n 'value': 1,\n 'uid': slugid.nice(),\n 'linkType': 'intermolecule'\n });\n }\n\n recalculateGraph();\n self.update();\n console.log('self.extraLinks:', self.extraLinks);\n };\n\n function nudge(dx, dy) {\n // TODO currently unused\n node.filter(function(d) { return d.selected; })\n .attr('cx', function(d) { return d.x += dx; })\n .attr('cy', function(d) { return d.y += dy; });\n\n link.filter(function(d) { return d.source.selected; })\n .attr('x1', function(d) { return d.source.x; })\n .attr('y1', function(d) { return d.source.y; });\n\n link.filter(function(d) { return d.target.selected; })\n .attr('x2', function(d) { return d.target.x; })\n .attr('y2', function(d) { return d.target.y; });\n\n d3.event.preventDefault();\n }\n\n let nodeMouseup = function(d,i) {\n console.log(\"nodeMouseup\")\n let backbonePossible = true, basepairPossible = true;\n\n if (mousedownNode) {\n mouseupNode = d;\n\n // if the node isn't a nucleotide, we can't create a link\n if (mouseupNode.nodeType == 'middle' || mousedownNode.nodeType == 'middle' || mouseupNode.nodeType == 'label' || mousedownNode.nodeType == 'label')\n return;\n\n if (mouseupNode == mousedownNode) { resetMouseVars(); return; }\n let newLink = {source: mousedownNode, target: mouseupNode, linkType: 'basepair', value: 1, uid: slugid.nice()};\n\n for (let i = 0; i < self.graph.links.length; i++) {\n if ((self.graph.links[i].source == mousedownNode) ||\n (self.graph.links[i].target == mousedownNode) ||\n (self.graph.links[i].source == mouseupNode) ||\n (self.graph.links[i].target == mouseupNode)) {\n // either one of the nodes is already in a link\n\n // if any of the nodes are already involved in a basepair or a pseudoknot\n // then we can't make a basepair link\n if (self.graph.links[i].linkType == 'basepair' ||\n self.graph.links[i].linkType == 'pseudoknot' ||\n self.graph.links[i].linkType == 'intermolecule') {\n // although should be able to make a backbone link\n console.log('no basepair possible');\n basepairPossible = false;\n }\n }\n\n if (((self.graph.links[i].source == mouseupNode) &&\n (self.graph.links[i].target == mousedownNode)) ||\n ((self.graph.links[i].source == mousedownNode) &&\n (self.graph.links[i].target == mouseupNode))) {\n\n // if we're trying to make a link between two nodes which already have\n // a backbone between them, then we can't make a link\n if (self.graph.links[i].linkType == 'backbone') {\n return;\n }\n }\n }\n\n\n if (newLink.source.rna != newLink.target.rna) {\n // could be either a backbone link or an intermolecule link\n\n if ((newLink.source.num == 1 &&\n newLink.target.num == newLink.target.rna.rnaLength) ||\n (newLink.target.num == 1 &&\n newLink.source.num == newLink.source.rna.rnaLength)) {\n //\n let linkMenu = [\n {\n title: 'Backbone Link',\n action: function(elm, d, i) {\n linkContextMenuShown = false;\n console.log('Item #1 clicked!');\n console.log('The data for this circle is: ' + d);\n dragLine.attr('class', fstyle.transparent);\n addBackBoneLink(newLink);\n },\n disabled: false // optional, defaults to false\n },\n {\n title: 'Basepair Link',\n action: function(elm, d, i) {\n linkContextMenuShown = false;\n console.log('You have clicked the second item!');\n console.log('The data for this circle is: ' + d);\n dragLine.attr('class', fstyle.transparent);\n self.addLink(newLink);\n }\n }\n ]\n linkContextMenuShown = true;\n let linkContextMenu = contextMenu(linkMenu);\n console.log('newLinkMenu');\n linkContextMenu.apply(this, [d,i,true,\n function() { dragLine.attr('class', fstyle.transparent) }]);\n } else {\n // between end points but can't make a backbone\n if (basepairPossible)\n self.addLink(newLink);\n }\n } else {\n if (basepairPossible)\n self.addLink(newLink);\n }\n\n }\n };\n\n let nodeMousedown = function(d) {\n console.log(\"nodeMousedown\")\n if (!d.selected && !ctrlKeydown) {\n // if this node isn't selected, then we have to unselect every other node\n deselectAllNodes()\n }\n\n if (!shiftKeydown) {\n // only without shift, toggle select or select\n if (ctrlKeydown) {\n toggleSelectNode(d)\n } else {\n selectNode(d)\n }\n }\n\n if (shiftKeydown && self.options.editable) {\n // with shift key and editable continue to draw dragline\n mousedownNode = d;\n\n dragLine\n .attr('class', fstyle.dragLine)\n .attr('x1', mousedownNode.x)\n .attr('y1', mousedownNode.y)\n .attr('x2', mousedownNode.x)\n .attr('y2', mousedownNode.y);\n\n d3.event.stopPropagation();\n }\n };\n\n let linkClick = (d) => {\n if (!shiftKeydown) {\n return;\n }\n\n var invalidLinks = { //'backbone': true,\n 'fake': true,\n 'fake_fake': true,\n 'label_link': true};\n\n console.log('d.linkType:', d.linkType);\n if (d.linkType in invalidLinks )\n return;\n\n removeLink(d);\n };\n\n /* I/O functions */\n self.toJSON = function toJSON() {\n var data = {'rnas': self.rnas, 'extraLinks': self.extraLinks};\n var dataString = JSON.stringify(data, function(key, value) {\n //remove circular references\n if (key == 'rna') {\n return;\n } else {\n return value;\n }\n }, '\\t');\n return dataString;\n };\n\n self.fromJSON = function(jsonString) {\n var rnas, extraLinks;\n\n try{\n var data = JSON.parse(jsonString);\n rnas = data.rnas;\n extraLinks = data.extraLinks;\n } catch(err) {\n throw err;\n }\n\n for (var uid in rnas) {\n if (rnas[uid].type == 'rna') {\n r = new RNAGraph();\n\n r.seq = rnas[uid].seq;\n r.dotbracket = rnas[uid].dotbracket;\n r.circular = rnas[uid].circular;\n r.pairtable = rnas[uid].pairtable;\n r.uid = rnas[uid].uid;\n r.structName = rnas[uid].structName;\n r.nodes = rnas[uid].nodes;\n r.links = rnas[uid].links;\n r.rnaLength = rnas[uid].rnaLength;\n r.elements = rnas[uid].elements;\n r.nucsToNodes = rnas[uid].nucsToNodes;\n r.pseudoknotPairs = rnas[uid].pseudoknotPairs;\n } else {\n r = new ProteinGraph();\n r.size = rnas[uid].size;\n r.nodes = rnas[uid].nodes;\n r.uid = rnas[uid].uid;\n }\n\n self.addRNAJSON(r, false);\n }\n\n extraLinks.forEach(function(link) {\n self.extraLinks.push(link);\n });\n\n recalculateGraph();\n self.update();\n };\n\n self.addRNA = function(structure, passedOptions = {}) {\n let rnaJson = createInitialLayout(structure, passedOptions);\n let centerView = false;\n\n /*\n * Code to display the JSONs representing the structure\n *\n rnaJson.nodes[0].rna = null;\n rnaJson.nodes[0].nextNode = null;\n\n rnaJson.links[0].source = null;\n rnaJson.links[0].target = null;\n\n console.log(rnaJson.nodes[0]);\n console.log(rnaJson.links[0]);\n console.log(JSON.stringify(rnaJson.nodes[0],null,2));\n console.log(JSON.stringify(rnaJson.links[0],null,2));\n */\n\n if ('extraLinks' in passedOptions) {\n // presumably the passed in links are within the passed molecule\n let newLinks = self.addExternalLinks(rnaJson, passedOptions.extraLinks);\n\n self.extraLinks = self.extraLinks.concat(newLinks);\n }\n\n if ('centerPos' in passedOptions)\n self.addRNAJSON(rnaJson, {centerPos: passedOptions.centerPos,\n centerView: false})\n else if ('avoidOthers' in passedOptions)\n self.addRNAJSON(rnaJson, {avoidOthers: passedOptions.avoidOthers});\n else\n self.addRNAJSON(rnaJson, {centerView: passedOptions.centerView});\n\n return rnaJson;\n };\n\n self.addRNAJSON = function(rnaGraph,\n { avoidOthers = false,\n centerPos = null,\n centerView = true}\n ) {\n // Add an RNAGraph, which contains nodes and links as part of the\n // structure\n // Each RNA will have uid to identify it\n // when it is modified, it is replaced in the global list of RNAs\n //\n var maxX, minX;\n //console.log('centerView:', centerView);\n\n if (centerPos != null) {\n // center the newly created RNA at a given position\n let totalX = 0;\n let totalY = 0;\n let nodeCount = 0;\n\n rnaGraph.nodes.forEach(function(node) {\n totalX += node.x;\n totalY += node.y;\n nodeCount += 1;\n });\n\n if (nodeCount > 0) {\n // center the nodes at centerPos\n\n rnaGraph.nodes.forEach(function(node) {\n node.x = node.x + centerPos[0] - totalX / nodeCount;\n node.y = node.y + centerPos[1] - totalY / nodeCount;\n\n node.px = node.x;\n node.py = node.y;\n });\n }\n }\n\n if (avoidOthers) {\n if (self.graph.nodes.length > 0)\n maxX = d3.max(self.graph.nodes.map(function(d) { return d.x; }));\n else\n maxX = 0;\n\n minX = d3.min(rnaGraph.nodes.map(function(d) { return d.x; }));\n\n rnaGraph.nodes.forEach(function(node) {\n node.x += (maxX - minX) + 20;\n node.px += (maxX - minX);\n });\n }\n\n rnaGraph.nodes.forEach(function(node) {\n node.rna = rnaGraph;\n });\n\n self.rnas[rnaGraph.uid] = rnaGraph;\n recalculateGraph();\n\n self.update();\n\n if (centerView)\n self.centerView();\n\n return rnaGraph;\n };\n\n self.addNodes = function addNodes(json) {\n // add a new set of nodes from a json file\n\n // Resolve the sources and targets of the links so that they\n // are not just indeces into an array\n json.links.forEach(function(entry) {\n if (typeof entry.source == 'number') entry.source = json.nodes[entry.source];\n if (typeof entry.target == 'number') entry.target = json.nodes[entry.target];\n });\n\n // Get the maximum x and y values of the current graph\n // so that we don't place a new structure on top of the\n // old one\n if (self.graph.nodes.length > 0) {\n maxX = d3.max(self.graph.nodes.map(function(d) {return d.x;}));\n maxY = d3.max(self.graph.nodes.map(function(d) {return d.y;}));\n } else {\n maxX = 0;\n maxY = 0;\n }\n\n json.nodes.forEach(function(entry) {\n if (!(entry.rna.uid in self.rnas)) {\n self.rnas[entry.rna.uid] = entry.rna;\n }\n\n entry.x += maxX;\n //entry.y += maxY;\n\n entry.px += maxX;\n //entry.py += maxY;\n });\n\n r = new RNAGraph('','');\n r.nodes = json.nodes;\n r.links = json.links;\n\n //self.addRNA(r);\n recalculateGraph();\n\n self.update();\n self.centerView();\n };\n\n self.clearNodes = () => {\n self.graph.nodes = [];\n self.graph.links = [];\n\n self.rnas = {};\n self.extraLinks = [];\n\n self.update();\n };\n\n self.addLink = function(newLink) {\n // this means we have a new json, which means we have\n // to recalculate the structure and change the colors\n // appropriately\n //\n console.log('adding new link');\n if (newLink.source.rna == newLink.target.rna) {\n // must be a basepair\n let r = newLink.source.rna;\n\n r.pairtable[newLink.source.num] = newLink.target.num;\n r.pairtable[newLink.target.num] = newLink.source.num;\n\n updateRnaGraph(r);\n\n } else {\n //Add an extra link\n console.log('intermolecule');\n newLink.linkType = 'intermolecule';\n self.extraLinks.push(newLink);\n }\n recalculateGraph();\n self.update();\n };\n\n self.addExternalLinks = function(rnaJson, externalLinks) {\n let newLinks = [];\n\n for (let i = 0; i < externalLinks.length; i++) {\n let newLink = {linkType: 'external', value: 1, uid: slugid.nice(),\n source: null, target: null};\n // check if the source node is an array\n if (Object.prototype.toString.call(externalLinks[i][0]) === '[object Array]') {\n for (let j = 0; j < rnaJson.nodes.length; j++) {\n if ('nucs' in rnaJson.nodes[j]) {\n if (rnaJson.nodes[j].nucs.equals(externalLinks[i][0])) {\n newLink.source = rnaJson.nodes[j];\n break;\n }\n }\n }\n } else {\n for (let j = 0; j < rnaJson.nodes.length; j++) {\n if (rnaJson.nodes[j].num == externalLinks[i][0]) {\n newLink.source = rnaJson.nodes[j];\n }\n }\n }\n\n // check if the target node is an array\n if (Object.prototype.toString.call(externalLinks[i][1]) === '[object Array]') {\n for (let j = 0; j < rnaJson.nodes.length; j++) {\n if ('nucs' in rnaJson.nodes[j]) {\n if (rnaJson.nodes[j].nucs.equals(externalLinks[i][1])) {\n newLink.target = rnaJson.nodes[j];\n }\n }\n }\n } else {\n for (let j = 0; j < rnaJson.nodes.length; j++) {\n if (rnaJson.nodes[j].num == externalLinks[i][1]) {\n newLink.target = rnaJson.nodes[j];\n }\n }\n }\n\n if (newLink.source == null || newLink.target == null) {\n console.log('ERROR: source or target of new link not found:', newLink, externalLinks[i]);\n continue;\n }\n\n newLinks.push(newLink);\n }\n\n return newLinks;\n };\n\n self.getStructuresDotBracket = function() {\n console.log('self.rnas:', self.rnas);\n let sequence = [];\n let currIdx = 1;\n let nodeIdxs = {};\n let breaks = [];\n let pairtable = [];\n\n // add the nodes\n for (let uid in self.rnas) {\n let rna = self.rnas[uid];\n\n for (let j = 0; j < rna.nodes.length; j++) {\n let node = rna.nodes[j];\n\n if (node.nodeType != 'nucleotide')\n continue;\n\n console.log('node:', node);\n nodeIdxs[node.uid] = currIdx;\n currIdx += 1;\n\n sequence.push(node.name);\n }\n\n breaks.push(currIdx);\n }\n\n pairtable = [currIdx-1]\n for (let i = 0; i < currIdx; i++)\n pairtable.push(0)\n\n // add the links\n for (let uid in self.rnas) {\n let rna = self.rnas[uid];\n\n for (let j = 0; j < rna.links.length; j++) {\n let link = rna.links[j];\n\n if (link.linkType != 'basepair')\n continue;\n\n let idx1 = nodeIdxs[link.source.uid];\n let idx2 = nodeIdxs[link.target.uid];\n pairtable[idx1] = idx2;\n pairtable[idx2] = idx1;\n }\n }\n\n for (let i = 0; i < self.extraLinks.length; i++) {\n let link = self.extraLinks[i];\n\n let idx1 = nodeIdxs[link.source.uid];\n let idx2 = nodeIdxs[link.target.uid];\n\n pairtable[idx1] = idx2;\n pairtable[idx2] = idx1;\n }\n\n let structure = rnaUtilities.pairtableToDotbracket(pairtable).split('');\n\n for (let i = 0; i < breaks.length - 1; i++) {\n console.log('breaks[i]:', breaks[i]);\n sequence.splice(breaks[i] + i - 1, 0, '&');\n structure.splice(breaks[i] + i - 1, 0, '&');\n }\n\n console.log('sequence:', sequence, sequence.join(''));\n console.log('structure:', structure, structure.join(''));\n return [sequence.join(''), structure.join('')];\n };\n\n /* APIs */\n self.startAnimation = function() {\n self.options.animation = true;\n vis.selectAll('g.gnode')\n .call(drag);\n self.force.start();\n };\n\n self.stopAnimation = function() {\n self.options.animation = false;\n vis.selectAll('g.gnode')\n .on('mousedown.drag', null);\n self.force.stop();\n };\n\n self.resumeForce = function() {\n if (self.options.animation)\n self.force.resume();\n };\n\n self.setFriction = function(value) {\n self.force.friction(value);\n self.resumeForce();\n };\n\n self.setCharge = function(value) {\n self.force.charge(value);\n self.resumeForce();\n };\n\n self.setGravity = function(value) {\n self.force.gravity(value);\n self.resumeForce();\n };\n\n self.setPseudoknotStrength = function(value) {\n self.linkStrengths.pseudoknot = value;\n self.update();\n };\n\n self.displayNumbering = function(value) {\n self.displayParameters.displayNumbering = value;\n updateStyle();\n };\n\n self.displayNodeOutline = function(value) {\n self.displayParameters.displayNodeOutline = value;\n updateStyle();\n };\n\n self.displayNodeLabel = function(value) {\n self.displayParameters.displayNodeLabel = value;\n updateStyle();\n };\n\n self.displayLinks = function(value) {\n self.displayParameters.displayLinks = value;\n updateStyle();\n };\n\n self.displayPseudoknotLinks = function(value) {\n self.displayParameters.displayPseudoknotLinks = value;\n updateStyle();\n };\n\n self.displayProteinLinks = function(value) {\n self.displayParameters.displayProteinLinks = value;\n updateStyle();\n };\n\n self.displayDirectionArrows = function(value) {\n self.displayParameters.displayDirectionArrows = value;\n updateStyle();\n };\n}\n","import {RNAGraph} from './rnagraph.js';\n\nimport {simpleXyCoordinates} from './simplernaplot.js';\nimport {NAView} from './naview/naview.js'\n\nimport fstyle from './fornac.css';\n\nexport function rnaPlot(passedOptions = {}) {\n var options = {\n 'width': 300,\n 'height': 300,\n 'nucleotideRadius': 5,\n 'rnaEdgePadding': 1, // how far the leftmost, rightmost, topmost and bottomost\n // nucleotides are from the edge of the plot\n 'labelInterval': 10,\n 'showNucleotideLabels': true,\n 'startNucleotideNumber': 1,\n 'bundleExternalLinks': false,\n\n 'rnaLayout': 'simple', // simple or naview\n 'namePosition': '0 0' // for x and y either 0, 0.5 or 1\n };\n var options = Object.assign(options, passedOptions);\n\n var xScale, yScale;\n\n function createTransformToFillViewport(xValues, yValues) {\n // create transform that will scale the x and y values so that\n // they fill the available viewport\n let xExtent = d3.extent(xValues);\n let yExtent = d3.extent(yValues);\n\n // add the radius of the nucleotides\n xExtent[0] -= options.nucleotideRadius + options.rnaEdgePadding;\n yExtent[0] -= options.nucleotideRadius + options.rnaEdgePadding;\n\n xExtent[1] += options.nucleotideRadius + options.rnaEdgePadding;\n yExtent[1] += options.nucleotideRadius + options.rnaEdgePadding;\n\n // find out how wide and height the molecule\n var xRange = xExtent[1] - xExtent[0];\n var yRange = yExtent[1] - yExtent[0];\n\n // how much wider / taller is it than the available viewport\n var xExtra = xRange - options.width;\n var yExtra = yRange - options.height;\n\n // once we have a scale for one dimension, we can create the scale for the other\n // keeping the same expansion / shrinking ratio\n function createOtherScale(firstScale, newDomain, newRange) {\n var scaleFactor = (firstScale.range()[1] - firstScale.range()[0]) /\n (firstScale.domain()[1] - firstScale.domain()[0]);\n var newWidth = (newDomain[1] - newDomain[0]) * scaleFactor\n var newMargin = ((newRange[1] - newRange[0]) - newWidth) / 2;\n\n return {'scaleFactor': scaleFactor,\n 'scale': d3.scale.linear()\n .domain(newDomain)\n .range([newRange[0] + newMargin, newRange[1] - newMargin])};\n }\n\n var ret;\n\n if (xExtra > yExtra) {\n // we have to shrink more in the x-dimension than the y\n xScale = d3.scale.linear()\n .domain(xExtent)\n .range([0, options.width])\n\n ret = createOtherScale(xScale, yExtent, [0, options.height]);\n yScale = ret.scale;\n } else {\n // we have to shrink more in the x-dimension than the y\n yScale = d3.scale.linear()\n .domain(yExtent)\n .range([0, options.height])\n\n ret = createOtherScale(yScale, xExtent, [0, options.width]);\n xScale = ret.scale;\n }\n\n var xOffset = xScale.range()[0] - xScale.domain()[0];\n var yOffset = yScale.range()[0] - yScale.domain()[0];\n\n return 'translate(' + -(xScale.domain()[0] * ret.scaleFactor - xScale.range()[0]) +\n ',' + -(yScale.domain()[0] * ret.scaleFactor - yScale.range()[0]) + ')' +\n 'scale(' + ret.scaleFactor + ')';\n }\n\n function createNucleotides(selection, nucleotideNodes) {\n // create groupings for each nucleotide and label\n var gs = selection\n .selectAll('.gnode')\n .data(nucleotideNodes)\n .enter()\n .append('svg:g')\n .classed('gnode', true)\n .attr('transform', function(d) {\n return 'translate(' + d.x + ',' + d.y + ')';\n });\n\n var circles = gs.append('svg:circle')\n .classed(fstyle.node, true)\n .attr('node_type', 'nucleotide')\n .attr('base_type', (d) => { if (d.name) { return d.name.toLowerCase(); }})\n .attr('r', options.nucleotideRadius)\n\n\n if (options.showNucleotideLabels) {\n var nucleotideLabels = gs.append('svg:text')\n .text(function(d) { return d.name; })\n .classed(fstyle.nodeLabel, true)\n .append('svg:title')\n .text(function(d) { return d.struct_name + ':' + d.num; });\n }\n }\n\n function createLabels(selection, labelNodes) {\n // create groupings for each nucleotide and label\n\n var gs = selection\n .selectAll()\n .data(labelNodes)\n .enter()\n .append('svg:g')\n .classed('gnode', true)\n .attr('transform', function(d) {\n return 'translate(' + d.x + ',' + d.y + ')';\n });\n\n var circles = gs.append('svg:circle')\n .classed(fstyle.node, true)\n .attr('node_type', 'label')\n .attr('r', options.nucleotideRadius)\n\n var numberLabels = gs.append('svg:text')\n .classed(fstyle.nodeLabel, true)\n .text(function(d) { return d.name; })\n }\n\n function createName(selection, name) {\n let nameLabel = selection.append('svg:text')\n //.attr('dy', -10)\n .classed(fstyle.plotLabel, true)\n .text(name);\n\n let xyPos = options.namePosition.split(\" \", 2) // 0 0.5 1\n let xy = []\n let textBBox = nameLabel.node().getBBox()\n let textSize = [textBBox.width, textBBox.height]\n let plotSize = [options.width, options.height]\n\n for (let p in [0, 1]) {\n switch (xyPos[p]) {\n case '0':\n xy[p] = textSize[p] / 2\n break;\n case '1':\n xy[p] = plotSize[p] - textSize[p] / 2\n break;\n case '0.5':\n xy[p] = plotSize[p] / 2\n break;\n }\n }\n nameLabel.attr('x', xy[0]).attr('y', xy[1])\n }\n\n function makeExternalLinksBundle(selection, links) {\n var nodesDict = {};\n var linksList = [];\n links = links.filter(function(d) { return d.linkType == 'correct' || d.linkType == 'incorrect' || d.linkType == 'extra'; });\n\n selection.selectAll('[link-type=extra]')\n .remove();\n\n\n for (var i = 0; i < links.length; i++) {\n if (links[i].source === null || links[i].target === null)\n continue;\n\n nodesDict[links[i].source.uid] = links[i].source;\n nodesDict[links[i].target.uid] = links[i].target;\n\n linksList.push({'source': links[i].source.uid, 'target': links[i].target.uid, 'linkType': links[i].linkType, 'extraLinkType': links[i].extraLinkType}) ;\n }\n\n var fbundling = d3.ForceEdgeBundling().nodes(nodesDict).edges(linksList)\n .compatibility_threshold(0.8).step_size(0.2);\n var results = fbundling();\n\n var d3line = d3.svg.line()\n .x(function(d){return d.x;})\n .y(function(d){return d.y;})\n .interpolate('linear');\n\n for (var i = 0; i < results.length; i++) {\n var edge_subpoint_data = results[i];\n // for each of the arrays in the results\n // draw a line between the subdivions points for that edge\n\n selection.append('path').attr('d', d3line(edge_subpoint_data))\n .style('fill', 'none')\n .attr('link-type', function(d) { return linksList[i].linkType; })\n .attr('extra-link-type', function(d) { return linksList[i].extraLinkType; })\n .style('stroke-opacity',0.4); //use opacity as blending\n }\n\n }\n\n function createLinks(selection, links) {\n links = links.filter(function(d) { return d.source !== null && d.target !== null; });\n var gs = selection.selectAll('.link')\n .data(links)\n .enter()\n .append('svg:line')\n .attr('x1', function(d) { return d.source.x; })\n .attr('x2', function(d) { return d.target.x; })\n .attr('y1', function(d) { return d.source.y; })\n .attr('y2', function(d) { return d.target.y; })\n .attr('link-type', function(d) { return d.linkType; })\n .attr('extra-link-type', function(d) { return d.extraLinkType; })\n .classed('link', true)\n .classed(fstyle.link, true)\n }\n\n function chart(selection) {\n selection.each(function(data) {\n let plot = d3.select(this).append('g')\n .classed(fstyle.plot, true)\n\n // data should be a dictionary containing at least a structure\n // and possibly a sequence\n let rg = new RNAGraph(data.sequence, data.structure, data.name, options.startNucleotideNumber)\n .recalculateElements()\n .elementsToJson()\n .addName(data.name);\n\n data.rnaGraph = rg;\n // calculate the position of each nucleotide\n // the positions of the labels will be calculated in\n // the addLabels function\n let positions = [];\n\n if (options.rnaLayout === 'naview') {\n var naview = new NAView();\n var naViewPositions = naview.naview_xy_coordinates(rg.pairtable);\n\n for (var i = 0; i < naViewPositions.nbase; i++) {\n positions.push([naViewPositions.x[i], naViewPositions.y[i]]);\n }\n } else {\n positions = simpleXyCoordinates(rg.pairtable);\n }\n\n rg.addPositions('nucleotide', positions)\n //.reinforceStems()\n //.reinforceLoops()\n //.addExtraLinks(data.extraLinks)\n .addLabels(options.startNucleotideNumber, options.labelInterval);\n\n // create a transform that will fit the molecule to the\n // size of the viewport (canvas, svg, whatever)\n let fillViewportTransform = createTransformToFillViewport(\n rg.nodes.map(function(d) { return d.x; }),\n rg.nodes.map(function(d) { return d.y; })\n );\n plot.attr('transform', fillViewportTransform);\n\n let nucleotideNodes = rg.nodes.filter(function(d) {\n return d.nodeType == 'nucleotide';\n });\n\n let labelNodes = rg.nodes.filter(function(d) {\n return d.nodeType == 'label';\n });\n\n let links = rg.links;\n\n createLinks(plot, links);\n createNucleotides(plot, nucleotideNodes);\n createLabels(plot, labelNodes);\n createName(d3.select(this), data.name);\n\n if (options.bundleExternalLinks) {\n makeExternalLinksBundle(plot, links);\n }\n\n });\n }\n\n chart.width = function(_) {\n if (!arguments.length) return options.width;\n options.width = _;\n return chart;\n };\n\n chart.height = function(_) {\n if (!arguments.length) return options.height;\n options.height = _;\n return chart;\n };\n\n chart.showNucleotideLabels = function(_) {\n if (!arguments.length) return options.showNucleotideLabels;\n options.showNucleotideLabels = _;\n return chart;\n };\n\n chart.rnaEdgePadding = function(_) {\n if (!arguments.length) return options.rnaEdgePadding;\n options.rnaEdgePadding = _;\n return chart;\n };\n\n chart.nucleotideRadius = function(_) {\n if (!arguments.length) return options.nucleotideRadius;\n options.nucleotideRadius = _;\n return chart;\n };\n\n chart.labelInterval = function(_) {\n if (!arguments.length) return options.labelInterval;\n options.labelInterval = _;\n return chart;\n };\n\n chart.showNucleotideLabels = function(_) {\n if (!arguments.length) return options.showNucleotideLabels;\n options.showNucleotideLabels = _;\n return chart;\n };\n\n chart.startNucleotideNumber = function(_) {\n if (!arguments.length) return options.startNucleotideNumber;\n options.startNucleotideNumber = _;\n return chart;\n };\n\n chart.bundleExternalLinks = function(_) {\n if (!arguments.length) return options.bundleExternalLinks;\n options.bundleExternalLinks = _;\n return chart;\n };\n\n chart.rnaLayout = function(_) {\n if (!arguments.length) return options.rnaLayout;\n options.rnaLayout = _;\n return chart;\n };\n\n chart.namePosition = function(_) {\n if (!arguments.length) return options.namePosition;\n options.namePosition = _;\n return chart;\n };\n\n return chart;\n}\n","import {rnaPlot} from './rnaplot.js';\n\nexport function rnaTreemap(passedOptions = {}) {\n var options = {\n 'width': 300,\n 'height': 300,\n 'nucleotideRadius': 5,\n 'rnaEdgePadding': 1, // how far the leftmost, rightmost, topmost and bottomost\n // nucleotides are from the edge of the plot\n 'labelInterval': 10,\n 'showNucleotideLabels': true,\n 'startNucleotideNumber': 1,\n 'bundleExternalLinks': false,\n\n 'rnaLayout': 'simple', // simple or naview\n 'namePosition': '0 0', // for x and y either 0, 0.5 or 1\n };\n\n var options = Object.assign(options, passedOptions);\n\n function rnaTreemapNode(selection) {\n // create a background rectangle for each RNA structure\n selection.each(function(d) {\n d3.select(this)\n .attr('transform', function(d) { return 'translate(' + d.x + ',' + d.y + ')' })\n .append('rect')\n .attr('fill', 'transparent')\n .attr('width', function(d) { return Math.max(0, d.dx); })\n .attr('height', function(d) { return Math.max(0, d.dy); })\n\n // draw the actual RNA structure\n var chart = rnaPlot(options)\n .width( Math.max(0, d.dx))\n .height( Math.max(0, d.dy))\n\n if ('structure' in d) d3.select(this).call(chart)\n });\n }\n\n var chart = function(selection) {\n selection.each(function(data) {\n console.log('data:', data)\n // initialize the treemap structure\n // sample input\n // { 'name': 'blah',\n // 'children: [{'structure': '..((..))',\n // 'sequence': 'ACCGGCC',\n // 'size': 50}]\n // }\n var treemap = d3.layout.treemap()\n .size([options.width, options.height])\n .sticky(false)\n .value(function(d) { return d.size; });\n\n // create a new for each node in the treemap\n // this may be a little redundant, since we expect the calling\n // selection to contain their own g elements\n var gEnter = d3.select(this)\n .append('g')\n .classed('rnatreemap', true)\n var treemapGnodes = gEnter.datum(data).selectAll('.treemapnode')\n .data(treemap.nodes)\n .enter()\n .append('g')\n .classed('treemapnode', true)\n .call(rnaTreemapNode);\n });\n };\n\n chart.width = function(_) {\n if (!arguments.length) return options.width;\n options.width = _;\n return chart;\n };\n\n chart.height = function(_) {\n if (!arguments.length) return options.height;\n options.height = _;\n return chart;\n };\n\n chart.showNucleotideLabels = function(_) {\n if (!arguments.length) return options.showNucleotideLabels;\n options.showNucleotideLabels = _;\n return chart;\n };\n\n chart.rnaEdgePadding = function(_) {\n if (!arguments.length) return options.rnaEdgePadding;\n options.rnaEdgePadding = _;\n return chart;\n };\n\n chart.nucleotideRadius = function(_) {\n if (!arguments.length) return options.nucleotideRadius;\n options.nucleotideRadius = _;\n return chart;\n };\n\n chart.labelInterval = function(_) {\n if (!arguments.length) return options.labelInterval;\n options.labelInterval = _;\n return chart;\n };\n\n chart.showNucleotideLabels = function(_) {\n if (!arguments.length) return options.showNucleotideLabels;\n options.showNucleotideLabels = _;\n return chart;\n };\n\n chart.startNucleotideNumber = function(_) {\n if (!arguments.length) return options.startNucleotideNumber;\n options.startNucleotideNumber = _;\n return chart;\n };\n\n chart.bundleExternalLinks = function(_) {\n if (!arguments.length) return options.bundleExternalLinks;\n options.bundleExternalLinks = _;\n return chart;\n };\n\n chart.rnaLayout = function(_) {\n if (!arguments.length) return options.rnaLayout;\n options.rnaLayout = _;\n return chart;\n };\n\n chart.namePosition = function(_) {\n if (!arguments.length) return options.namePosition;\n options.namePosition = _;\n return chart;\n };\n\n chart.zoom = function(_) {\n if (!arguments.length) return options.zoom;\n options.zoom = _;\n return chart;\n };\n\n return chart;\n}\n"],"names":["root","factory","exports","module","require","define","amd","self","__WEBPACK_EXTERNAL_MODULE__990__","Connection","this","loop","Loop","region","Region","start","end","xrad","yrad","angle","extruded","broken","_isNull","prototype","isNull","setNull","getLoop","setLoop","getRegion","setRegion","getStart","setStart","getEnd","setEnd","getXrad","setXrad","getYrad","setYrad","getAngle","setAngle","isExtruded","setExtruded","isBroken","setBroken","nconnection","connections","_connections","number","depth","mark","x","y","radius","getNconnection","setNconnection","setConnection","i","c","getConnection","addConnection","push","getNumber","setNumber","getDepth","setDepth","isMark","setMark","getX","setX","getY","setY","getRadius","setRadius","_start1","_end1","_start2","_end2","getStart1","setStart1","start1","getEnd1","setEnd1","end1","getStart2","setStart2","start2","getEnd2","setEnd2","end2","byteLength","b64","lens","getLens","validLen","placeHoldersLen","toByteArray","tmp","arr","Arr","_byteLength","curByte","len","revLookup","charCodeAt","fromByteArray","uint8","length","extraBytes","parts","maxChunkLength","len2","encodeChunk","lookup","join","Uint8Array","Array","code","Error","indexOf","num","output","base64","ieee754","customInspectSymbol","Symbol","Buffer","SlowBuffer","alloc","INSPECT_MAX_BYTES","K_MAX_LENGTH","createBuffer","RangeError","buf","Object","setPrototypeOf","arg","encodingOrOffset","TypeError","allocUnsafe","from","value","string","encoding","isEncoding","actual","write","slice","fromString","ArrayBuffer","isView","arrayView","isInstance","copy","fromArrayBuffer","buffer","byteOffset","fromArrayLike","fromArrayView","SharedArrayBuffer","valueOf","b","obj","isBuffer","checked","undefined","numberIsNaN","type","isArray","data","fromObject","toPrimitive","assertSize","size","array","toString","mustMatch","arguments","loweredCase","utf8ToBytes","base64ToBytes","toLowerCase","slowToString","hexSlice","utf8Slice","asciiSlice","latin1Slice","base64Slice","utf16leSlice","swap","n","m","bidirectionalIndexOf","val","dir","arrayIndexOf","call","lastIndexOf","indexSize","arrLength","valLength","String","read","readUInt16BE","foundIndex","found","j","hexWrite","offset","Number","remaining","strLen","parsed","parseInt","substr","utf8Write","blitBuffer","asciiWrite","str","byteArray","asciiToBytes","base64Write","ucs2Write","units","hi","lo","utf16leToBytes","Math","min","res","firstByte","codePoint","bytesPerSequence","secondByte","thirdByte","fourthByte","tempCodePoint","codePoints","MAX_ARGUMENTS_LENGTH","fromCharCode","apply","decodeCodePointsArray","kMaxLength","TYPED_ARRAY_SUPPORT","proto","foo","e","typedArraySupport","console","error","defineProperty","enumerable","get","poolSize","fill","allocUnsafeSlow","_isBuffer","compare","a","concat","list","pos","set","swap16","swap32","swap64","toLocaleString","equals","inspect","max","replace","trim","target","thisStart","thisEnd","thisCopy","targetCopy","includes","isFinite","toJSON","_arr","ret","out","hexSliceLookupTable","bytes","checkOffset","ext","checkInt","wrtBigUInt64LE","checkIntBI","BigInt","wrtBigUInt64BE","checkIEEE754","writeFloat","littleEndian","noAssert","writeDouble","newBuf","subarray","readUintLE","readUIntLE","mul","readUintBE","readUIntBE","readUint8","readUInt8","readUint16LE","readUInt16LE","readUint16BE","readUint32LE","readUInt32LE","readUint32BE","readUInt32BE","readBigUInt64LE","defineBigIntMethod","validateNumber","first","last","boundsError","readBigUInt64BE","readIntLE","pow","readIntBE","readInt8","readInt16LE","readInt16BE","readInt32LE","readInt32BE","readBigInt64LE","readBigInt64BE","readFloatLE","readFloatBE","readDoubleLE","readDoubleBE","writeUintLE","writeUIntLE","writeUintBE","writeUIntBE","writeUint8","writeUInt8","writeUint16LE","writeUInt16LE","writeUint16BE","writeUInt16BE","writeUint32LE","writeUInt32LE","writeUint32BE","writeUInt32BE","writeBigUInt64LE","writeBigUInt64BE","writeIntLE","limit","sub","writeIntBE","writeInt8","writeInt16LE","writeInt16BE","writeInt32LE","writeInt32BE","writeBigInt64LE","writeBigInt64BE","writeFloatLE","writeFloatBE","writeDoubleLE","writeDoubleBE","targetStart","copyWithin","errors","E","sym","getMessage","Base","constructor","super","writable","configurable","name","stack","message","addNumericalSeparator","range","ERR_OUT_OF_RANGE","checkBounds","ERR_INVALID_ARG_TYPE","floor","ERR_BUFFER_OUT_OF_BOUNDS","input","msg","received","isInteger","abs","INVALID_BASE64_RE","Infinity","leadSurrogate","split","base64clean","src","dst","alphabet","table","i16","fn","BufferBigIntNotDefined","isLE","mLen","nBytes","eLen","eMax","eBias","nBits","d","s","NaN","rt","isNaN","log","LN2","uuid","encode","uuid_","parse","substring","decode","slug","stringify","v4","nice","getRandomValues","rnds8","rng","crypto","bind","msCrypto","byteToHex","_nodeId","_clockseq","_lastMSecs","_lastNSecs","options","node","clockseq","seedBytes","random","msecs","Date","now","nsecs","dt","tl","tmh","v","version","hashfunc","generateUUID","namespace","unescape","encodeURIComponent","stringToBytes","err","DNS","URL","getOutputLength","inputLength8","safeAdd","lsw","md5cmn","q","t","cnt","md5ff","md5gg","md5hh","md5ii","v35","length32","hexTab","hex","charAt","md5ToHexEncodedArray","olda","oldb","oldc","oldd","wordsToMd5","length8","Uint32Array","bytesToWords","rnds","f","z","ROTL","K","H","l","N","ceil","M","_i","_i2","W","_t","_t2","T","__webpack_module_cache__","__webpack_require__","moduleId","cachedModule","__webpack_modules__","getter","__esModule","definition","key","o","g","globalThis","Function","window","prop","hasOwnProperty","r","toStringTag","scriptUrl","importScripts","location","document","currentScript","scripts","getElementsByTagName","p","contextMenu","menu","opts","openCallback","closeCallback","previouslyMouseUp","uid","slugid","rootElement","orientation","initialPos","parentStart","onOpen","onClose","d3","enter","append","classed","on","style","index","pMouseUp","elm","mousePos","currentThis","openChildMenuUid","html","selectAll","attr","divider","disabled","action","title","children","childUid","boundingRect","getBoundingClientRect","childrenContextMenu","left","pageXOffset","top","pageYOffset","width","ArrowIcon","contextMenuSelection","innerWidth","numberSort","arraysEqual","RNAUtilities","bracketLeft","bracketRight","inverseBrackets","bracket","maximumMatching","pt","mm","maximum","backtrackMaximumMatching","oldPt","map","mmBt","dotbracketToPairtable","dotbracket","inverseBracketLeft","inverseBracketRight","ni","pop","insertIntoStack","k","deleteFromStack","pairtableToDotbracket","seen","findUnmatched","to","toRemove","unmatched","origFrom","origTo","removePseudoknotsFromPairtable","newPt","removed","ptToElements","level","dotBracketBreaks","elements","u5","u3","sort","external","right","combined","rnaUtilities","ColorScheme","colorsText","parseRange","rangeText","nums","parts1","parseColorText","colorText","lines","currMolecule","counter","colorsJson","colorValues","domainValues","words","search","partsRight","domain","color","normalizeColors","moleculeName","minNum","MAX_VALUE","maxNum","MIN_VALUE","resnum","RNAGraph","seq","structName","startNumber","circularizeExternal","circular","pseudoknotPairs","nucsToNodes","addUids","uids","nucleotideNodes","nodes","filter","nodeType","computePairtable","pairtable","removeBreaks","targetString","breaks","breakIndex","seqBreaks","rnaLength","addPositions","positions","labelNodes","breakNodesToFakeNodes","elemType","getPositions","getUids","reinforceStems","relevantElements","allNucs","nucs","addFakeNode","reinforceLoops","filterNucs","newNode1","px","py","newNode2","updateLinkUids","links","source","tan","fakeNodeUid","newNode","newX","newY","coordsCounted","cos","ia","fromNode","connectFakeNodes","fakeNodes","linked","thisNode","thisNuc","JSON","distance","addExtraLinks","extraLinks","newLink","getNodeFromNucleotides","linkType","elementsToJson","elemTypes","nodeName","prevNode","nextNode","addLabels","labelInterval","prevVec","nextVec","combinedVec","vecLength","sqrt","normedVec","offsetVec","recalculateElements","removePseudoknots","externalLoop","eloop","prev","hloop","numGreater","reassignLinkUids","addPseudoknots","addName","simpleXyCoordinates","pair_table","alpha","loop_size","stack_size","lp","stk","PIHALF","PI","i_old","partner","start_k","start_l","ladder","begin","diff","polygon","count","bubble","remember","poss","sin","Radloop","loopnumber","next","getLoopnumber","setLoopnumber","getNext","setNext","getPrev","setPrev","mate","extracted","getMate","setMate","isExtracted","setExtracted","NAView","ANUM","MAXITER","bases","nbase","nregion","loop_count","loops","regions","rlphead","lencut","RADIUS_REDUCTION_FACTOR","angleinc","_h","HELIX_FACTOR","BACKBONE_DISTANCE","determine_depths","FornaContainer","element","passedOptions","assign","initialSize","svgW","svgH","linkStrengths","displayParameters","colorScheme","customColors","rnas","mousedownNode","mouseupNode","linkContextMenuShown","resetMouseVars","graph","editable","animation","shiftKeydown","ctrlKeydown","keydown","getStructuresDotBracket","centerView","zoomable","disableZooming","enableBrushing","keyup","enableZooming","disableBrushing","backgroundMenu","canvasMousePos","xScale","invert","yScale","addRNA","nodeMenu","deleteNode","changeNode","insertNodeBeforeOrAfter","nodeContextMenu","backgroundContextMenu","select","remove","svg","each","focus","mouseEventHelper","mpos","vis","dragLine","fstyle","deselectAllNodes","visLinks","visNodes","zoomer","scaleExtent","toggleSelectNode","selected","selectNode","selectedNodes","brusher","extent","force","charge","middleCharge","otherCharge","friction","linkDistance","linkDistanceMultiplier","linkStrength","other","gravity","chargeDistance","drag","d1","fixed","resumeForce","createInitialLayout","structure","rg","sequence","rnaJson","layout","naview","naViewPositions","naview_xy_coordinates","createNewNodes","gnodesEnter","previouslySelected","rna","transition","duration","ease","nodeMousedown","nodeMouseup","labelAndProteinNodes","text","createNewLinks","linksEnter","linkLines","linkClick","drawDirectionArrow","magnitude","endPoint","startPoint","nodeStroke","parseFloat","lengthMult","arrowWidth","u","arrowTip","path","realLinkFilter","recalculateGraph","uidsToNodes","forEach","link","fakeLinks","linkIndex","splice","update","allLinks","elementKey","exit","gnodes","realNodes","collide","nx1","nx2","ny1","ny2","quad","x1","y1","x2","y2","point","visit","changeColorScheme","updateStyle","transitionRNA","newStructure","nextFunction","transitionDuration","newRNAJson","newNodes","callback","setTimeout","getBoundingBoxTransform","minX","minY","maxX","maxY","maxRadius","molWidth","molHeight","widthRatio","heightRatio","minRatio","maxNodeRadius","newMolWidth","newMolHeight","bbTransform","translate","scale","setSize","offsetWidth","offsetHeight","setOutlineColor","addCustomColors","json","addCustomColorsText","customColorsText","cs","newColorScheme","interpolate","changeColors","moleculeColors","displayNumbering","displayNodeOutline","displayNodeLabel","displayLinks","displayPseudoknotLinks","displayProteinLinks","displayAllLinks","displayDirectionArrows","referenceNode","newNodeNum","newDotbracket","newSequence","newPositions","positionOffset","newUids","pair","updateRnaGraph","nucleotidePositions","labelPositions","removeBackBoneLink","sequence1","sequence2","rnaDotBracket","dotBracket1","dotBracket2","positions1","positions2","uids1","uids2","rna1","rna2","removeLink","extraLinkIndex","addBackBoneLink","dotbracket1","dotbracket2","seq1","seq2","newSeq","toAddExternal","toDelete","newRna","basepairPossible","linkMenu","addLink","linkContextMenu","fromJSON","jsonString","ProteinGraph","addRNAJSON","newLinks","addExternalLinks","centerPos","avoidOthers","rnaGraph","totalX","totalY","nodeCount","addNodes","entry","clearNodes","externalLinks","currIdx","nodeIdxs","idx1","idx2","startAnimation","stopAnimation","stop","resume","setFriction","setCharge","setGravity","setPseudoknotStrength","pseudoknot","rnaPlot","createTransformToFillViewport","xValues","yValues","xExtent","yExtent","nucleotideRadius","rnaEdgePadding","xRange","yRange","createOtherScale","firstScale","newDomain","newRange","scaleFactor","newWidth","newMargin","linear","height","createNucleotides","selection","gs","showNucleotideLabels","struct_name","createLabels","createName","nameLabel","xyPos","namePosition","xy","textBBox","getBBox","textSize","plotSize","makeExternalLinksBundle","nodesDict","linksList","extraLinkType","results","ForceEdgeBundling","edges","compatibility_threshold","step_size","fbundling","d3line","line","edge_subpoint_data","createLinks","chart","plot","startNucleotideNumber","rnaLayout","fillViewportTransform","bundleExternalLinks","_","rnaTreemap","rnaTreemapNode","dx","dy","treemap","sticky","datum","zoom","read_in_bases","find_regions","construct_loop","find_central_loop","traverse_loop","npairs","nb1","ibase","retloop","cp","rp","rlp","maxconn","maxdepth","anchor_connection","xs","ys","xe","xn","yn","xc","yc","xo","yo","astart","aend","cpnext","acp","cpprev","ic","da","maxang","icstart","icend","icmiddle","icroot","done","done_all_connections","rooted","sign","midx","midy","nrx","nry","mx","my","vx","vy","dotmv","nmidx","nmidy","icstart1","icup","icdown","icnext","direction","dan","rr","cpx","cpy","cpnextx","cpnexty","cnx","rcn","rc","lnx","lny","rl","ac","acn","sx","sy","dcp","imaxloop","indice","atan2","set_radius","determine_radius","connected_connection","find_ic_middle","asin","construct_extruded_segment","generate_region","mindit","ci","sumn","sumd","dit","imindit","rt2_2","aend1","aend2","aave","a1","a2","dac","nstart","nend","collision","construct_circle_segment","minf2","maxf2","find_center_for_arc","h","hhi","hlow","disc","theta","iter","acos","noIterationFailureYet"],"sourceRoot":""} \ No newline at end of file +{"version":3,"file":"fornac.js","mappings":"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","sources":["webpack://fornac/webpack/universalModuleDefinition","webpack://fornac/./src/naview/connection.js","webpack://fornac/./src/naview/loop.js","webpack://fornac/./src/naview/region.js","webpack://fornac/./node_modules/base64-js/index.js","webpack://fornac/./node_modules/buffer/index.js","webpack://fornac/./src/d3-context-menu.css?fe1f","webpack://fornac/./src/fornac.css?7f8e","webpack://fornac/./node_modules/ieee754/index.js","webpack://fornac/./node_modules/slugid/index.js","webpack://fornac/./node_modules/slugid/slugid.js","webpack://fornac/./node_modules/uuid/dist/esm-browser/rng.js","webpack://fornac/./node_modules/uuid/dist/esm-browser/regex.js","webpack://fornac/./node_modules/uuid/dist/esm-browser/validate.js","webpack://fornac/./node_modules/uuid/dist/esm-browser/stringify.js","webpack://fornac/./node_modules/uuid/dist/esm-browser/v1.js","webpack://fornac/./node_modules/uuid/dist/esm-browser/parse.js","webpack://fornac/./node_modules/uuid/dist/esm-browser/v35.js","webpack://fornac/./node_modules/uuid/dist/esm-browser/md5.js","webpack://fornac/./node_modules/uuid/dist/esm-browser/v3.js","webpack://fornac/./node_modules/uuid/dist/esm-browser/v4.js","webpack://fornac/./node_modules/uuid/dist/esm-browser/sha1.js","webpack://fornac/./node_modules/uuid/dist/esm-browser/v5.js","webpack://fornac/./node_modules/uuid/dist/esm-browser/nil.js","webpack://fornac/./node_modules/uuid/dist/esm-browser/version.js","webpack://fornac/external umd \"d3\"","webpack://fornac/webpack/bootstrap","webpack://fornac/webpack/runtime/compat get default export","webpack://fornac/webpack/runtime/define property getters","webpack://fornac/webpack/runtime/global","webpack://fornac/webpack/runtime/hasOwnProperty shorthand","webpack://fornac/webpack/runtime/make namespace object","webpack://fornac/webpack/runtime/publicPath","webpack://fornac/./src/img/play.svg","webpack://fornac/./src/d3-context-menu.js","webpack://fornac/./src/rnautils.js","webpack://fornac/./src/rnagraph.js","webpack://fornac/./src/simplernaplot.js","webpack://fornac/./src/naview/radloop.js","webpack://fornac/./src/naview/base.js","webpack://fornac/./src/naview/naview.js","webpack://fornac/./src/fornac.js","webpack://fornac/./src/rnaplot.js","webpack://fornac/./src/rnatreemap.js"],"sourcesContent":["(function webpackUniversalModuleDefinition(root, factory) {\n\tif(typeof exports === 'object' && typeof module === 'object')\n\t\tmodule.exports = factory(require(\"d3\"));\n\telse if(typeof define === 'function' && define.amd)\n\t\tdefine([\"d3\"], factory);\n\telse if(typeof exports === 'object')\n\t\texports[\"fornac\"] = factory(require(\"d3\"));\n\telse\n\t\troot[\"fornac\"] = factory(root[\"d3\"]);\n})(self, (__WEBPACK_EXTERNAL_MODULE__893__) => {\nreturn ","import {Loop} from './loop.js';\nimport {Region} from './region.js';\n\nexport function Connection() {\n\tthis.loop = new Loop();\n\tthis.region = new Region();\n\t// Start and end form the 1st base pair of the region.\n\tthis.start = null;\n this.end = null;\n\tthis.xrad = null;\n this.yrad = null;\n this.angle = null;\n\t// True if segment between this connection and the\n\t// next must be extruded out of the circle\n\tthis.extruded = null;\n\t// True if the extruded segment must be drawn long.\n\tthis.broken = null;\n\n\tthis._isNull = false;\n}\n\nConnection.prototype.isNull = function(){\n\treturn this._isNull;\n}\n\nConnection.prototype.setNull = function(isNull){\n\tthis._isNull = isNull;\n}\n\nConnection.prototype.getLoop = function(){\n\treturn this.loop;\n}\n\nConnection.prototype.setLoop = function(loop) {\n\tthis.loop = loop;\n}\n\nConnection.prototype.getRegion = function(){\n\treturn this.region;\n}\n\nConnection.prototype.setRegion = function(region){\n\tthis.region = region;\n}\n\nConnection.prototype.getStart = function(){\n\treturn this.start;\n}\n\nConnection.prototype.setStart = function(start) {\n\tthis.start = start;\n}\n\nConnection.prototype.getEnd = function(){\n\treturn this.end;\n}\n\nConnection.prototype.setEnd = function(end){\n\tthis.end = end;\n}\n\nConnection.prototype.getXrad = function(){\n\treturn this.xrad;\n}\n\nConnection.prototype.setXrad = function(xrad){\n\tthis.xrad = xrad;\n}\n\nConnection.prototype.getYrad = function(){\n\treturn this.yrad;\n}\n\nConnection.prototype.setYrad = function(yrad) {\n\tthis.yrad = yrad;\n}\n\nConnection.prototype.getAngle = function(){\n\treturn this.angle;\n}\n\nConnection.prototype.setAngle = function(angle){\n\tthis.angle = angle;\n}\n\nConnection.prototype.isExtruded = function(){\n\treturn this.extruded;\n}\n\nConnection.prototype.setExtruded = function(extruded){\n\tthis.extruded = extruded;\n}\n\nConnection.prototype.isBroken = function(){\n\treturn this.broken;\n}\n\nConnection.prototype.setBroken = function(broken){\n\tthis.broken = broken;\n}\n","import {Connection} from './connection.js';\n\nexport function Loop() {\n\tthis.nconnection = null;\n\tthis.connections = [];\n\tthis._connections = [];\n\tthis.number = null;\n\tthis.depth = null;\n\tthis.mark = null;\n\tthis.x = null;\n this.y = null;\n this.radius = null;\n}\n\nLoop.prototype.getNconnection = function() {\n\treturn this.nconnection;\n}\n\nLoop.prototype.setNconnection = function(nconnection) {\n\tthis.nconnection = nconnection;\n}\n\nLoop.prototype.setConnection = function(i, c){\n\tif (c != null){\n\t\tthis._connections[i] = c;\n }\n\telse {\n\t\tif (!this._connections[i]){\n\t\t\tthis._connections[i] = new Connection();\n\t\t}\n\t\tthis._connections[i].setNull(true);\n\t}\n}\n\nLoop.prototype.getConnection = function(i){\n\tvar Connection = require(\"./connection\");\n\tif (!this._connections[i]){\n this._connections[i] = new Connection();\n }\n\tvar c = this._connections[i];\n\tif (c.isNull()){\n\t\treturn null;\n }\n\telse {\n\t\treturn c;\n }\n}\n\nLoop.prototype.addConnection = function(i, c){\n\tthis._connections.push(c);\n}\n\nLoop.prototype.getNumber = function(){\n\treturn this.number;\n}\n\nLoop.prototype.setNumber = function(number){\n\tthis.number = number;\n}\n\nLoop.prototype.getDepth = function(){\n\treturn this.depth;\n}\n\nLoop.prototype.setDepth = function(depth){\n\tthis.depth = depth;\n}\n\nLoop.prototype.isMark = function(){\n\treturn this.mark;\n}\n\nLoop.prototype.setMark = function(mark){\n\tthis.mark = mark;\n}\n\nLoop.prototype.getX = function(){\n\treturn this.x;\n}\n\nLoop.prototype.setX = function(x){\n\tthis.x = x;\n}\n\nLoop.prototype.getY = function(){\n\treturn this.y;\n}\n\nLoop.prototype.setY = function(y){\n\tthis.y = y;\n}\n\nLoop.prototype.getRadius = function(){\n\treturn this.radius;\n}\n\nLoop.prototype.setRadius = function(radius){\n\tthis.radius = radius;\n}\n","export function Region() {\n\tthis._start1 = null;\n this._end1 = null;\n this._start2 = null;\n this._end2 = null;\n}\n\nRegion.prototype.getStart1 = function(){\n\treturn this._start1;\n}\n\nRegion.prototype.setStart1 = function(start1){\n\tthis._start1 = start1;\n}\n\nRegion.prototype.getEnd1 = function(){\n\treturn this._end1;\n}\n\nRegion.prototype.setEnd1 = function(end1){\n\tthis._end1 = end1;\n}\n\nRegion.prototype.getStart2 = function(){\n\treturn this._start2;\n}\n\nRegion.prototype.setStart2 = function(start2){\n\tthis._start2 = start2;\n}\n\nRegion.prototype.getEnd2 = function(){\n\treturn this._end2;\n}\n\nRegion.prototype.setEnd2 = function(end2){\n\tthis._end2 = end2;\n}\n","'use strict'\n\nexports.byteLength = byteLength\nexports.toByteArray = toByteArray\nexports.fromByteArray = fromByteArray\n\nvar lookup = []\nvar revLookup = []\nvar Arr = typeof Uint8Array !== 'undefined' ? Uint8Array : Array\n\nvar code = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/'\nfor (var i = 0, len = code.length; i < len; ++i) {\n lookup[i] = code[i]\n revLookup[code.charCodeAt(i)] = i\n}\n\n// Support decoding URL-safe base64 strings, as Node.js does.\n// See: https://en.wikipedia.org/wiki/Base64#URL_applications\nrevLookup['-'.charCodeAt(0)] = 62\nrevLookup['_'.charCodeAt(0)] = 63\n\nfunction getLens (b64) {\n var len = b64.length\n\n if (len % 4 > 0) {\n throw new Error('Invalid string. Length must be a multiple of 4')\n }\n\n // Trim off extra bytes after placeholder bytes are found\n // See: https://github.com/beatgammit/base64-js/issues/42\n var validLen = b64.indexOf('=')\n if (validLen === -1) validLen = len\n\n var placeHoldersLen = validLen === len\n ? 0\n : 4 - (validLen % 4)\n\n return [validLen, placeHoldersLen]\n}\n\n// base64 is 4/3 + up to two characters of the original data\nfunction byteLength (b64) {\n var lens = getLens(b64)\n var validLen = lens[0]\n var placeHoldersLen = lens[1]\n return ((validLen + placeHoldersLen) * 3 / 4) - placeHoldersLen\n}\n\nfunction _byteLength (b64, validLen, placeHoldersLen) {\n return ((validLen + placeHoldersLen) * 3 / 4) - placeHoldersLen\n}\n\nfunction toByteArray (b64) {\n var tmp\n var lens = getLens(b64)\n var validLen = lens[0]\n var placeHoldersLen = lens[1]\n\n var arr = new Arr(_byteLength(b64, validLen, placeHoldersLen))\n\n var curByte = 0\n\n // if there are placeholders, only get up to the last complete 4 chars\n var len = placeHoldersLen > 0\n ? validLen - 4\n : validLen\n\n var i\n for (i = 0; i < len; i += 4) {\n tmp =\n (revLookup[b64.charCodeAt(i)] << 18) |\n (revLookup[b64.charCodeAt(i + 1)] << 12) |\n (revLookup[b64.charCodeAt(i + 2)] << 6) |\n revLookup[b64.charCodeAt(i + 3)]\n arr[curByte++] = (tmp >> 16) & 0xFF\n arr[curByte++] = (tmp >> 8) & 0xFF\n arr[curByte++] = tmp & 0xFF\n }\n\n if (placeHoldersLen === 2) {\n tmp =\n (revLookup[b64.charCodeAt(i)] << 2) |\n (revLookup[b64.charCodeAt(i + 1)] >> 4)\n arr[curByte++] = tmp & 0xFF\n }\n\n if (placeHoldersLen === 1) {\n tmp =\n (revLookup[b64.charCodeAt(i)] << 10) |\n (revLookup[b64.charCodeAt(i + 1)] << 4) |\n (revLookup[b64.charCodeAt(i + 2)] >> 2)\n arr[curByte++] = (tmp >> 8) & 0xFF\n arr[curByte++] = tmp & 0xFF\n }\n\n return arr\n}\n\nfunction tripletToBase64 (num) {\n return lookup[num >> 18 & 0x3F] +\n lookup[num >> 12 & 0x3F] +\n lookup[num >> 6 & 0x3F] +\n lookup[num & 0x3F]\n}\n\nfunction encodeChunk (uint8, start, end) {\n var tmp\n var output = []\n for (var i = start; i < end; i += 3) {\n tmp =\n ((uint8[i] << 16) & 0xFF0000) +\n ((uint8[i + 1] << 8) & 0xFF00) +\n (uint8[i + 2] & 0xFF)\n output.push(tripletToBase64(tmp))\n }\n return output.join('')\n}\n\nfunction fromByteArray (uint8) {\n var tmp\n var len = uint8.length\n var extraBytes = len % 3 // if we have 1 byte left, pad 2 bytes\n var parts = []\n var maxChunkLength = 16383 // must be multiple of 3\n\n // go through the array every three bytes, we'll deal with trailing stuff later\n for (var i = 0, len2 = len - extraBytes; i < len2; i += maxChunkLength) {\n parts.push(encodeChunk(uint8, i, (i + maxChunkLength) > len2 ? len2 : (i + maxChunkLength)))\n }\n\n // pad the end with zeros, but make sure to not forget the extra bytes\n if (extraBytes === 1) {\n tmp = uint8[len - 1]\n parts.push(\n lookup[tmp >> 2] +\n lookup[(tmp << 4) & 0x3F] +\n '=='\n )\n } else if (extraBytes === 2) {\n tmp = (uint8[len - 2] << 8) + uint8[len - 1]\n parts.push(\n lookup[tmp >> 10] +\n lookup[(tmp >> 4) & 0x3F] +\n lookup[(tmp << 2) & 0x3F] +\n '='\n )\n }\n\n return parts.join('')\n}\n","/*!\n * The buffer module from node.js, for the browser.\n *\n * @author Feross Aboukhadijeh \n * @license MIT\n */\n/* eslint-disable no-proto */\n\n'use strict'\n\nconst base64 = require('base64-js')\nconst ieee754 = require('ieee754')\nconst customInspectSymbol =\n (typeof Symbol === 'function' && typeof Symbol['for'] === 'function') // eslint-disable-line dot-notation\n ? Symbol['for']('nodejs.util.inspect.custom') // eslint-disable-line dot-notation\n : null\n\nexports.Buffer = Buffer\nexports.SlowBuffer = SlowBuffer\nexports.INSPECT_MAX_BYTES = 50\n\nconst K_MAX_LENGTH = 0x7fffffff\nexports.kMaxLength = K_MAX_LENGTH\n\n/**\n * If `Buffer.TYPED_ARRAY_SUPPORT`:\n * === true Use Uint8Array implementation (fastest)\n * === false Print warning and recommend using `buffer` v4.x which has an Object\n * implementation (most compatible, even IE6)\n *\n * Browsers that support typed arrays are IE 10+, Firefox 4+, Chrome 7+, Safari 5.1+,\n * Opera 11.6+, iOS 4.2+.\n *\n * We report that the browser does not support typed arrays if the are not subclassable\n * using __proto__. Firefox 4-29 lacks support for adding new properties to `Uint8Array`\n * (See: https://bugzilla.mozilla.org/show_bug.cgi?id=695438). IE 10 lacks support\n * for __proto__ and has a buggy typed array implementation.\n */\nBuffer.TYPED_ARRAY_SUPPORT = typedArraySupport()\n\nif (!Buffer.TYPED_ARRAY_SUPPORT && typeof console !== 'undefined' &&\n typeof console.error === 'function') {\n console.error(\n 'This browser lacks typed array (Uint8Array) support which is required by ' +\n '`buffer` v5.x. Use `buffer` v4.x if you require old browser support.'\n )\n}\n\nfunction typedArraySupport () {\n // Can typed array instances can be augmented?\n try {\n const arr = new Uint8Array(1)\n const proto = { foo: function () { return 42 } }\n Object.setPrototypeOf(proto, Uint8Array.prototype)\n Object.setPrototypeOf(arr, proto)\n return arr.foo() === 42\n } catch (e) {\n return false\n }\n}\n\nObject.defineProperty(Buffer.prototype, 'parent', {\n enumerable: true,\n get: function () {\n if (!Buffer.isBuffer(this)) return undefined\n return this.buffer\n }\n})\n\nObject.defineProperty(Buffer.prototype, 'offset', {\n enumerable: true,\n get: function () {\n if (!Buffer.isBuffer(this)) return undefined\n return this.byteOffset\n }\n})\n\nfunction createBuffer (length) {\n if (length > K_MAX_LENGTH) {\n throw new RangeError('The value \"' + length + '\" is invalid for option \"size\"')\n }\n // Return an augmented `Uint8Array` instance\n const buf = new Uint8Array(length)\n Object.setPrototypeOf(buf, Buffer.prototype)\n return buf\n}\n\n/**\n * The Buffer constructor returns instances of `Uint8Array` that have their\n * prototype changed to `Buffer.prototype`. Furthermore, `Buffer` is a subclass of\n * `Uint8Array`, so the returned instances will have all the node `Buffer` methods\n * and the `Uint8Array` methods. Square bracket notation works as expected -- it\n * returns a single octet.\n *\n * The `Uint8Array` prototype remains unmodified.\n */\n\nfunction Buffer (arg, encodingOrOffset, length) {\n // Common case.\n if (typeof arg === 'number') {\n if (typeof encodingOrOffset === 'string') {\n throw new TypeError(\n 'The \"string\" argument must be of type string. Received type number'\n )\n }\n return allocUnsafe(arg)\n }\n return from(arg, encodingOrOffset, length)\n}\n\nBuffer.poolSize = 8192 // not used by this implementation\n\nfunction from (value, encodingOrOffset, length) {\n if (typeof value === 'string') {\n return fromString(value, encodingOrOffset)\n }\n\n if (ArrayBuffer.isView(value)) {\n return fromArrayView(value)\n }\n\n if (value == null) {\n throw new TypeError(\n 'The first argument must be one of type string, Buffer, ArrayBuffer, Array, ' +\n 'or Array-like Object. Received type ' + (typeof value)\n )\n }\n\n if (isInstance(value, ArrayBuffer) ||\n (value && isInstance(value.buffer, ArrayBuffer))) {\n return fromArrayBuffer(value, encodingOrOffset, length)\n }\n\n if (typeof SharedArrayBuffer !== 'undefined' &&\n (isInstance(value, SharedArrayBuffer) ||\n (value && isInstance(value.buffer, SharedArrayBuffer)))) {\n return fromArrayBuffer(value, encodingOrOffset, length)\n }\n\n if (typeof value === 'number') {\n throw new TypeError(\n 'The \"value\" argument must not be of type number. Received type number'\n )\n }\n\n const valueOf = value.valueOf && value.valueOf()\n if (valueOf != null && valueOf !== value) {\n return Buffer.from(valueOf, encodingOrOffset, length)\n }\n\n const b = fromObject(value)\n if (b) return b\n\n if (typeof Symbol !== 'undefined' && Symbol.toPrimitive != null &&\n typeof value[Symbol.toPrimitive] === 'function') {\n return Buffer.from(value[Symbol.toPrimitive]('string'), encodingOrOffset, length)\n }\n\n throw new TypeError(\n 'The first argument must be one of type string, Buffer, ArrayBuffer, Array, ' +\n 'or Array-like Object. Received type ' + (typeof value)\n )\n}\n\n/**\n * Functionally equivalent to Buffer(arg, encoding) but throws a TypeError\n * if value is a number.\n * Buffer.from(str[, encoding])\n * Buffer.from(array)\n * Buffer.from(buffer)\n * Buffer.from(arrayBuffer[, byteOffset[, length]])\n **/\nBuffer.from = function (value, encodingOrOffset, length) {\n return from(value, encodingOrOffset, length)\n}\n\n// Note: Change prototype *after* Buffer.from is defined to workaround Chrome bug:\n// https://github.com/feross/buffer/pull/148\nObject.setPrototypeOf(Buffer.prototype, Uint8Array.prototype)\nObject.setPrototypeOf(Buffer, Uint8Array)\n\nfunction assertSize (size) {\n if (typeof size !== 'number') {\n throw new TypeError('\"size\" argument must be of type number')\n } else if (size < 0) {\n throw new RangeError('The value \"' + size + '\" is invalid for option \"size\"')\n }\n}\n\nfunction alloc (size, fill, encoding) {\n assertSize(size)\n if (size <= 0) {\n return createBuffer(size)\n }\n if (fill !== undefined) {\n // Only pay attention to encoding if it's a string. This\n // prevents accidentally sending in a number that would\n // be interpreted as a start offset.\n return typeof encoding === 'string'\n ? createBuffer(size).fill(fill, encoding)\n : createBuffer(size).fill(fill)\n }\n return createBuffer(size)\n}\n\n/**\n * Creates a new filled Buffer instance.\n * alloc(size[, fill[, encoding]])\n **/\nBuffer.alloc = function (size, fill, encoding) {\n return alloc(size, fill, encoding)\n}\n\nfunction allocUnsafe (size) {\n assertSize(size)\n return createBuffer(size < 0 ? 0 : checked(size) | 0)\n}\n\n/**\n * Equivalent to Buffer(num), by default creates a non-zero-filled Buffer instance.\n * */\nBuffer.allocUnsafe = function (size) {\n return allocUnsafe(size)\n}\n/**\n * Equivalent to SlowBuffer(num), by default creates a non-zero-filled Buffer instance.\n */\nBuffer.allocUnsafeSlow = function (size) {\n return allocUnsafe(size)\n}\n\nfunction fromString (string, encoding) {\n if (typeof encoding !== 'string' || encoding === '') {\n encoding = 'utf8'\n }\n\n if (!Buffer.isEncoding(encoding)) {\n throw new TypeError('Unknown encoding: ' + encoding)\n }\n\n const length = byteLength(string, encoding) | 0\n let buf = createBuffer(length)\n\n const actual = buf.write(string, encoding)\n\n if (actual !== length) {\n // Writing a hex string, for example, that contains invalid characters will\n // cause everything after the first invalid character to be ignored. (e.g.\n // 'abxxcd' will be treated as 'ab')\n buf = buf.slice(0, actual)\n }\n\n return buf\n}\n\nfunction fromArrayLike (array) {\n const length = array.length < 0 ? 0 : checked(array.length) | 0\n const buf = createBuffer(length)\n for (let i = 0; i < length; i += 1) {\n buf[i] = array[i] & 255\n }\n return buf\n}\n\nfunction fromArrayView (arrayView) {\n if (isInstance(arrayView, Uint8Array)) {\n const copy = new Uint8Array(arrayView)\n return fromArrayBuffer(copy.buffer, copy.byteOffset, copy.byteLength)\n }\n return fromArrayLike(arrayView)\n}\n\nfunction fromArrayBuffer (array, byteOffset, length) {\n if (byteOffset < 0 || array.byteLength < byteOffset) {\n throw new RangeError('\"offset\" is outside of buffer bounds')\n }\n\n if (array.byteLength < byteOffset + (length || 0)) {\n throw new RangeError('\"length\" is outside of buffer bounds')\n }\n\n let buf\n if (byteOffset === undefined && length === undefined) {\n buf = new Uint8Array(array)\n } else if (length === undefined) {\n buf = new Uint8Array(array, byteOffset)\n } else {\n buf = new Uint8Array(array, byteOffset, length)\n }\n\n // Return an augmented `Uint8Array` instance\n Object.setPrototypeOf(buf, Buffer.prototype)\n\n return buf\n}\n\nfunction fromObject (obj) {\n if (Buffer.isBuffer(obj)) {\n const len = checked(obj.length) | 0\n const buf = createBuffer(len)\n\n if (buf.length === 0) {\n return buf\n }\n\n obj.copy(buf, 0, 0, len)\n return buf\n }\n\n if (obj.length !== undefined) {\n if (typeof obj.length !== 'number' || numberIsNaN(obj.length)) {\n return createBuffer(0)\n }\n return fromArrayLike(obj)\n }\n\n if (obj.type === 'Buffer' && Array.isArray(obj.data)) {\n return fromArrayLike(obj.data)\n }\n}\n\nfunction checked (length) {\n // Note: cannot use `length < K_MAX_LENGTH` here because that fails when\n // length is NaN (which is otherwise coerced to zero.)\n if (length >= K_MAX_LENGTH) {\n throw new RangeError('Attempt to allocate Buffer larger than maximum ' +\n 'size: 0x' + K_MAX_LENGTH.toString(16) + ' bytes')\n }\n return length | 0\n}\n\nfunction SlowBuffer (length) {\n if (+length != length) { // eslint-disable-line eqeqeq\n length = 0\n }\n return Buffer.alloc(+length)\n}\n\nBuffer.isBuffer = function isBuffer (b) {\n return b != null && b._isBuffer === true &&\n b !== Buffer.prototype // so Buffer.isBuffer(Buffer.prototype) will be false\n}\n\nBuffer.compare = function compare (a, b) {\n if (isInstance(a, Uint8Array)) a = Buffer.from(a, a.offset, a.byteLength)\n if (isInstance(b, Uint8Array)) b = Buffer.from(b, b.offset, b.byteLength)\n if (!Buffer.isBuffer(a) || !Buffer.isBuffer(b)) {\n throw new TypeError(\n 'The \"buf1\", \"buf2\" arguments must be one of type Buffer or Uint8Array'\n )\n }\n\n if (a === b) return 0\n\n let x = a.length\n let y = b.length\n\n for (let i = 0, len = Math.min(x, y); i < len; ++i) {\n if (a[i] !== b[i]) {\n x = a[i]\n y = b[i]\n break\n }\n }\n\n if (x < y) return -1\n if (y < x) return 1\n return 0\n}\n\nBuffer.isEncoding = function isEncoding (encoding) {\n switch (String(encoding).toLowerCase()) {\n case 'hex':\n case 'utf8':\n case 'utf-8':\n case 'ascii':\n case 'latin1':\n case 'binary':\n case 'base64':\n case 'ucs2':\n case 'ucs-2':\n case 'utf16le':\n case 'utf-16le':\n return true\n default:\n return false\n }\n}\n\nBuffer.concat = function concat (list, length) {\n if (!Array.isArray(list)) {\n throw new TypeError('\"list\" argument must be an Array of Buffers')\n }\n\n if (list.length === 0) {\n return Buffer.alloc(0)\n }\n\n let i\n if (length === undefined) {\n length = 0\n for (i = 0; i < list.length; ++i) {\n length += list[i].length\n }\n }\n\n const buffer = Buffer.allocUnsafe(length)\n let pos = 0\n for (i = 0; i < list.length; ++i) {\n let buf = list[i]\n if (isInstance(buf, Uint8Array)) {\n if (pos + buf.length > buffer.length) {\n if (!Buffer.isBuffer(buf)) buf = Buffer.from(buf)\n buf.copy(buffer, pos)\n } else {\n Uint8Array.prototype.set.call(\n buffer,\n buf,\n pos\n )\n }\n } else if (!Buffer.isBuffer(buf)) {\n throw new TypeError('\"list\" argument must be an Array of Buffers')\n } else {\n buf.copy(buffer, pos)\n }\n pos += buf.length\n }\n return buffer\n}\n\nfunction byteLength (string, encoding) {\n if (Buffer.isBuffer(string)) {\n return string.length\n }\n if (ArrayBuffer.isView(string) || isInstance(string, ArrayBuffer)) {\n return string.byteLength\n }\n if (typeof string !== 'string') {\n throw new TypeError(\n 'The \"string\" argument must be one of type string, Buffer, or ArrayBuffer. ' +\n 'Received type ' + typeof string\n )\n }\n\n const len = string.length\n const mustMatch = (arguments.length > 2 && arguments[2] === true)\n if (!mustMatch && len === 0) return 0\n\n // Use a for loop to avoid recursion\n let loweredCase = false\n for (;;) {\n switch (encoding) {\n case 'ascii':\n case 'latin1':\n case 'binary':\n return len\n case 'utf8':\n case 'utf-8':\n return utf8ToBytes(string).length\n case 'ucs2':\n case 'ucs-2':\n case 'utf16le':\n case 'utf-16le':\n return len * 2\n case 'hex':\n return len >>> 1\n case 'base64':\n return base64ToBytes(string).length\n default:\n if (loweredCase) {\n return mustMatch ? -1 : utf8ToBytes(string).length // assume utf8\n }\n encoding = ('' + encoding).toLowerCase()\n loweredCase = true\n }\n }\n}\nBuffer.byteLength = byteLength\n\nfunction slowToString (encoding, start, end) {\n let loweredCase = false\n\n // No need to verify that \"this.length <= MAX_UINT32\" since it's a read-only\n // property of a typed array.\n\n // This behaves neither like String nor Uint8Array in that we set start/end\n // to their upper/lower bounds if the value passed is out of range.\n // undefined is handled specially as per ECMA-262 6th Edition,\n // Section 13.3.3.7 Runtime Semantics: KeyedBindingInitialization.\n if (start === undefined || start < 0) {\n start = 0\n }\n // Return early if start > this.length. Done here to prevent potential uint32\n // coercion fail below.\n if (start > this.length) {\n return ''\n }\n\n if (end === undefined || end > this.length) {\n end = this.length\n }\n\n if (end <= 0) {\n return ''\n }\n\n // Force coercion to uint32. This will also coerce falsey/NaN values to 0.\n end >>>= 0\n start >>>= 0\n\n if (end <= start) {\n return ''\n }\n\n if (!encoding) encoding = 'utf8'\n\n while (true) {\n switch (encoding) {\n case 'hex':\n return hexSlice(this, start, end)\n\n case 'utf8':\n case 'utf-8':\n return utf8Slice(this, start, end)\n\n case 'ascii':\n return asciiSlice(this, start, end)\n\n case 'latin1':\n case 'binary':\n return latin1Slice(this, start, end)\n\n case 'base64':\n return base64Slice(this, start, end)\n\n case 'ucs2':\n case 'ucs-2':\n case 'utf16le':\n case 'utf-16le':\n return utf16leSlice(this, start, end)\n\n default:\n if (loweredCase) throw new TypeError('Unknown encoding: ' + encoding)\n encoding = (encoding + '').toLowerCase()\n loweredCase = true\n }\n }\n}\n\n// This property is used by `Buffer.isBuffer` (and the `is-buffer` npm package)\n// to detect a Buffer instance. It's not possible to use `instanceof Buffer`\n// reliably in a browserify context because there could be multiple different\n// copies of the 'buffer' package in use. This method works even for Buffer\n// instances that were created from another copy of the `buffer` package.\n// See: https://github.com/feross/buffer/issues/154\nBuffer.prototype._isBuffer = true\n\nfunction swap (b, n, m) {\n const i = b[n]\n b[n] = b[m]\n b[m] = i\n}\n\nBuffer.prototype.swap16 = function swap16 () {\n const len = this.length\n if (len % 2 !== 0) {\n throw new RangeError('Buffer size must be a multiple of 16-bits')\n }\n for (let i = 0; i < len; i += 2) {\n swap(this, i, i + 1)\n }\n return this\n}\n\nBuffer.prototype.swap32 = function swap32 () {\n const len = this.length\n if (len % 4 !== 0) {\n throw new RangeError('Buffer size must be a multiple of 32-bits')\n }\n for (let i = 0; i < len; i += 4) {\n swap(this, i, i + 3)\n swap(this, i + 1, i + 2)\n }\n return this\n}\n\nBuffer.prototype.swap64 = function swap64 () {\n const len = this.length\n if (len % 8 !== 0) {\n throw new RangeError('Buffer size must be a multiple of 64-bits')\n }\n for (let i = 0; i < len; i += 8) {\n swap(this, i, i + 7)\n swap(this, i + 1, i + 6)\n swap(this, i + 2, i + 5)\n swap(this, i + 3, i + 4)\n }\n return this\n}\n\nBuffer.prototype.toString = function toString () {\n const length = this.length\n if (length === 0) return ''\n if (arguments.length === 0) return utf8Slice(this, 0, length)\n return slowToString.apply(this, arguments)\n}\n\nBuffer.prototype.toLocaleString = Buffer.prototype.toString\n\nBuffer.prototype.equals = function equals (b) {\n if (!Buffer.isBuffer(b)) throw new TypeError('Argument must be a Buffer')\n if (this === b) return true\n return Buffer.compare(this, b) === 0\n}\n\nBuffer.prototype.inspect = function inspect () {\n let str = ''\n const max = exports.INSPECT_MAX_BYTES\n str = this.toString('hex', 0, max).replace(/(.{2})/g, '$1 ').trim()\n if (this.length > max) str += ' ... '\n return ''\n}\nif (customInspectSymbol) {\n Buffer.prototype[customInspectSymbol] = Buffer.prototype.inspect\n}\n\nBuffer.prototype.compare = function compare (target, start, end, thisStart, thisEnd) {\n if (isInstance(target, Uint8Array)) {\n target = Buffer.from(target, target.offset, target.byteLength)\n }\n if (!Buffer.isBuffer(target)) {\n throw new TypeError(\n 'The \"target\" argument must be one of type Buffer or Uint8Array. ' +\n 'Received type ' + (typeof target)\n )\n }\n\n if (start === undefined) {\n start = 0\n }\n if (end === undefined) {\n end = target ? target.length : 0\n }\n if (thisStart === undefined) {\n thisStart = 0\n }\n if (thisEnd === undefined) {\n thisEnd = this.length\n }\n\n if (start < 0 || end > target.length || thisStart < 0 || thisEnd > this.length) {\n throw new RangeError('out of range index')\n }\n\n if (thisStart >= thisEnd && start >= end) {\n return 0\n }\n if (thisStart >= thisEnd) {\n return -1\n }\n if (start >= end) {\n return 1\n }\n\n start >>>= 0\n end >>>= 0\n thisStart >>>= 0\n thisEnd >>>= 0\n\n if (this === target) return 0\n\n let x = thisEnd - thisStart\n let y = end - start\n const len = Math.min(x, y)\n\n const thisCopy = this.slice(thisStart, thisEnd)\n const targetCopy = target.slice(start, end)\n\n for (let i = 0; i < len; ++i) {\n if (thisCopy[i] !== targetCopy[i]) {\n x = thisCopy[i]\n y = targetCopy[i]\n break\n }\n }\n\n if (x < y) return -1\n if (y < x) return 1\n return 0\n}\n\n// Finds either the first index of `val` in `buffer` at offset >= `byteOffset`,\n// OR the last index of `val` in `buffer` at offset <= `byteOffset`.\n//\n// Arguments:\n// - buffer - a Buffer to search\n// - val - a string, Buffer, or number\n// - byteOffset - an index into `buffer`; will be clamped to an int32\n// - encoding - an optional encoding, relevant is val is a string\n// - dir - true for indexOf, false for lastIndexOf\nfunction bidirectionalIndexOf (buffer, val, byteOffset, encoding, dir) {\n // Empty buffer means no match\n if (buffer.length === 0) return -1\n\n // Normalize byteOffset\n if (typeof byteOffset === 'string') {\n encoding = byteOffset\n byteOffset = 0\n } else if (byteOffset > 0x7fffffff) {\n byteOffset = 0x7fffffff\n } else if (byteOffset < -0x80000000) {\n byteOffset = -0x80000000\n }\n byteOffset = +byteOffset // Coerce to Number.\n if (numberIsNaN(byteOffset)) {\n // byteOffset: it it's undefined, null, NaN, \"foo\", etc, search whole buffer\n byteOffset = dir ? 0 : (buffer.length - 1)\n }\n\n // Normalize byteOffset: negative offsets start from the end of the buffer\n if (byteOffset < 0) byteOffset = buffer.length + byteOffset\n if (byteOffset >= buffer.length) {\n if (dir) return -1\n else byteOffset = buffer.length - 1\n } else if (byteOffset < 0) {\n if (dir) byteOffset = 0\n else return -1\n }\n\n // Normalize val\n if (typeof val === 'string') {\n val = Buffer.from(val, encoding)\n }\n\n // Finally, search either indexOf (if dir is true) or lastIndexOf\n if (Buffer.isBuffer(val)) {\n // Special case: looking for empty string/buffer always fails\n if (val.length === 0) {\n return -1\n }\n return arrayIndexOf(buffer, val, byteOffset, encoding, dir)\n } else if (typeof val === 'number') {\n val = val & 0xFF // Search for a byte value [0-255]\n if (typeof Uint8Array.prototype.indexOf === 'function') {\n if (dir) {\n return Uint8Array.prototype.indexOf.call(buffer, val, byteOffset)\n } else {\n return Uint8Array.prototype.lastIndexOf.call(buffer, val, byteOffset)\n }\n }\n return arrayIndexOf(buffer, [val], byteOffset, encoding, dir)\n }\n\n throw new TypeError('val must be string, number or Buffer')\n}\n\nfunction arrayIndexOf (arr, val, byteOffset, encoding, dir) {\n let indexSize = 1\n let arrLength = arr.length\n let valLength = val.length\n\n if (encoding !== undefined) {\n encoding = String(encoding).toLowerCase()\n if (encoding === 'ucs2' || encoding === 'ucs-2' ||\n encoding === 'utf16le' || encoding === 'utf-16le') {\n if (arr.length < 2 || val.length < 2) {\n return -1\n }\n indexSize = 2\n arrLength /= 2\n valLength /= 2\n byteOffset /= 2\n }\n }\n\n function read (buf, i) {\n if (indexSize === 1) {\n return buf[i]\n } else {\n return buf.readUInt16BE(i * indexSize)\n }\n }\n\n let i\n if (dir) {\n let foundIndex = -1\n for (i = byteOffset; i < arrLength; i++) {\n if (read(arr, i) === read(val, foundIndex === -1 ? 0 : i - foundIndex)) {\n if (foundIndex === -1) foundIndex = i\n if (i - foundIndex + 1 === valLength) return foundIndex * indexSize\n } else {\n if (foundIndex !== -1) i -= i - foundIndex\n foundIndex = -1\n }\n }\n } else {\n if (byteOffset + valLength > arrLength) byteOffset = arrLength - valLength\n for (i = byteOffset; i >= 0; i--) {\n let found = true\n for (let j = 0; j < valLength; j++) {\n if (read(arr, i + j) !== read(val, j)) {\n found = false\n break\n }\n }\n if (found) return i\n }\n }\n\n return -1\n}\n\nBuffer.prototype.includes = function includes (val, byteOffset, encoding) {\n return this.indexOf(val, byteOffset, encoding) !== -1\n}\n\nBuffer.prototype.indexOf = function indexOf (val, byteOffset, encoding) {\n return bidirectionalIndexOf(this, val, byteOffset, encoding, true)\n}\n\nBuffer.prototype.lastIndexOf = function lastIndexOf (val, byteOffset, encoding) {\n return bidirectionalIndexOf(this, val, byteOffset, encoding, false)\n}\n\nfunction hexWrite (buf, string, offset, length) {\n offset = Number(offset) || 0\n const remaining = buf.length - offset\n if (!length) {\n length = remaining\n } else {\n length = Number(length)\n if (length > remaining) {\n length = remaining\n }\n }\n\n const strLen = string.length\n\n if (length > strLen / 2) {\n length = strLen / 2\n }\n let i\n for (i = 0; i < length; ++i) {\n const parsed = parseInt(string.substr(i * 2, 2), 16)\n if (numberIsNaN(parsed)) return i\n buf[offset + i] = parsed\n }\n return i\n}\n\nfunction utf8Write (buf, string, offset, length) {\n return blitBuffer(utf8ToBytes(string, buf.length - offset), buf, offset, length)\n}\n\nfunction asciiWrite (buf, string, offset, length) {\n return blitBuffer(asciiToBytes(string), buf, offset, length)\n}\n\nfunction base64Write (buf, string, offset, length) {\n return blitBuffer(base64ToBytes(string), buf, offset, length)\n}\n\nfunction ucs2Write (buf, string, offset, length) {\n return blitBuffer(utf16leToBytes(string, buf.length - offset), buf, offset, length)\n}\n\nBuffer.prototype.write = function write (string, offset, length, encoding) {\n // Buffer#write(string)\n if (offset === undefined) {\n encoding = 'utf8'\n length = this.length\n offset = 0\n // Buffer#write(string, encoding)\n } else if (length === undefined && typeof offset === 'string') {\n encoding = offset\n length = this.length\n offset = 0\n // Buffer#write(string, offset[, length][, encoding])\n } else if (isFinite(offset)) {\n offset = offset >>> 0\n if (isFinite(length)) {\n length = length >>> 0\n if (encoding === undefined) encoding = 'utf8'\n } else {\n encoding = length\n length = undefined\n }\n } else {\n throw new Error(\n 'Buffer.write(string, encoding, offset[, length]) is no longer supported'\n )\n }\n\n const remaining = this.length - offset\n if (length === undefined || length > remaining) length = remaining\n\n if ((string.length > 0 && (length < 0 || offset < 0)) || offset > this.length) {\n throw new RangeError('Attempt to write outside buffer bounds')\n }\n\n if (!encoding) encoding = 'utf8'\n\n let loweredCase = false\n for (;;) {\n switch (encoding) {\n case 'hex':\n return hexWrite(this, string, offset, length)\n\n case 'utf8':\n case 'utf-8':\n return utf8Write(this, string, offset, length)\n\n case 'ascii':\n case 'latin1':\n case 'binary':\n return asciiWrite(this, string, offset, length)\n\n case 'base64':\n // Warning: maxLength not taken into account in base64Write\n return base64Write(this, string, offset, length)\n\n case 'ucs2':\n case 'ucs-2':\n case 'utf16le':\n case 'utf-16le':\n return ucs2Write(this, string, offset, length)\n\n default:\n if (loweredCase) throw new TypeError('Unknown encoding: ' + encoding)\n encoding = ('' + encoding).toLowerCase()\n loweredCase = true\n }\n }\n}\n\nBuffer.prototype.toJSON = function toJSON () {\n return {\n type: 'Buffer',\n data: Array.prototype.slice.call(this._arr || this, 0)\n }\n}\n\nfunction base64Slice (buf, start, end) {\n if (start === 0 && end === buf.length) {\n return base64.fromByteArray(buf)\n } else {\n return base64.fromByteArray(buf.slice(start, end))\n }\n}\n\nfunction utf8Slice (buf, start, end) {\n end = Math.min(buf.length, end)\n const res = []\n\n let i = start\n while (i < end) {\n const firstByte = buf[i]\n let codePoint = null\n let bytesPerSequence = (firstByte > 0xEF)\n ? 4\n : (firstByte > 0xDF)\n ? 3\n : (firstByte > 0xBF)\n ? 2\n : 1\n\n if (i + bytesPerSequence <= end) {\n let secondByte, thirdByte, fourthByte, tempCodePoint\n\n switch (bytesPerSequence) {\n case 1:\n if (firstByte < 0x80) {\n codePoint = firstByte\n }\n break\n case 2:\n secondByte = buf[i + 1]\n if ((secondByte & 0xC0) === 0x80) {\n tempCodePoint = (firstByte & 0x1F) << 0x6 | (secondByte & 0x3F)\n if (tempCodePoint > 0x7F) {\n codePoint = tempCodePoint\n }\n }\n break\n case 3:\n secondByte = buf[i + 1]\n thirdByte = buf[i + 2]\n if ((secondByte & 0xC0) === 0x80 && (thirdByte & 0xC0) === 0x80) {\n tempCodePoint = (firstByte & 0xF) << 0xC | (secondByte & 0x3F) << 0x6 | (thirdByte & 0x3F)\n if (tempCodePoint > 0x7FF && (tempCodePoint < 0xD800 || tempCodePoint > 0xDFFF)) {\n codePoint = tempCodePoint\n }\n }\n break\n case 4:\n secondByte = buf[i + 1]\n thirdByte = buf[i + 2]\n fourthByte = buf[i + 3]\n if ((secondByte & 0xC0) === 0x80 && (thirdByte & 0xC0) === 0x80 && (fourthByte & 0xC0) === 0x80) {\n tempCodePoint = (firstByte & 0xF) << 0x12 | (secondByte & 0x3F) << 0xC | (thirdByte & 0x3F) << 0x6 | (fourthByte & 0x3F)\n if (tempCodePoint > 0xFFFF && tempCodePoint < 0x110000) {\n codePoint = tempCodePoint\n }\n }\n }\n }\n\n if (codePoint === null) {\n // we did not generate a valid codePoint so insert a\n // replacement char (U+FFFD) and advance only 1 byte\n codePoint = 0xFFFD\n bytesPerSequence = 1\n } else if (codePoint > 0xFFFF) {\n // encode to utf16 (surrogate pair dance)\n codePoint -= 0x10000\n res.push(codePoint >>> 10 & 0x3FF | 0xD800)\n codePoint = 0xDC00 | codePoint & 0x3FF\n }\n\n res.push(codePoint)\n i += bytesPerSequence\n }\n\n return decodeCodePointsArray(res)\n}\n\n// Based on http://stackoverflow.com/a/22747272/680742, the browser with\n// the lowest limit is Chrome, with 0x10000 args.\n// We go 1 magnitude less, for safety\nconst MAX_ARGUMENTS_LENGTH = 0x1000\n\nfunction decodeCodePointsArray (codePoints) {\n const len = codePoints.length\n if (len <= MAX_ARGUMENTS_LENGTH) {\n return String.fromCharCode.apply(String, codePoints) // avoid extra slice()\n }\n\n // Decode in chunks to avoid \"call stack size exceeded\".\n let res = ''\n let i = 0\n while (i < len) {\n res += String.fromCharCode.apply(\n String,\n codePoints.slice(i, i += MAX_ARGUMENTS_LENGTH)\n )\n }\n return res\n}\n\nfunction asciiSlice (buf, start, end) {\n let ret = ''\n end = Math.min(buf.length, end)\n\n for (let i = start; i < end; ++i) {\n ret += String.fromCharCode(buf[i] & 0x7F)\n }\n return ret\n}\n\nfunction latin1Slice (buf, start, end) {\n let ret = ''\n end = Math.min(buf.length, end)\n\n for (let i = start; i < end; ++i) {\n ret += String.fromCharCode(buf[i])\n }\n return ret\n}\n\nfunction hexSlice (buf, start, end) {\n const len = buf.length\n\n if (!start || start < 0) start = 0\n if (!end || end < 0 || end > len) end = len\n\n let out = ''\n for (let i = start; i < end; ++i) {\n out += hexSliceLookupTable[buf[i]]\n }\n return out\n}\n\nfunction utf16leSlice (buf, start, end) {\n const bytes = buf.slice(start, end)\n let res = ''\n // If bytes.length is odd, the last 8 bits must be ignored (same as node.js)\n for (let i = 0; i < bytes.length - 1; i += 2) {\n res += String.fromCharCode(bytes[i] + (bytes[i + 1] * 256))\n }\n return res\n}\n\nBuffer.prototype.slice = function slice (start, end) {\n const len = this.length\n start = ~~start\n end = end === undefined ? len : ~~end\n\n if (start < 0) {\n start += len\n if (start < 0) start = 0\n } else if (start > len) {\n start = len\n }\n\n if (end < 0) {\n end += len\n if (end < 0) end = 0\n } else if (end > len) {\n end = len\n }\n\n if (end < start) end = start\n\n const newBuf = this.subarray(start, end)\n // Return an augmented `Uint8Array` instance\n Object.setPrototypeOf(newBuf, Buffer.prototype)\n\n return newBuf\n}\n\n/*\n * Need to make sure that buffer isn't trying to write out of bounds.\n */\nfunction checkOffset (offset, ext, length) {\n if ((offset % 1) !== 0 || offset < 0) throw new RangeError('offset is not uint')\n if (offset + ext > length) throw new RangeError('Trying to access beyond buffer length')\n}\n\nBuffer.prototype.readUintLE =\nBuffer.prototype.readUIntLE = function readUIntLE (offset, byteLength, noAssert) {\n offset = offset >>> 0\n byteLength = byteLength >>> 0\n if (!noAssert) checkOffset(offset, byteLength, this.length)\n\n let val = this[offset]\n let mul = 1\n let i = 0\n while (++i < byteLength && (mul *= 0x100)) {\n val += this[offset + i] * mul\n }\n\n return val\n}\n\nBuffer.prototype.readUintBE =\nBuffer.prototype.readUIntBE = function readUIntBE (offset, byteLength, noAssert) {\n offset = offset >>> 0\n byteLength = byteLength >>> 0\n if (!noAssert) {\n checkOffset(offset, byteLength, this.length)\n }\n\n let val = this[offset + --byteLength]\n let mul = 1\n while (byteLength > 0 && (mul *= 0x100)) {\n val += this[offset + --byteLength] * mul\n }\n\n return val\n}\n\nBuffer.prototype.readUint8 =\nBuffer.prototype.readUInt8 = function readUInt8 (offset, noAssert) {\n offset = offset >>> 0\n if (!noAssert) checkOffset(offset, 1, this.length)\n return this[offset]\n}\n\nBuffer.prototype.readUint16LE =\nBuffer.prototype.readUInt16LE = function readUInt16LE (offset, noAssert) {\n offset = offset >>> 0\n if (!noAssert) checkOffset(offset, 2, this.length)\n return this[offset] | (this[offset + 1] << 8)\n}\n\nBuffer.prototype.readUint16BE =\nBuffer.prototype.readUInt16BE = function readUInt16BE (offset, noAssert) {\n offset = offset >>> 0\n if (!noAssert) checkOffset(offset, 2, this.length)\n return (this[offset] << 8) | this[offset + 1]\n}\n\nBuffer.prototype.readUint32LE =\nBuffer.prototype.readUInt32LE = function readUInt32LE (offset, noAssert) {\n offset = offset >>> 0\n if (!noAssert) checkOffset(offset, 4, this.length)\n\n return ((this[offset]) |\n (this[offset + 1] << 8) |\n (this[offset + 2] << 16)) +\n (this[offset + 3] * 0x1000000)\n}\n\nBuffer.prototype.readUint32BE =\nBuffer.prototype.readUInt32BE = function readUInt32BE (offset, noAssert) {\n offset = offset >>> 0\n if (!noAssert) checkOffset(offset, 4, this.length)\n\n return (this[offset] * 0x1000000) +\n ((this[offset + 1] << 16) |\n (this[offset + 2] << 8) |\n this[offset + 3])\n}\n\nBuffer.prototype.readBigUInt64LE = defineBigIntMethod(function readBigUInt64LE (offset) {\n offset = offset >>> 0\n validateNumber(offset, 'offset')\n const first = this[offset]\n const last = this[offset + 7]\n if (first === undefined || last === undefined) {\n boundsError(offset, this.length - 8)\n }\n\n const lo = first +\n this[++offset] * 2 ** 8 +\n this[++offset] * 2 ** 16 +\n this[++offset] * 2 ** 24\n\n const hi = this[++offset] +\n this[++offset] * 2 ** 8 +\n this[++offset] * 2 ** 16 +\n last * 2 ** 24\n\n return BigInt(lo) + (BigInt(hi) << BigInt(32))\n})\n\nBuffer.prototype.readBigUInt64BE = defineBigIntMethod(function readBigUInt64BE (offset) {\n offset = offset >>> 0\n validateNumber(offset, 'offset')\n const first = this[offset]\n const last = this[offset + 7]\n if (first === undefined || last === undefined) {\n boundsError(offset, this.length - 8)\n }\n\n const hi = first * 2 ** 24 +\n this[++offset] * 2 ** 16 +\n this[++offset] * 2 ** 8 +\n this[++offset]\n\n const lo = this[++offset] * 2 ** 24 +\n this[++offset] * 2 ** 16 +\n this[++offset] * 2 ** 8 +\n last\n\n return (BigInt(hi) << BigInt(32)) + BigInt(lo)\n})\n\nBuffer.prototype.readIntLE = function readIntLE (offset, byteLength, noAssert) {\n offset = offset >>> 0\n byteLength = byteLength >>> 0\n if (!noAssert) checkOffset(offset, byteLength, this.length)\n\n let val = this[offset]\n let mul = 1\n let i = 0\n while (++i < byteLength && (mul *= 0x100)) {\n val += this[offset + i] * mul\n }\n mul *= 0x80\n\n if (val >= mul) val -= Math.pow(2, 8 * byteLength)\n\n return val\n}\n\nBuffer.prototype.readIntBE = function readIntBE (offset, byteLength, noAssert) {\n offset = offset >>> 0\n byteLength = byteLength >>> 0\n if (!noAssert) checkOffset(offset, byteLength, this.length)\n\n let i = byteLength\n let mul = 1\n let val = this[offset + --i]\n while (i > 0 && (mul *= 0x100)) {\n val += this[offset + --i] * mul\n }\n mul *= 0x80\n\n if (val >= mul) val -= Math.pow(2, 8 * byteLength)\n\n return val\n}\n\nBuffer.prototype.readInt8 = function readInt8 (offset, noAssert) {\n offset = offset >>> 0\n if (!noAssert) checkOffset(offset, 1, this.length)\n if (!(this[offset] & 0x80)) return (this[offset])\n return ((0xff - this[offset] + 1) * -1)\n}\n\nBuffer.prototype.readInt16LE = function readInt16LE (offset, noAssert) {\n offset = offset >>> 0\n if (!noAssert) checkOffset(offset, 2, this.length)\n const val = this[offset] | (this[offset + 1] << 8)\n return (val & 0x8000) ? val | 0xFFFF0000 : val\n}\n\nBuffer.prototype.readInt16BE = function readInt16BE (offset, noAssert) {\n offset = offset >>> 0\n if (!noAssert) checkOffset(offset, 2, this.length)\n const val = this[offset + 1] | (this[offset] << 8)\n return (val & 0x8000) ? val | 0xFFFF0000 : val\n}\n\nBuffer.prototype.readInt32LE = function readInt32LE (offset, noAssert) {\n offset = offset >>> 0\n if (!noAssert) checkOffset(offset, 4, this.length)\n\n return (this[offset]) |\n (this[offset + 1] << 8) |\n (this[offset + 2] << 16) |\n (this[offset + 3] << 24)\n}\n\nBuffer.prototype.readInt32BE = function readInt32BE (offset, noAssert) {\n offset = offset >>> 0\n if (!noAssert) checkOffset(offset, 4, this.length)\n\n return (this[offset] << 24) |\n (this[offset + 1] << 16) |\n (this[offset + 2] << 8) |\n (this[offset + 3])\n}\n\nBuffer.prototype.readBigInt64LE = defineBigIntMethod(function readBigInt64LE (offset) {\n offset = offset >>> 0\n validateNumber(offset, 'offset')\n const first = this[offset]\n const last = this[offset + 7]\n if (first === undefined || last === undefined) {\n boundsError(offset, this.length - 8)\n }\n\n const val = this[offset + 4] +\n this[offset + 5] * 2 ** 8 +\n this[offset + 6] * 2 ** 16 +\n (last << 24) // Overflow\n\n return (BigInt(val) << BigInt(32)) +\n BigInt(first +\n this[++offset] * 2 ** 8 +\n this[++offset] * 2 ** 16 +\n this[++offset] * 2 ** 24)\n})\n\nBuffer.prototype.readBigInt64BE = defineBigIntMethod(function readBigInt64BE (offset) {\n offset = offset >>> 0\n validateNumber(offset, 'offset')\n const first = this[offset]\n const last = this[offset + 7]\n if (first === undefined || last === undefined) {\n boundsError(offset, this.length - 8)\n }\n\n const val = (first << 24) + // Overflow\n this[++offset] * 2 ** 16 +\n this[++offset] * 2 ** 8 +\n this[++offset]\n\n return (BigInt(val) << BigInt(32)) +\n BigInt(this[++offset] * 2 ** 24 +\n this[++offset] * 2 ** 16 +\n this[++offset] * 2 ** 8 +\n last)\n})\n\nBuffer.prototype.readFloatLE = function readFloatLE (offset, noAssert) {\n offset = offset >>> 0\n if (!noAssert) checkOffset(offset, 4, this.length)\n return ieee754.read(this, offset, true, 23, 4)\n}\n\nBuffer.prototype.readFloatBE = function readFloatBE (offset, noAssert) {\n offset = offset >>> 0\n if (!noAssert) checkOffset(offset, 4, this.length)\n return ieee754.read(this, offset, false, 23, 4)\n}\n\nBuffer.prototype.readDoubleLE = function readDoubleLE (offset, noAssert) {\n offset = offset >>> 0\n if (!noAssert) checkOffset(offset, 8, this.length)\n return ieee754.read(this, offset, true, 52, 8)\n}\n\nBuffer.prototype.readDoubleBE = function readDoubleBE (offset, noAssert) {\n offset = offset >>> 0\n if (!noAssert) checkOffset(offset, 8, this.length)\n return ieee754.read(this, offset, false, 52, 8)\n}\n\nfunction checkInt (buf, value, offset, ext, max, min) {\n if (!Buffer.isBuffer(buf)) throw new TypeError('\"buffer\" argument must be a Buffer instance')\n if (value > max || value < min) throw new RangeError('\"value\" argument is out of bounds')\n if (offset + ext > buf.length) throw new RangeError('Index out of range')\n}\n\nBuffer.prototype.writeUintLE =\nBuffer.prototype.writeUIntLE = function writeUIntLE (value, offset, byteLength, noAssert) {\n value = +value\n offset = offset >>> 0\n byteLength = byteLength >>> 0\n if (!noAssert) {\n const maxBytes = Math.pow(2, 8 * byteLength) - 1\n checkInt(this, value, offset, byteLength, maxBytes, 0)\n }\n\n let mul = 1\n let i = 0\n this[offset] = value & 0xFF\n while (++i < byteLength && (mul *= 0x100)) {\n this[offset + i] = (value / mul) & 0xFF\n }\n\n return offset + byteLength\n}\n\nBuffer.prototype.writeUintBE =\nBuffer.prototype.writeUIntBE = function writeUIntBE (value, offset, byteLength, noAssert) {\n value = +value\n offset = offset >>> 0\n byteLength = byteLength >>> 0\n if (!noAssert) {\n const maxBytes = Math.pow(2, 8 * byteLength) - 1\n checkInt(this, value, offset, byteLength, maxBytes, 0)\n }\n\n let i = byteLength - 1\n let mul = 1\n this[offset + i] = value & 0xFF\n while (--i >= 0 && (mul *= 0x100)) {\n this[offset + i] = (value / mul) & 0xFF\n }\n\n return offset + byteLength\n}\n\nBuffer.prototype.writeUint8 =\nBuffer.prototype.writeUInt8 = function writeUInt8 (value, offset, noAssert) {\n value = +value\n offset = offset >>> 0\n if (!noAssert) checkInt(this, value, offset, 1, 0xff, 0)\n this[offset] = (value & 0xff)\n return offset + 1\n}\n\nBuffer.prototype.writeUint16LE =\nBuffer.prototype.writeUInt16LE = function writeUInt16LE (value, offset, noAssert) {\n value = +value\n offset = offset >>> 0\n if (!noAssert) checkInt(this, value, offset, 2, 0xffff, 0)\n this[offset] = (value & 0xff)\n this[offset + 1] = (value >>> 8)\n return offset + 2\n}\n\nBuffer.prototype.writeUint16BE =\nBuffer.prototype.writeUInt16BE = function writeUInt16BE (value, offset, noAssert) {\n value = +value\n offset = offset >>> 0\n if (!noAssert) checkInt(this, value, offset, 2, 0xffff, 0)\n this[offset] = (value >>> 8)\n this[offset + 1] = (value & 0xff)\n return offset + 2\n}\n\nBuffer.prototype.writeUint32LE =\nBuffer.prototype.writeUInt32LE = function writeUInt32LE (value, offset, noAssert) {\n value = +value\n offset = offset >>> 0\n if (!noAssert) checkInt(this, value, offset, 4, 0xffffffff, 0)\n this[offset + 3] = (value >>> 24)\n this[offset + 2] = (value >>> 16)\n this[offset + 1] = (value >>> 8)\n this[offset] = (value & 0xff)\n return offset + 4\n}\n\nBuffer.prototype.writeUint32BE =\nBuffer.prototype.writeUInt32BE = function writeUInt32BE (value, offset, noAssert) {\n value = +value\n offset = offset >>> 0\n if (!noAssert) checkInt(this, value, offset, 4, 0xffffffff, 0)\n this[offset] = (value >>> 24)\n this[offset + 1] = (value >>> 16)\n this[offset + 2] = (value >>> 8)\n this[offset + 3] = (value & 0xff)\n return offset + 4\n}\n\nfunction wrtBigUInt64LE (buf, value, offset, min, max) {\n checkIntBI(value, min, max, buf, offset, 7)\n\n let lo = Number(value & BigInt(0xffffffff))\n buf[offset++] = lo\n lo = lo >> 8\n buf[offset++] = lo\n lo = lo >> 8\n buf[offset++] = lo\n lo = lo >> 8\n buf[offset++] = lo\n let hi = Number(value >> BigInt(32) & BigInt(0xffffffff))\n buf[offset++] = hi\n hi = hi >> 8\n buf[offset++] = hi\n hi = hi >> 8\n buf[offset++] = hi\n hi = hi >> 8\n buf[offset++] = hi\n return offset\n}\n\nfunction wrtBigUInt64BE (buf, value, offset, min, max) {\n checkIntBI(value, min, max, buf, offset, 7)\n\n let lo = Number(value & BigInt(0xffffffff))\n buf[offset + 7] = lo\n lo = lo >> 8\n buf[offset + 6] = lo\n lo = lo >> 8\n buf[offset + 5] = lo\n lo = lo >> 8\n buf[offset + 4] = lo\n let hi = Number(value >> BigInt(32) & BigInt(0xffffffff))\n buf[offset + 3] = hi\n hi = hi >> 8\n buf[offset + 2] = hi\n hi = hi >> 8\n buf[offset + 1] = hi\n hi = hi >> 8\n buf[offset] = hi\n return offset + 8\n}\n\nBuffer.prototype.writeBigUInt64LE = defineBigIntMethod(function writeBigUInt64LE (value, offset = 0) {\n return wrtBigUInt64LE(this, value, offset, BigInt(0), BigInt('0xffffffffffffffff'))\n})\n\nBuffer.prototype.writeBigUInt64BE = defineBigIntMethod(function writeBigUInt64BE (value, offset = 0) {\n return wrtBigUInt64BE(this, value, offset, BigInt(0), BigInt('0xffffffffffffffff'))\n})\n\nBuffer.prototype.writeIntLE = function writeIntLE (value, offset, byteLength, noAssert) {\n value = +value\n offset = offset >>> 0\n if (!noAssert) {\n const limit = Math.pow(2, (8 * byteLength) - 1)\n\n checkInt(this, value, offset, byteLength, limit - 1, -limit)\n }\n\n let i = 0\n let mul = 1\n let sub = 0\n this[offset] = value & 0xFF\n while (++i < byteLength && (mul *= 0x100)) {\n if (value < 0 && sub === 0 && this[offset + i - 1] !== 0) {\n sub = 1\n }\n this[offset + i] = ((value / mul) >> 0) - sub & 0xFF\n }\n\n return offset + byteLength\n}\n\nBuffer.prototype.writeIntBE = function writeIntBE (value, offset, byteLength, noAssert) {\n value = +value\n offset = offset >>> 0\n if (!noAssert) {\n const limit = Math.pow(2, (8 * byteLength) - 1)\n\n checkInt(this, value, offset, byteLength, limit - 1, -limit)\n }\n\n let i = byteLength - 1\n let mul = 1\n let sub = 0\n this[offset + i] = value & 0xFF\n while (--i >= 0 && (mul *= 0x100)) {\n if (value < 0 && sub === 0 && this[offset + i + 1] !== 0) {\n sub = 1\n }\n this[offset + i] = ((value / mul) >> 0) - sub & 0xFF\n }\n\n return offset + byteLength\n}\n\nBuffer.prototype.writeInt8 = function writeInt8 (value, offset, noAssert) {\n value = +value\n offset = offset >>> 0\n if (!noAssert) checkInt(this, value, offset, 1, 0x7f, -0x80)\n if (value < 0) value = 0xff + value + 1\n this[offset] = (value & 0xff)\n return offset + 1\n}\n\nBuffer.prototype.writeInt16LE = function writeInt16LE (value, offset, noAssert) {\n value = +value\n offset = offset >>> 0\n if (!noAssert) checkInt(this, value, offset, 2, 0x7fff, -0x8000)\n this[offset] = (value & 0xff)\n this[offset + 1] = (value >>> 8)\n return offset + 2\n}\n\nBuffer.prototype.writeInt16BE = function writeInt16BE (value, offset, noAssert) {\n value = +value\n offset = offset >>> 0\n if (!noAssert) checkInt(this, value, offset, 2, 0x7fff, -0x8000)\n this[offset] = (value >>> 8)\n this[offset + 1] = (value & 0xff)\n return offset + 2\n}\n\nBuffer.prototype.writeInt32LE = function writeInt32LE (value, offset, noAssert) {\n value = +value\n offset = offset >>> 0\n if (!noAssert) checkInt(this, value, offset, 4, 0x7fffffff, -0x80000000)\n this[offset] = (value & 0xff)\n this[offset + 1] = (value >>> 8)\n this[offset + 2] = (value >>> 16)\n this[offset + 3] = (value >>> 24)\n return offset + 4\n}\n\nBuffer.prototype.writeInt32BE = function writeInt32BE (value, offset, noAssert) {\n value = +value\n offset = offset >>> 0\n if (!noAssert) checkInt(this, value, offset, 4, 0x7fffffff, -0x80000000)\n if (value < 0) value = 0xffffffff + value + 1\n this[offset] = (value >>> 24)\n this[offset + 1] = (value >>> 16)\n this[offset + 2] = (value >>> 8)\n this[offset + 3] = (value & 0xff)\n return offset + 4\n}\n\nBuffer.prototype.writeBigInt64LE = defineBigIntMethod(function writeBigInt64LE (value, offset = 0) {\n return wrtBigUInt64LE(this, value, offset, -BigInt('0x8000000000000000'), BigInt('0x7fffffffffffffff'))\n})\n\nBuffer.prototype.writeBigInt64BE = defineBigIntMethod(function writeBigInt64BE (value, offset = 0) {\n return wrtBigUInt64BE(this, value, offset, -BigInt('0x8000000000000000'), BigInt('0x7fffffffffffffff'))\n})\n\nfunction checkIEEE754 (buf, value, offset, ext, max, min) {\n if (offset + ext > buf.length) throw new RangeError('Index out of range')\n if (offset < 0) throw new RangeError('Index out of range')\n}\n\nfunction writeFloat (buf, value, offset, littleEndian, noAssert) {\n value = +value\n offset = offset >>> 0\n if (!noAssert) {\n checkIEEE754(buf, value, offset, 4, 3.4028234663852886e+38, -3.4028234663852886e+38)\n }\n ieee754.write(buf, value, offset, littleEndian, 23, 4)\n return offset + 4\n}\n\nBuffer.prototype.writeFloatLE = function writeFloatLE (value, offset, noAssert) {\n return writeFloat(this, value, offset, true, noAssert)\n}\n\nBuffer.prototype.writeFloatBE = function writeFloatBE (value, offset, noAssert) {\n return writeFloat(this, value, offset, false, noAssert)\n}\n\nfunction writeDouble (buf, value, offset, littleEndian, noAssert) {\n value = +value\n offset = offset >>> 0\n if (!noAssert) {\n checkIEEE754(buf, value, offset, 8, 1.7976931348623157E+308, -1.7976931348623157E+308)\n }\n ieee754.write(buf, value, offset, littleEndian, 52, 8)\n return offset + 8\n}\n\nBuffer.prototype.writeDoubleLE = function writeDoubleLE (value, offset, noAssert) {\n return writeDouble(this, value, offset, true, noAssert)\n}\n\nBuffer.prototype.writeDoubleBE = function writeDoubleBE (value, offset, noAssert) {\n return writeDouble(this, value, offset, false, noAssert)\n}\n\n// copy(targetBuffer, targetStart=0, sourceStart=0, sourceEnd=buffer.length)\nBuffer.prototype.copy = function copy (target, targetStart, start, end) {\n if (!Buffer.isBuffer(target)) throw new TypeError('argument should be a Buffer')\n if (!start) start = 0\n if (!end && end !== 0) end = this.length\n if (targetStart >= target.length) targetStart = target.length\n if (!targetStart) targetStart = 0\n if (end > 0 && end < start) end = start\n\n // Copy 0 bytes; we're done\n if (end === start) return 0\n if (target.length === 0 || this.length === 0) return 0\n\n // Fatal error conditions\n if (targetStart < 0) {\n throw new RangeError('targetStart out of bounds')\n }\n if (start < 0 || start >= this.length) throw new RangeError('Index out of range')\n if (end < 0) throw new RangeError('sourceEnd out of bounds')\n\n // Are we oob?\n if (end > this.length) end = this.length\n if (target.length - targetStart < end - start) {\n end = target.length - targetStart + start\n }\n\n const len = end - start\n\n if (this === target && typeof Uint8Array.prototype.copyWithin === 'function') {\n // Use built-in when available, missing from IE11\n this.copyWithin(targetStart, start, end)\n } else {\n Uint8Array.prototype.set.call(\n target,\n this.subarray(start, end),\n targetStart\n )\n }\n\n return len\n}\n\n// Usage:\n// buffer.fill(number[, offset[, end]])\n// buffer.fill(buffer[, offset[, end]])\n// buffer.fill(string[, offset[, end]][, encoding])\nBuffer.prototype.fill = function fill (val, start, end, encoding) {\n // Handle string cases:\n if (typeof val === 'string') {\n if (typeof start === 'string') {\n encoding = start\n start = 0\n end = this.length\n } else if (typeof end === 'string') {\n encoding = end\n end = this.length\n }\n if (encoding !== undefined && typeof encoding !== 'string') {\n throw new TypeError('encoding must be a string')\n }\n if (typeof encoding === 'string' && !Buffer.isEncoding(encoding)) {\n throw new TypeError('Unknown encoding: ' + encoding)\n }\n if (val.length === 1) {\n const code = val.charCodeAt(0)\n if ((encoding === 'utf8' && code < 128) ||\n encoding === 'latin1') {\n // Fast path: If `val` fits into a single byte, use that numeric value.\n val = code\n }\n }\n } else if (typeof val === 'number') {\n val = val & 255\n } else if (typeof val === 'boolean') {\n val = Number(val)\n }\n\n // Invalid ranges are not set to a default, so can range check early.\n if (start < 0 || this.length < start || this.length < end) {\n throw new RangeError('Out of range index')\n }\n\n if (end <= start) {\n return this\n }\n\n start = start >>> 0\n end = end === undefined ? this.length : end >>> 0\n\n if (!val) val = 0\n\n let i\n if (typeof val === 'number') {\n for (i = start; i < end; ++i) {\n this[i] = val\n }\n } else {\n const bytes = Buffer.isBuffer(val)\n ? val\n : Buffer.from(val, encoding)\n const len = bytes.length\n if (len === 0) {\n throw new TypeError('The value \"' + val +\n '\" is invalid for argument \"value\"')\n }\n for (i = 0; i < end - start; ++i) {\n this[i + start] = bytes[i % len]\n }\n }\n\n return this\n}\n\n// CUSTOM ERRORS\n// =============\n\n// Simplified versions from Node, changed for Buffer-only usage\nconst errors = {}\nfunction E (sym, getMessage, Base) {\n errors[sym] = class NodeError extends Base {\n constructor () {\n super()\n\n Object.defineProperty(this, 'message', {\n value: getMessage.apply(this, arguments),\n writable: true,\n configurable: true\n })\n\n // Add the error code to the name to include it in the stack trace.\n this.name = `${this.name} [${sym}]`\n // Access the stack to generate the error message including the error code\n // from the name.\n this.stack // eslint-disable-line no-unused-expressions\n // Reset the name to the actual name.\n delete this.name\n }\n\n get code () {\n return sym\n }\n\n set code (value) {\n Object.defineProperty(this, 'code', {\n configurable: true,\n enumerable: true,\n value,\n writable: true\n })\n }\n\n toString () {\n return `${this.name} [${sym}]: ${this.message}`\n }\n }\n}\n\nE('ERR_BUFFER_OUT_OF_BOUNDS',\n function (name) {\n if (name) {\n return `${name} is outside of buffer bounds`\n }\n\n return 'Attempt to access memory outside buffer bounds'\n }, RangeError)\nE('ERR_INVALID_ARG_TYPE',\n function (name, actual) {\n return `The \"${name}\" argument must be of type number. Received type ${typeof actual}`\n }, TypeError)\nE('ERR_OUT_OF_RANGE',\n function (str, range, input) {\n let msg = `The value of \"${str}\" is out of range.`\n let received = input\n if (Number.isInteger(input) && Math.abs(input) > 2 ** 32) {\n received = addNumericalSeparator(String(input))\n } else if (typeof input === 'bigint') {\n received = String(input)\n if (input > BigInt(2) ** BigInt(32) || input < -(BigInt(2) ** BigInt(32))) {\n received = addNumericalSeparator(received)\n }\n received += 'n'\n }\n msg += ` It must be ${range}. Received ${received}`\n return msg\n }, RangeError)\n\nfunction addNumericalSeparator (val) {\n let res = ''\n let i = val.length\n const start = val[0] === '-' ? 1 : 0\n for (; i >= start + 4; i -= 3) {\n res = `_${val.slice(i - 3, i)}${res}`\n }\n return `${val.slice(0, i)}${res}`\n}\n\n// CHECK FUNCTIONS\n// ===============\n\nfunction checkBounds (buf, offset, byteLength) {\n validateNumber(offset, 'offset')\n if (buf[offset] === undefined || buf[offset + byteLength] === undefined) {\n boundsError(offset, buf.length - (byteLength + 1))\n }\n}\n\nfunction checkIntBI (value, min, max, buf, offset, byteLength) {\n if (value > max || value < min) {\n const n = typeof min === 'bigint' ? 'n' : ''\n let range\n if (byteLength > 3) {\n if (min === 0 || min === BigInt(0)) {\n range = `>= 0${n} and < 2${n} ** ${(byteLength + 1) * 8}${n}`\n } else {\n range = `>= -(2${n} ** ${(byteLength + 1) * 8 - 1}${n}) and < 2 ** ` +\n `${(byteLength + 1) * 8 - 1}${n}`\n }\n } else {\n range = `>= ${min}${n} and <= ${max}${n}`\n }\n throw new errors.ERR_OUT_OF_RANGE('value', range, value)\n }\n checkBounds(buf, offset, byteLength)\n}\n\nfunction validateNumber (value, name) {\n if (typeof value !== 'number') {\n throw new errors.ERR_INVALID_ARG_TYPE(name, 'number', value)\n }\n}\n\nfunction boundsError (value, length, type) {\n if (Math.floor(value) !== value) {\n validateNumber(value, type)\n throw new errors.ERR_OUT_OF_RANGE(type || 'offset', 'an integer', value)\n }\n\n if (length < 0) {\n throw new errors.ERR_BUFFER_OUT_OF_BOUNDS()\n }\n\n throw new errors.ERR_OUT_OF_RANGE(type || 'offset',\n `>= ${type ? 1 : 0} and <= ${length}`,\n value)\n}\n\n// HELPER FUNCTIONS\n// ================\n\nconst INVALID_BASE64_RE = /[^+/0-9A-Za-z-_]/g\n\nfunction base64clean (str) {\n // Node takes equal signs as end of the Base64 encoding\n str = str.split('=')[0]\n // Node strips out invalid characters like \\n and \\t from the string, base64-js does not\n str = str.trim().replace(INVALID_BASE64_RE, '')\n // Node converts strings with length < 2 to ''\n if (str.length < 2) return ''\n // Node allows for non-padded base64 strings (missing trailing ===), base64-js does not\n while (str.length % 4 !== 0) {\n str = str + '='\n }\n return str\n}\n\nfunction utf8ToBytes (string, units) {\n units = units || Infinity\n let codePoint\n const length = string.length\n let leadSurrogate = null\n const bytes = []\n\n for (let i = 0; i < length; ++i) {\n codePoint = string.charCodeAt(i)\n\n // is surrogate component\n if (codePoint > 0xD7FF && codePoint < 0xE000) {\n // last char was a lead\n if (!leadSurrogate) {\n // no lead yet\n if (codePoint > 0xDBFF) {\n // unexpected trail\n if ((units -= 3) > -1) bytes.push(0xEF, 0xBF, 0xBD)\n continue\n } else if (i + 1 === length) {\n // unpaired lead\n if ((units -= 3) > -1) bytes.push(0xEF, 0xBF, 0xBD)\n continue\n }\n\n // valid lead\n leadSurrogate = codePoint\n\n continue\n }\n\n // 2 leads in a row\n if (codePoint < 0xDC00) {\n if ((units -= 3) > -1) bytes.push(0xEF, 0xBF, 0xBD)\n leadSurrogate = codePoint\n continue\n }\n\n // valid surrogate pair\n codePoint = (leadSurrogate - 0xD800 << 10 | codePoint - 0xDC00) + 0x10000\n } else if (leadSurrogate) {\n // valid bmp char, but last char was a lead\n if ((units -= 3) > -1) bytes.push(0xEF, 0xBF, 0xBD)\n }\n\n leadSurrogate = null\n\n // encode utf8\n if (codePoint < 0x80) {\n if ((units -= 1) < 0) break\n bytes.push(codePoint)\n } else if (codePoint < 0x800) {\n if ((units -= 2) < 0) break\n bytes.push(\n codePoint >> 0x6 | 0xC0,\n codePoint & 0x3F | 0x80\n )\n } else if (codePoint < 0x10000) {\n if ((units -= 3) < 0) break\n bytes.push(\n codePoint >> 0xC | 0xE0,\n codePoint >> 0x6 & 0x3F | 0x80,\n codePoint & 0x3F | 0x80\n )\n } else if (codePoint < 0x110000) {\n if ((units -= 4) < 0) break\n bytes.push(\n codePoint >> 0x12 | 0xF0,\n codePoint >> 0xC & 0x3F | 0x80,\n codePoint >> 0x6 & 0x3F | 0x80,\n codePoint & 0x3F | 0x80\n )\n } else {\n throw new Error('Invalid code point')\n }\n }\n\n return bytes\n}\n\nfunction asciiToBytes (str) {\n const byteArray = []\n for (let i = 0; i < str.length; ++i) {\n // Node's code seems to be doing this and not & 0x7F..\n byteArray.push(str.charCodeAt(i) & 0xFF)\n }\n return byteArray\n}\n\nfunction utf16leToBytes (str, units) {\n let c, hi, lo\n const byteArray = []\n for (let i = 0; i < str.length; ++i) {\n if ((units -= 2) < 0) break\n\n c = str.charCodeAt(i)\n hi = c >> 8\n lo = c % 256\n byteArray.push(lo)\n byteArray.push(hi)\n }\n\n return byteArray\n}\n\nfunction base64ToBytes (str) {\n return base64.toByteArray(base64clean(str))\n}\n\nfunction blitBuffer (src, dst, offset, length) {\n let i\n for (i = 0; i < length; ++i) {\n if ((i + offset >= dst.length) || (i >= src.length)) break\n dst[i + offset] = src[i]\n }\n return i\n}\n\n// ArrayBuffer or Uint8Array objects from other contexts (i.e. iframes) do not pass\n// the `instanceof` check but they should be treated as of that type.\n// See: https://github.com/feross/buffer/issues/166\nfunction isInstance (obj, type) {\n return obj instanceof type ||\n (obj != null && obj.constructor != null && obj.constructor.name != null &&\n obj.constructor.name === type.name)\n}\nfunction numberIsNaN (obj) {\n // For IE11 support\n return obj !== obj // eslint-disable-line no-self-compare\n}\n\n// Create lookup table for `toString('hex')`\n// See: https://github.com/feross/buffer/issues/219\nconst hexSliceLookupTable = (function () {\n const alphabet = '0123456789abcdef'\n const table = new Array(256)\n for (let i = 0; i < 16; ++i) {\n const i16 = i * 16\n for (let j = 0; j < 16; ++j) {\n table[i16 + j] = alphabet[i] + alphabet[j]\n }\n }\n return table\n})()\n\n// Return not function with Error if BigInt not supported\nfunction defineBigIntMethod (fn) {\n return typeof BigInt === 'undefined' ? BufferBigIntNotDefined : fn\n}\n\nfunction BufferBigIntNotDefined () {\n throw new Error('BigInt not supported')\n}\n","// extracted by extract-css-chunks-webpack-plugin\nmodule.exports = {};","// extracted by extract-css-chunks-webpack-plugin\nmodule.exports = {\"nodeStrokeWidth\":\"0.8\",\"directionArrowSize\":\"6\",\"directionArrowWidth\":\"0.7\",\"node\":\"fornac-node\",\"directionArrow\":\"fornac-directionArrow\",\"plot\":\"fornac-plot\",\"selectedNode\":\"fornac-selectedNode\",\"nodeLabel\":\"fornac-nodeLabel\",\"link\":\"fornac-link\",\"plotLabel\":\"fornac-plotLabel\",\"transparent\":\"fornac-transparent\",\"dragLine\":\"fornac-dragLine\",\"mouseEventHelper\":\"fornac-mouseEventHelper\"};","/*! ieee754. BSD-3-Clause License. Feross Aboukhadijeh */\nexports.read = function (buffer, offset, isLE, mLen, nBytes) {\n var e, m\n var eLen = (nBytes * 8) - mLen - 1\n var eMax = (1 << eLen) - 1\n var eBias = eMax >> 1\n var nBits = -7\n var i = isLE ? (nBytes - 1) : 0\n var d = isLE ? -1 : 1\n var s = buffer[offset + i]\n\n i += d\n\n e = s & ((1 << (-nBits)) - 1)\n s >>= (-nBits)\n nBits += eLen\n for (; nBits > 0; e = (e * 256) + buffer[offset + i], i += d, nBits -= 8) {}\n\n m = e & ((1 << (-nBits)) - 1)\n e >>= (-nBits)\n nBits += mLen\n for (; nBits > 0; m = (m * 256) + buffer[offset + i], i += d, nBits -= 8) {}\n\n if (e === 0) {\n e = 1 - eBias\n } else if (e === eMax) {\n return m ? NaN : ((s ? -1 : 1) * Infinity)\n } else {\n m = m + Math.pow(2, mLen)\n e = e - eBias\n }\n return (s ? -1 : 1) * m * Math.pow(2, e - mLen)\n}\n\nexports.write = function (buffer, value, offset, isLE, mLen, nBytes) {\n var e, m, c\n var eLen = (nBytes * 8) - mLen - 1\n var eMax = (1 << eLen) - 1\n var eBias = eMax >> 1\n var rt = (mLen === 23 ? Math.pow(2, -24) - Math.pow(2, -77) : 0)\n var i = isLE ? 0 : (nBytes - 1)\n var d = isLE ? 1 : -1\n var s = value < 0 || (value === 0 && 1 / value < 0) ? 1 : 0\n\n value = Math.abs(value)\n\n if (isNaN(value) || value === Infinity) {\n m = isNaN(value) ? 1 : 0\n e = eMax\n } else {\n e = Math.floor(Math.log(value) / Math.LN2)\n if (value * (c = Math.pow(2, -e)) < 1) {\n e--\n c *= 2\n }\n if (e + eBias >= 1) {\n value += rt / c\n } else {\n value += rt * Math.pow(2, 1 - eBias)\n }\n if (value * c >= 2) {\n e++\n c /= 2\n }\n\n if (e + eBias >= eMax) {\n m = 0\n e = eMax\n } else if (e + eBias >= 1) {\n m = ((value * c) - 1) * Math.pow(2, mLen)\n e = e + eBias\n } else {\n m = value * Math.pow(2, eBias - 1) * Math.pow(2, mLen)\n e = 0\n }\n }\n\n for (; mLen >= 8; buffer[offset + i] = m & 0xff, i += d, m /= 256, mLen -= 8) {}\n\n e = (e << mLen) | m\n eLen += mLen\n for (; eLen > 0; buffer[offset + i] = e & 0xff, i += d, e /= 256, eLen -= 8) {}\n\n buffer[offset + i - d] |= s * 128\n}\n","// The MIT License (MIT)\n//\n// Copyright (c) 2014 Jonas Finnemann Jensen\n//\n// Permission is hereby granted, free of charge, to any person obtaining a copy\n// of this software and associated documentation files (the \"Software\"), to deal\n// in the Software without restriction, including without limitation the rights\n// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n// copies of the Software, and to permit persons to whom the Software is\n// furnished to do so, subject to the following conditions:\n//\n// The above copyright notice and this permission notice shall be included in\n// all copies or substantial portions of the Software.\n//\n// THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n// THE SOFTWARE.\n\nmodule.exports = require('./slugid');\n","// The MIT License (MIT)\n//\n// Copyright (c) 2014 Jonas Finnemann Jensen\n//\n// Permission is hereby granted, free of charge, to any person obtaining a copy\n// of this software and associated documentation files (the \"Software\"), to deal\n// in the Software without restriction, including without limitation the rights\n// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n// copies of the Software, and to permit persons to whom the Software is\n// furnished to do so, subject to the following conditions:\n//\n// The above copyright notice and this permission notice shall be included in\n// all copies or substantial portions of the Software.\n//\n// THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n// THE SOFTWARE.\n\nvar uuid = require('uuid');\n\n/** @type {(bytes: Uint8Array) => string} */\nvar toBase64 = (() => {\n if (typeof Buffer !== 'undefined') {\n return (bytes) => Buffer.from(bytes).toString('base64');\n }\n return (bytes) => btoa(String.fromCharCode(...bytes));\n})();\n\n/** @type {(base64: string) => Uint8Array | Buffer} */\nvar fromBase64 = (() => {\n if (typeof Buffer !== 'undefined') {\n return (base64) => Buffer.from(base64, 'base64');\n }\n return (base64) => Uint8Array.from(atob(base64), c => c.charCodeAt(0));\n})();\n\n/**\n * Returns the given uuid as a 22 character slug. This can be a regular v4\n * slug or a \"nice\" slug.\n */\nexports.encode = function(uuid_) {\n var bytes = uuid.parse(uuid_);\n var base64 = toBase64(bytes);\n var slug = base64\n .replace(/\\+/g, '-') // Replace + with - (see RFC 4648, sec. 5)\n .replace(/\\//g, '_') // Replace / with _ (see RFC 4648, sec. 5)\n .substring(0, 22); // Drop '==' padding\n return slug;\n};\n\n/**\n * Returns the uuid represented by the given v4 or \"nice\" slug\n */\nexports.decode = function(slug) {\n var base64 = slug\n .replace(/-/g, '+')\n .replace(/_/g, '/')\n + '==';\n return uuid.stringify(fromBase64(base64));\n};\n\n/**\n * Returns a randomly generated uuid v4 compliant slug\n */\nexports.v4 = function() {\n var bytes = uuid.v4(null, new Uint8Array(16));\n var base64 = toBase64(bytes);\n var slug = base64\n .replace(/\\+/g, '-') // Replace + with - (see RFC 4648, sec. 5)\n .replace(/\\//g, '_') // Replace / with _ (see RFC 4648, sec. 5)\n .substring(0, 22); // Drop '==' padding\n return slug;\n};\n\n/**\n * Returns a randomly generated uuid v4 compliant slug which conforms to a set\n * of \"nice\" properties, at the cost of some entropy. Currently this means one\n * extra fixed bit (the first bit of the uuid is set to 0) which guarantees the\n * slug will begin with [A-Za-f]. For example such slugs don't require special\n * handling when used as command line parameters (whereas non-nice slugs may\n * start with `-` which can confuse command line tools).\n *\n * Potentially other \"nice\" properties may be added in future to further\n * restrict the range of potential uuids that may be generated.\n */\nexports.nice = function() {\n var bytes = uuid.v4(null, new Uint8Array(16));\n bytes[0] = bytes[0] & 0x7f; // unset first bit to ensure [A-Za-f] first char\n var base64 = toBase64(bytes);\n var slug = base64\n .replace(/\\+/g, '-') // Replace + with - (see RFC 4648, sec. 5)\n .replace(/\\//g, '_') // Replace / with _ (see RFC 4648, sec. 5)\n .substring(0, 22); // Drop '==' padding\n return slug;\n};\n","// Unique ID creation requires a high quality random # generator. In the browser we therefore\n// require the crypto API and do not support built-in fallback to lower quality random number\n// generators (like Math.random()).\nvar getRandomValues;\nvar rnds8 = new Uint8Array(16);\nexport default function rng() {\n // lazy load so that environments that need to polyfill have a chance to do so\n if (!getRandomValues) {\n // getRandomValues needs to be invoked in a context where \"this\" is a Crypto implementation. Also,\n // find the complete implementation of crypto (msCrypto) on IE11.\n getRandomValues = typeof crypto !== 'undefined' && crypto.getRandomValues && crypto.getRandomValues.bind(crypto) || typeof msCrypto !== 'undefined' && typeof msCrypto.getRandomValues === 'function' && msCrypto.getRandomValues.bind(msCrypto);\n\n if (!getRandomValues) {\n throw new Error('crypto.getRandomValues() not supported. See https://github.com/uuidjs/uuid#getrandomvalues-not-supported');\n }\n }\n\n return getRandomValues(rnds8);\n}","export default /^(?:[0-9a-f]{8}-[0-9a-f]{4}-[1-5][0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}|00000000-0000-0000-0000-000000000000)$/i;","import REGEX from './regex.js';\n\nfunction validate(uuid) {\n return typeof uuid === 'string' && REGEX.test(uuid);\n}\n\nexport default validate;","import validate from './validate.js';\n/**\n * Convert array of 16 byte values to UUID string format of the form:\n * XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX\n */\n\nvar byteToHex = [];\n\nfor (var i = 0; i < 256; ++i) {\n byteToHex.push((i + 0x100).toString(16).substr(1));\n}\n\nfunction stringify(arr) {\n var offset = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 0;\n // Note: Be careful editing this code! It's been tuned for performance\n // and works in ways you may not expect. See https://github.com/uuidjs/uuid/pull/434\n var uuid = (byteToHex[arr[offset + 0]] + byteToHex[arr[offset + 1]] + byteToHex[arr[offset + 2]] + byteToHex[arr[offset + 3]] + '-' + byteToHex[arr[offset + 4]] + byteToHex[arr[offset + 5]] + '-' + byteToHex[arr[offset + 6]] + byteToHex[arr[offset + 7]] + '-' + byteToHex[arr[offset + 8]] + byteToHex[arr[offset + 9]] + '-' + byteToHex[arr[offset + 10]] + byteToHex[arr[offset + 11]] + byteToHex[arr[offset + 12]] + byteToHex[arr[offset + 13]] + byteToHex[arr[offset + 14]] + byteToHex[arr[offset + 15]]).toLowerCase(); // Consistency check for valid UUID. If this throws, it's likely due to one\n // of the following:\n // - One or more input array values don't map to a hex octet (leading to\n // \"undefined\" in the uuid)\n // - Invalid input values for the RFC `version` or `variant` fields\n\n if (!validate(uuid)) {\n throw TypeError('Stringified UUID is invalid');\n }\n\n return uuid;\n}\n\nexport default stringify;","import rng from './rng.js';\nimport stringify from './stringify.js'; // **`v1()` - Generate time-based UUID**\n//\n// Inspired by https://github.com/LiosK/UUID.js\n// and http://docs.python.org/library/uuid.html\n\nvar _nodeId;\n\nvar _clockseq; // Previous uuid creation time\n\n\nvar _lastMSecs = 0;\nvar _lastNSecs = 0; // See https://github.com/uuidjs/uuid for API details\n\nfunction v1(options, buf, offset) {\n var i = buf && offset || 0;\n var b = buf || new Array(16);\n options = options || {};\n var node = options.node || _nodeId;\n var clockseq = options.clockseq !== undefined ? options.clockseq : _clockseq; // node and clockseq need to be initialized to random values if they're not\n // specified. We do this lazily to minimize issues related to insufficient\n // system entropy. See #189\n\n if (node == null || clockseq == null) {\n var seedBytes = options.random || (options.rng || rng)();\n\n if (node == null) {\n // Per 4.5, create and 48-bit node id, (47 random bits + multicast bit = 1)\n node = _nodeId = [seedBytes[0] | 0x01, seedBytes[1], seedBytes[2], seedBytes[3], seedBytes[4], seedBytes[5]];\n }\n\n if (clockseq == null) {\n // Per 4.2.2, randomize (14 bit) clockseq\n clockseq = _clockseq = (seedBytes[6] << 8 | seedBytes[7]) & 0x3fff;\n }\n } // UUID timestamps are 100 nano-second units since the Gregorian epoch,\n // (1582-10-15 00:00). JSNumbers aren't precise enough for this, so\n // time is handled internally as 'msecs' (integer milliseconds) and 'nsecs'\n // (100-nanoseconds offset from msecs) since unix epoch, 1970-01-01 00:00.\n\n\n var msecs = options.msecs !== undefined ? options.msecs : Date.now(); // Per 4.2.1.2, use count of uuid's generated during the current clock\n // cycle to simulate higher resolution clock\n\n var nsecs = options.nsecs !== undefined ? options.nsecs : _lastNSecs + 1; // Time since last uuid creation (in msecs)\n\n var dt = msecs - _lastMSecs + (nsecs - _lastNSecs) / 10000; // Per 4.2.1.2, Bump clockseq on clock regression\n\n if (dt < 0 && options.clockseq === undefined) {\n clockseq = clockseq + 1 & 0x3fff;\n } // Reset nsecs if clock regresses (new clockseq) or we've moved onto a new\n // time interval\n\n\n if ((dt < 0 || msecs > _lastMSecs) && options.nsecs === undefined) {\n nsecs = 0;\n } // Per 4.2.1.2 Throw error if too many uuids are requested\n\n\n if (nsecs >= 10000) {\n throw new Error(\"uuid.v1(): Can't create more than 10M uuids/sec\");\n }\n\n _lastMSecs = msecs;\n _lastNSecs = nsecs;\n _clockseq = clockseq; // Per 4.1.4 - Convert from unix epoch to Gregorian epoch\n\n msecs += 12219292800000; // `time_low`\n\n var tl = ((msecs & 0xfffffff) * 10000 + nsecs) % 0x100000000;\n b[i++] = tl >>> 24 & 0xff;\n b[i++] = tl >>> 16 & 0xff;\n b[i++] = tl >>> 8 & 0xff;\n b[i++] = tl & 0xff; // `time_mid`\n\n var tmh = msecs / 0x100000000 * 10000 & 0xfffffff;\n b[i++] = tmh >>> 8 & 0xff;\n b[i++] = tmh & 0xff; // `time_high_and_version`\n\n b[i++] = tmh >>> 24 & 0xf | 0x10; // include version\n\n b[i++] = tmh >>> 16 & 0xff; // `clock_seq_hi_and_reserved` (Per 4.2.2 - include variant)\n\n b[i++] = clockseq >>> 8 | 0x80; // `clock_seq_low`\n\n b[i++] = clockseq & 0xff; // `node`\n\n for (var n = 0; n < 6; ++n) {\n b[i + n] = node[n];\n }\n\n return buf || stringify(b);\n}\n\nexport default v1;","import validate from './validate.js';\n\nfunction parse(uuid) {\n if (!validate(uuid)) {\n throw TypeError('Invalid UUID');\n }\n\n var v;\n var arr = new Uint8Array(16); // Parse ########-....-....-....-............\n\n arr[0] = (v = parseInt(uuid.slice(0, 8), 16)) >>> 24;\n arr[1] = v >>> 16 & 0xff;\n arr[2] = v >>> 8 & 0xff;\n arr[3] = v & 0xff; // Parse ........-####-....-....-............\n\n arr[4] = (v = parseInt(uuid.slice(9, 13), 16)) >>> 8;\n arr[5] = v & 0xff; // Parse ........-....-####-....-............\n\n arr[6] = (v = parseInt(uuid.slice(14, 18), 16)) >>> 8;\n arr[7] = v & 0xff; // Parse ........-....-....-####-............\n\n arr[8] = (v = parseInt(uuid.slice(19, 23), 16)) >>> 8;\n arr[9] = v & 0xff; // Parse ........-....-....-....-############\n // (Use \"/\" to avoid 32-bit truncation when bit-shifting high-order bytes)\n\n arr[10] = (v = parseInt(uuid.slice(24, 36), 16)) / 0x10000000000 & 0xff;\n arr[11] = v / 0x100000000 & 0xff;\n arr[12] = v >>> 24 & 0xff;\n arr[13] = v >>> 16 & 0xff;\n arr[14] = v >>> 8 & 0xff;\n arr[15] = v & 0xff;\n return arr;\n}\n\nexport default parse;","import stringify from './stringify.js';\nimport parse from './parse.js';\n\nfunction stringToBytes(str) {\n str = unescape(encodeURIComponent(str)); // UTF8 escape\n\n var bytes = [];\n\n for (var i = 0; i < str.length; ++i) {\n bytes.push(str.charCodeAt(i));\n }\n\n return bytes;\n}\n\nexport var DNS = '6ba7b810-9dad-11d1-80b4-00c04fd430c8';\nexport var URL = '6ba7b811-9dad-11d1-80b4-00c04fd430c8';\nexport default function (name, version, hashfunc) {\n function generateUUID(value, namespace, buf, offset) {\n if (typeof value === 'string') {\n value = stringToBytes(value);\n }\n\n if (typeof namespace === 'string') {\n namespace = parse(namespace);\n }\n\n if (namespace.length !== 16) {\n throw TypeError('Namespace must be array-like (16 iterable integer values, 0-255)');\n } // Compute hash of namespace and value, Per 4.3\n // Future: Use spread syntax when supported on all platforms, e.g. `bytes =\n // hashfunc([...namespace, ... value])`\n\n\n var bytes = new Uint8Array(16 + value.length);\n bytes.set(namespace);\n bytes.set(value, namespace.length);\n bytes = hashfunc(bytes);\n bytes[6] = bytes[6] & 0x0f | version;\n bytes[8] = bytes[8] & 0x3f | 0x80;\n\n if (buf) {\n offset = offset || 0;\n\n for (var i = 0; i < 16; ++i) {\n buf[offset + i] = bytes[i];\n }\n\n return buf;\n }\n\n return stringify(bytes);\n } // Function#name is not settable on some platforms (#270)\n\n\n try {\n generateUUID.name = name; // eslint-disable-next-line no-empty\n } catch (err) {} // For CommonJS default export support\n\n\n generateUUID.DNS = DNS;\n generateUUID.URL = URL;\n return generateUUID;\n}","/*\n * Browser-compatible JavaScript MD5\n *\n * Modification of JavaScript MD5\n * https://github.com/blueimp/JavaScript-MD5\n *\n * Copyright 2011, Sebastian Tschan\n * https://blueimp.net\n *\n * Licensed under the MIT license:\n * https://opensource.org/licenses/MIT\n *\n * Based on\n * A JavaScript implementation of the RSA Data Security, Inc. MD5 Message\n * Digest Algorithm, as defined in RFC 1321.\n * Version 2.2 Copyright (C) Paul Johnston 1999 - 2009\n * Other contributors: Greg Holt, Andrew Kepert, Ydnar, Lostinet\n * Distributed under the BSD License\n * See http://pajhome.org.uk/crypt/md5 for more info.\n */\nfunction md5(bytes) {\n if (typeof bytes === 'string') {\n var msg = unescape(encodeURIComponent(bytes)); // UTF8 escape\n\n bytes = new Uint8Array(msg.length);\n\n for (var i = 0; i < msg.length; ++i) {\n bytes[i] = msg.charCodeAt(i);\n }\n }\n\n return md5ToHexEncodedArray(wordsToMd5(bytesToWords(bytes), bytes.length * 8));\n}\n/*\n * Convert an array of little-endian words to an array of bytes\n */\n\n\nfunction md5ToHexEncodedArray(input) {\n var output = [];\n var length32 = input.length * 32;\n var hexTab = '0123456789abcdef';\n\n for (var i = 0; i < length32; i += 8) {\n var x = input[i >> 5] >>> i % 32 & 0xff;\n var hex = parseInt(hexTab.charAt(x >>> 4 & 0x0f) + hexTab.charAt(x & 0x0f), 16);\n output.push(hex);\n }\n\n return output;\n}\n/**\n * Calculate output length with padding and bit length\n */\n\n\nfunction getOutputLength(inputLength8) {\n return (inputLength8 + 64 >>> 9 << 4) + 14 + 1;\n}\n/*\n * Calculate the MD5 of an array of little-endian words, and a bit length.\n */\n\n\nfunction wordsToMd5(x, len) {\n /* append padding */\n x[len >> 5] |= 0x80 << len % 32;\n x[getOutputLength(len) - 1] = len;\n var a = 1732584193;\n var b = -271733879;\n var c = -1732584194;\n var d = 271733878;\n\n for (var i = 0; i < x.length; i += 16) {\n var olda = a;\n var oldb = b;\n var oldc = c;\n var oldd = d;\n a = md5ff(a, b, c, d, x[i], 7, -680876936);\n d = md5ff(d, a, b, c, x[i + 1], 12, -389564586);\n c = md5ff(c, d, a, b, x[i + 2], 17, 606105819);\n b = md5ff(b, c, d, a, x[i + 3], 22, -1044525330);\n a = md5ff(a, b, c, d, x[i + 4], 7, -176418897);\n d = md5ff(d, a, b, c, x[i + 5], 12, 1200080426);\n c = md5ff(c, d, a, b, x[i + 6], 17, -1473231341);\n b = md5ff(b, c, d, a, x[i + 7], 22, -45705983);\n a = md5ff(a, b, c, d, x[i + 8], 7, 1770035416);\n d = md5ff(d, a, b, c, x[i + 9], 12, -1958414417);\n c = md5ff(c, d, a, b, x[i + 10], 17, -42063);\n b = md5ff(b, c, d, a, x[i + 11], 22, -1990404162);\n a = md5ff(a, b, c, d, x[i + 12], 7, 1804603682);\n d = md5ff(d, a, b, c, x[i + 13], 12, -40341101);\n c = md5ff(c, d, a, b, x[i + 14], 17, -1502002290);\n b = md5ff(b, c, d, a, x[i + 15], 22, 1236535329);\n a = md5gg(a, b, c, d, x[i + 1], 5, -165796510);\n d = md5gg(d, a, b, c, x[i + 6], 9, -1069501632);\n c = md5gg(c, d, a, b, x[i + 11], 14, 643717713);\n b = md5gg(b, c, d, a, x[i], 20, -373897302);\n a = md5gg(a, b, c, d, x[i + 5], 5, -701558691);\n d = md5gg(d, a, b, c, x[i + 10], 9, 38016083);\n c = md5gg(c, d, a, b, x[i + 15], 14, -660478335);\n b = md5gg(b, c, d, a, x[i + 4], 20, -405537848);\n a = md5gg(a, b, c, d, x[i + 9], 5, 568446438);\n d = md5gg(d, a, b, c, x[i + 14], 9, -1019803690);\n c = md5gg(c, d, a, b, x[i + 3], 14, -187363961);\n b = md5gg(b, c, d, a, x[i + 8], 20, 1163531501);\n a = md5gg(a, b, c, d, x[i + 13], 5, -1444681467);\n d = md5gg(d, a, b, c, x[i + 2], 9, -51403784);\n c = md5gg(c, d, a, b, x[i + 7], 14, 1735328473);\n b = md5gg(b, c, d, a, x[i + 12], 20, -1926607734);\n a = md5hh(a, b, c, d, x[i + 5], 4, -378558);\n d = md5hh(d, a, b, c, x[i + 8], 11, -2022574463);\n c = md5hh(c, d, a, b, x[i + 11], 16, 1839030562);\n b = md5hh(b, c, d, a, x[i + 14], 23, -35309556);\n a = md5hh(a, b, c, d, x[i + 1], 4, -1530992060);\n d = md5hh(d, a, b, c, x[i + 4], 11, 1272893353);\n c = md5hh(c, d, a, b, x[i + 7], 16, -155497632);\n b = md5hh(b, c, d, a, x[i + 10], 23, -1094730640);\n a = md5hh(a, b, c, d, x[i + 13], 4, 681279174);\n d = md5hh(d, a, b, c, x[i], 11, -358537222);\n c = md5hh(c, d, a, b, x[i + 3], 16, -722521979);\n b = md5hh(b, c, d, a, x[i + 6], 23, 76029189);\n a = md5hh(a, b, c, d, x[i + 9], 4, -640364487);\n d = md5hh(d, a, b, c, x[i + 12], 11, -421815835);\n c = md5hh(c, d, a, b, x[i + 15], 16, 530742520);\n b = md5hh(b, c, d, a, x[i + 2], 23, -995338651);\n a = md5ii(a, b, c, d, x[i], 6, -198630844);\n d = md5ii(d, a, b, c, x[i + 7], 10, 1126891415);\n c = md5ii(c, d, a, b, x[i + 14], 15, -1416354905);\n b = md5ii(b, c, d, a, x[i + 5], 21, -57434055);\n a = md5ii(a, b, c, d, x[i + 12], 6, 1700485571);\n d = md5ii(d, a, b, c, x[i + 3], 10, -1894986606);\n c = md5ii(c, d, a, b, x[i + 10], 15, -1051523);\n b = md5ii(b, c, d, a, x[i + 1], 21, -2054922799);\n a = md5ii(a, b, c, d, x[i + 8], 6, 1873313359);\n d = md5ii(d, a, b, c, x[i + 15], 10, -30611744);\n c = md5ii(c, d, a, b, x[i + 6], 15, -1560198380);\n b = md5ii(b, c, d, a, x[i + 13], 21, 1309151649);\n a = md5ii(a, b, c, d, x[i + 4], 6, -145523070);\n d = md5ii(d, a, b, c, x[i + 11], 10, -1120210379);\n c = md5ii(c, d, a, b, x[i + 2], 15, 718787259);\n b = md5ii(b, c, d, a, x[i + 9], 21, -343485551);\n a = safeAdd(a, olda);\n b = safeAdd(b, oldb);\n c = safeAdd(c, oldc);\n d = safeAdd(d, oldd);\n }\n\n return [a, b, c, d];\n}\n/*\n * Convert an array bytes to an array of little-endian words\n * Characters >255 have their high-byte silently ignored.\n */\n\n\nfunction bytesToWords(input) {\n if (input.length === 0) {\n return [];\n }\n\n var length8 = input.length * 8;\n var output = new Uint32Array(getOutputLength(length8));\n\n for (var i = 0; i < length8; i += 8) {\n output[i >> 5] |= (input[i / 8] & 0xff) << i % 32;\n }\n\n return output;\n}\n/*\n * Add integers, wrapping at 2^32. This uses 16-bit operations internally\n * to work around bugs in some JS interpreters.\n */\n\n\nfunction safeAdd(x, y) {\n var lsw = (x & 0xffff) + (y & 0xffff);\n var msw = (x >> 16) + (y >> 16) + (lsw >> 16);\n return msw << 16 | lsw & 0xffff;\n}\n/*\n * Bitwise rotate a 32-bit number to the left.\n */\n\n\nfunction bitRotateLeft(num, cnt) {\n return num << cnt | num >>> 32 - cnt;\n}\n/*\n * These functions implement the four basic operations the algorithm uses.\n */\n\n\nfunction md5cmn(q, a, b, x, s, t) {\n return safeAdd(bitRotateLeft(safeAdd(safeAdd(a, q), safeAdd(x, t)), s), b);\n}\n\nfunction md5ff(a, b, c, d, x, s, t) {\n return md5cmn(b & c | ~b & d, a, b, x, s, t);\n}\n\nfunction md5gg(a, b, c, d, x, s, t) {\n return md5cmn(b & d | c & ~d, a, b, x, s, t);\n}\n\nfunction md5hh(a, b, c, d, x, s, t) {\n return md5cmn(b ^ c ^ d, a, b, x, s, t);\n}\n\nfunction md5ii(a, b, c, d, x, s, t) {\n return md5cmn(c ^ (b | ~d), a, b, x, s, t);\n}\n\nexport default md5;","import v35 from './v35.js';\nimport md5 from './md5.js';\nvar v3 = v35('v3', 0x30, md5);\nexport default v3;","import rng from './rng.js';\nimport stringify from './stringify.js';\n\nfunction v4(options, buf, offset) {\n options = options || {};\n var rnds = options.random || (options.rng || rng)(); // Per 4.4, set bits for version and `clock_seq_hi_and_reserved`\n\n rnds[6] = rnds[6] & 0x0f | 0x40;\n rnds[8] = rnds[8] & 0x3f | 0x80; // Copy bytes to buffer, if provided\n\n if (buf) {\n offset = offset || 0;\n\n for (var i = 0; i < 16; ++i) {\n buf[offset + i] = rnds[i];\n }\n\n return buf;\n }\n\n return stringify(rnds);\n}\n\nexport default v4;","// Adapted from Chris Veness' SHA1 code at\n// http://www.movable-type.co.uk/scripts/sha1.html\nfunction f(s, x, y, z) {\n switch (s) {\n case 0:\n return x & y ^ ~x & z;\n\n case 1:\n return x ^ y ^ z;\n\n case 2:\n return x & y ^ x & z ^ y & z;\n\n case 3:\n return x ^ y ^ z;\n }\n}\n\nfunction ROTL(x, n) {\n return x << n | x >>> 32 - n;\n}\n\nfunction sha1(bytes) {\n var K = [0x5a827999, 0x6ed9eba1, 0x8f1bbcdc, 0xca62c1d6];\n var H = [0x67452301, 0xefcdab89, 0x98badcfe, 0x10325476, 0xc3d2e1f0];\n\n if (typeof bytes === 'string') {\n var msg = unescape(encodeURIComponent(bytes)); // UTF8 escape\n\n bytes = [];\n\n for (var i = 0; i < msg.length; ++i) {\n bytes.push(msg.charCodeAt(i));\n }\n } else if (!Array.isArray(bytes)) {\n // Convert Array-like to Array\n bytes = Array.prototype.slice.call(bytes);\n }\n\n bytes.push(0x80);\n var l = bytes.length / 4 + 2;\n var N = Math.ceil(l / 16);\n var M = new Array(N);\n\n for (var _i = 0; _i < N; ++_i) {\n var arr = new Uint32Array(16);\n\n for (var j = 0; j < 16; ++j) {\n arr[j] = bytes[_i * 64 + j * 4] << 24 | bytes[_i * 64 + j * 4 + 1] << 16 | bytes[_i * 64 + j * 4 + 2] << 8 | bytes[_i * 64 + j * 4 + 3];\n }\n\n M[_i] = arr;\n }\n\n M[N - 1][14] = (bytes.length - 1) * 8 / Math.pow(2, 32);\n M[N - 1][14] = Math.floor(M[N - 1][14]);\n M[N - 1][15] = (bytes.length - 1) * 8 & 0xffffffff;\n\n for (var _i2 = 0; _i2 < N; ++_i2) {\n var W = new Uint32Array(80);\n\n for (var t = 0; t < 16; ++t) {\n W[t] = M[_i2][t];\n }\n\n for (var _t = 16; _t < 80; ++_t) {\n W[_t] = ROTL(W[_t - 3] ^ W[_t - 8] ^ W[_t - 14] ^ W[_t - 16], 1);\n }\n\n var a = H[0];\n var b = H[1];\n var c = H[2];\n var d = H[3];\n var e = H[4];\n\n for (var _t2 = 0; _t2 < 80; ++_t2) {\n var s = Math.floor(_t2 / 20);\n var T = ROTL(a, 5) + f(s, b, c, d) + e + K[s] + W[_t2] >>> 0;\n e = d;\n d = c;\n c = ROTL(b, 30) >>> 0;\n b = a;\n a = T;\n }\n\n H[0] = H[0] + a >>> 0;\n H[1] = H[1] + b >>> 0;\n H[2] = H[2] + c >>> 0;\n H[3] = H[3] + d >>> 0;\n H[4] = H[4] + e >>> 0;\n }\n\n return [H[0] >> 24 & 0xff, H[0] >> 16 & 0xff, H[0] >> 8 & 0xff, H[0] & 0xff, H[1] >> 24 & 0xff, H[1] >> 16 & 0xff, H[1] >> 8 & 0xff, H[1] & 0xff, H[2] >> 24 & 0xff, H[2] >> 16 & 0xff, H[2] >> 8 & 0xff, H[2] & 0xff, H[3] >> 24 & 0xff, H[3] >> 16 & 0xff, H[3] >> 8 & 0xff, H[3] & 0xff, H[4] >> 24 & 0xff, H[4] >> 16 & 0xff, H[4] >> 8 & 0xff, H[4] & 0xff];\n}\n\nexport default sha1;","import v35 from './v35.js';\nimport sha1 from './sha1.js';\nvar v5 = v35('v5', 0x50, sha1);\nexport default v5;","export default '00000000-0000-0000-0000-000000000000';","import validate from './validate.js';\n\nfunction version(uuid) {\n if (!validate(uuid)) {\n throw TypeError('Invalid UUID');\n }\n\n return parseInt(uuid.substr(14, 1), 16);\n}\n\nexport default version;","module.exports = __WEBPACK_EXTERNAL_MODULE__893__;","// The module cache\nvar __webpack_module_cache__ = {};\n\n// The require function\nfunction __webpack_require__(moduleId) {\n\t// Check if module is in cache\n\tvar cachedModule = __webpack_module_cache__[moduleId];\n\tif (cachedModule !== undefined) {\n\t\treturn cachedModule.exports;\n\t}\n\t// Create a new module (and put it into the cache)\n\tvar module = __webpack_module_cache__[moduleId] = {\n\t\t// no module.id needed\n\t\t// no module.loaded needed\n\t\texports: {}\n\t};\n\n\t// Execute the module function\n\t__webpack_modules__[moduleId](module, module.exports, __webpack_require__);\n\n\t// Return the exports of the module\n\treturn module.exports;\n}\n\n","// getDefaultExport function for compatibility with non-harmony modules\n__webpack_require__.n = (module) => {\n\tvar getter = module && module.__esModule ?\n\t\t() => (module['default']) :\n\t\t() => (module);\n\t__webpack_require__.d(getter, { a: getter });\n\treturn getter;\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__.g = (function() {\n\tif (typeof globalThis === 'object') return globalThis;\n\ttry {\n\t\treturn this || new Function('return this')();\n\t} catch (e) {\n\t\tif (typeof window === 'object') return window;\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};","var scriptUrl;\nif (__webpack_require__.g.importScripts) scriptUrl = __webpack_require__.g.location + \"\";\nvar document = __webpack_require__.g.document;\nif (!scriptUrl && document) {\n\tif (document.currentScript)\n\t\tscriptUrl = document.currentScript.src;\n\tif (!scriptUrl) {\n\t\tvar scripts = document.getElementsByTagName(\"script\");\n\t\tif(scripts.length) {\n\t\t\tvar i = scripts.length - 1;\n\t\t\twhile (i > -1 && (!scriptUrl || !/^http(s?):/.test(scriptUrl))) scriptUrl = scripts[i--].src;\n\t\t}\n\t}\n}\n// When supporting browsers where an automatic publicPath is not supported you must specify an output.publicPath manually via configuration\n// or pass an empty string (\"\") and set the __webpack_public_path__ variable from your code to use your own logic.\nif (!scriptUrl) throw new Error(\"Automatic publicPath is not supported in this browser\");\nscriptUrl = scriptUrl.replace(/#.*$/, \"\").replace(/\\?.*$/, \"\").replace(/\\/[^\\/]+$/, \"/\");\n__webpack_require__.p = scriptUrl;","export default __webpack_public_path__ + \"02188894d5236b1517df3210b79c2a7f.svg\";","import './d3-context-menu.css';\nimport ArrowIcon from './img/play.svg';\n\nimport d3 from 'd3';\nimport slugid from 'slugid';\n\nexport function contextMenu(menu, opts) {\n let previouslyMouseUp = false;\n let clickAway = () => {};\n let uid = slugid.nice();\n let rootElement = null;\n let orientation = 'right'; // display the menu to the right of the mouse click\n // or parent elemement\n let initialPos = null;\n let parentStart = null;\n\n var openCallback,\n closeCallback;\n\n if (typeof opts === 'function') {\n openCallback = opts;\n } else {\n opts = opts || {};\n openCallback = opts.onOpen;\n closeCallback = opts.onClose;\n }\n\n if ('rootElement' in opts)\n rootElement = opts['rootElement']\n\n if ('pos' in opts) {\n // do we want to place this menu somewhere specific?\n initialPos = opts.pos;\n }\n\n if ('orientation' in opts) {\n orientation = opts.orientation;\n }\n\n if ('parentStart' in opts) {\n parentStart = opts.parentStart;\n }\n\n // create the div element that will hold the context menu\n d3.selectAll('.d3-context-menu-' + uid).data([1])\n .enter()\n .append('div')\n .classed('d3-context-menu', true)\n .classed('d3-context-menu-' + uid, true)\n\n // close menu\n d3.select('body').on('click.d3-context-menu-' + uid, function() {\n if (previouslyMouseUp) {\n previouslyMouseUp = false;\n return;\n }\n console.log('body click close');\n\n d3.select('.d3-context-menu-' + uid).style('display', 'none');\n orientation = 'right';\n\n if (closeCallback) {\n closeCallback();\n }\n });\n\n // this gets executed when a contextmenu event occurs\n return function(data, index, pMouseUp=false,\n clickAwayFunc = function() { } ) {\n var elm = this;\n var contextMenuPos = null;\n let mousePos = null;\n let currentThis = this;\n\n if (rootElement == null)\n mousePos = d3.mouse(this);\n else\n mousePos = d3.mouse(rootElement); // for recursive menus, we need the mouse\n // position relative to another element\n\n clickAway = clickAwayFunc;\n let openChildMenuUid = null;\n\n previouslyMouseUp = pMouseUp;\n\n d3.selectAll('.d3-context-menu-' + uid).html('');\n var list = d3.selectAll('.d3-context-menu-' + uid)\n .on('contextmenu', function(d) {\n console.log('context-menu close');\n d3.select('.d3-context-menu-' + uid).style('display', 'none'); \n orientation = 'right';\n\n d3.event.preventDefault();\n d3.event.stopPropagation();\n })\n .append('ul');\n\n list.selectAll('li').data(typeof menu === 'function' ? menu(data) : menu).enter()\n .append('li')\n .attr('class', function(d) {\n console.log('d:', d);\n var ret = '';\n if (d.divider) {\n ret += ' is-divider';\n }\n if (d.disabled) {\n ret += ' is-disabled';\n }\n if (!d.action) {\n ret += ' is-header';\n }\n if ('children' in d) {\n ret += ' d3-context-menu-recursive';\n }\n return ret;\n })\n .html(function(d) {\n if (d.divider) {\n return '
';\n }\n if (!d.title) {\n console.error('No title attribute set. Check the spelling of your options.');\n }\n return (typeof d.title === 'string') ? d.title : d.title(data);\n })\n .on('click', function(d, i) {\n if (d.disabled) return; // do nothing if disabled\n if (!d.action) return; // headers have no \"action\"\n d.action(elm, data, index, mousePos);\n console.log('click close');\n\n // close all context menus\n d3.selectAll('.d3-context-menu').style('display', 'none');\n orientation = 'right';\n\n if (closeCallback) {\n closeCallback();\n }\n })\n .on('mouseenter', function(d, i) {\n d3.select(this)\n .classed('d3-context-menu-selected', true)\n\n if (openChildMenuUid != null) {\n // there's a child menu open\n\n // unselect all items\n d3.select('.d3-context-menu-' + uid)\n .selectAll('li')\n .classed('d3-context-menu-selected', false);\n\n if (typeof d.children == 'undefined') {\n console.log(\"no children close\");\n // no children, so hide any open child menus\n d3.select('.d3-context-menu-' + openChildMenuUid)\n .style('display', 'none');\n\n openChildMenuUid = null;\n return;\n }\n\n if (d.childUid == openChildMenuUid) {\n // the correct child menu is already open\n return;\n\n } else {\n // need to open a different child menu\n console.log('open different child menu close');\n \n // close the already open one\n d3.select('.d3-context-menu-' + openChildMenuUid)\n .style('display', 'none');\n\n openChildMenuUid = null;\n\n }\n } \n\n // there should be no menu open right now\n if (typeof d.children != 'undefined') {\n let boundingRect = this.getBoundingClientRect();\n\n let childrenContextMenu = null\n if (orientation == 'left') {\n childrenContextMenu = contextMenu(d.children, {'rootElement': currentThis,\n 'pos': [ boundingRect.left + window.pageXOffset,\n boundingRect.top - 2 + window.pageYOffset],\n 'orientation': 'left'});\n } else {\n childrenContextMenu = contextMenu(d.children, \n {\n 'pos': [ boundingRect.left + boundingRect.width + window.pageXOffset,\n boundingRect.top - 2 + window.pageYOffset],\n 'rootElement': currentThis,\n 'parentStart': [boundingRect.left + window.pageXOffset,\n boundingRect.top - 2 + window.pageYOffset]});\n }\n\n d.childUid = childrenContextMenu.apply(this, [data,i,true,\n function() { }]);\n openChildMenuUid = d.childUid;\n }\n\n\n d3.select(this)\n .classed('d3-context-menu-selected', true)\n \n })\n .on('mouseleave', function(d, i) {\n\n if (openChildMenuUid == null) {\n d3.select(this)\n .classed('d3-context-menu-selected', false);\n }\n });\n\n list.selectAll('.d3-context-menu-recursive')\n .append('img')\n .attr('src', ArrowIcon)\n .attr('width', '14px')\n .attr('height', '14px')\n .style('position', 'absolute')\n .style('right', '5px')\n ;\n\n // the openCallback allows an action to fire before the menu is displayed\n // an example usage would be closing a tooltip\n if (openCallback) {\n if (openCallback(data, index) === false) {\n return uid;\n }\n }\n\n let contextMenuSelection = d3.select('.d3-context-menu-' + uid)\n .style('display', 'block');\n\n if (initialPos == null) {\n d3.select('.d3-context-menu-' + uid)\n .style('left', (d3.event.pageX - 2) + 'px')\n .style('top', (d3.event.pageY - 2) + 'px')\n } else {\n d3.select('.d3-context-menu-' + uid)\n .style('left', initialPos[0] + 'px')\n .style('top', initialPos[1] + 'px')\n }\n\n // check if the menu disappears off the side of the window\n let boundingRect = contextMenuSelection.node().getBoundingClientRect();\n\n if (boundingRect.left + boundingRect.width > window.innerWidth || orientation == 'left') {\n orientation = 'left';\n\n // menu goes of the end of the window, position it the other way\n if (initialPos == null) {\n // place the menu where the user clicked\n d3.select('.d3-context-menu-' + uid)\n .style('left', (d3.event.pageX - 2 - boundingRect.width) + 'px')\n .style('top', (d3.event.pageY - 2) + 'px')\n } else {\n if (parentStart != null) {\n d3.select('.d3-context-menu-' + uid)\n .style('left', (parentStart[0] - boundingRect.width) + 'px')\n .style('top', parentStart[1] + 'px')\n } else {\n d3.select('.d3-context-menu-' + uid)\n .style('left', (initialPos[0] - boundingRect.width) + 'px')\n .style('top', initialPos[1] + 'px')\n }\n }\n \n }\n\n // display context menu\n\n if (previouslyMouseUp)\n return uid;\n\n d3.event.preventDefault();\n d3.event.stopPropagation();\n //d3.event.stopImmediatePropagation();\n //\n return uid;\n };\n};\n","var numberSort = function(a,b) { return a - b; };\n\nexport function arraysEqual(a, b) {\n // courtesy of \n // http://stackoverflow.com/questions/3115982/how-to-check-if-two-arrays-are-equal-with-javascript\n if (a === b) return true;\n if (a === null || b === null) return false;\n if (a.length != b.length) return false;\n\n // If you don't care about the order of the elements inside\n // the array, you should sort both arrays here.\n\n for (var i = 0; i < a.length; ++i) {\n if (a[i] !== b[i]) return false;\n }\n return true;\n}\n\nexport function RNAUtilities() {\n var self = this;\n\n // the brackets to use when constructing dotbracket strings\n // with pseudoknots\n self.bracketLeft = \"([{abcdefghijklmnopqrstuvwxyz\".split(\"\");\n\n self.inverseBrackets = function(bracket) {\n var res = {};\n for (var i = 0; i < bracket.length; i++) {\n res[bracket[i]] = i;\n }\n return res;\n };\n\n self.maximumMatching = function maximumMatching(pt){\n // Courtesy of the great Ronny Lorenz\n\n var n = pt[0];\n var TURN = 0; //minimal number of nucleotides in the hairpin\n\n /* array init */\n var mm = new Array(n + 1);\n for(var i = 0; i <= n; i++){\n mm[i] = new Array(n + 1);\n for(var j = i; j <= n; j++)\n mm[i][j] = 0;\n }\n var maximum = 0;\n\n /* actual computation */\n for(var i = n - TURN - 1; i > 0; i--)\n\n for(var j = i + TURN + 1; j <= n; j++){\n maximum = mm[i][j-1];\n\n for(var l = j - TURN - 1; l >= i; l--) {\n if(pt[l] === j) {\n\n // we have a base pair here\n maximum = Math.max(maximum, ((l > i) ? mm[i][l-1] : 0) + 1 + ((j - l - 1 > 0) ? mm[l+1][j-1] : 0));\n }\n }\n\n mm[i][j] = maximum;\n }\n\n maximum = mm[1][n];\n\n return mm;\n };\n\n self.backtrackMaximumMatching = function(mm, oldPt) {\n var pt = Array.apply(null, \n Array(mm.length)).map(function() { return 0 }); \n //create an array containing zeros\n\n self.mmBt(mm, pt, oldPt, 1, mm.length-1);\n return pt;\n }\n\n self.mmBt = function(mm, pt, oldPt, i, j){\n // Create a pairtable from the backtracking\n var maximum = mm[i][j];\n var TURN = 0;\n\n if(j - i - 1 < TURN) return; /* no more pairs */\n\n if(mm[i][j-1] == maximum){ /* j is unpaired */\n self.mmBt(mm, pt, oldPt, i, j-1);\n return;\n }\n\n for(var q = j - TURN - 1; q >= i; q--){ /* j is paired with some q */\n if (oldPt[j] !== q)\n continue;\n\n var leftPart = (q > i) ? mm[i][q-1] : 0;\n var enclosedPart = (j - q - 1 > 0) ? mm[q+1][j-1] : 0;\n\n if(leftPart + enclosedPart + 1 == maximum) {\n // there's a base pair between j and q\n pt[q] = j;\n pt[j] = q;\n\n if(i < q) \n self.mmBt(mm, pt, oldPt, i, q - 1);\n\n self.mmBt(mm, pt, oldPt, q + 1, j - 1);\n return;\n }\n }\n\n //alert(i + \",\" + j + \": backtracking failed!\");\n console.log('FAILED!!!' + i + ',' + j + ': backtracking failed!');\n\n };\n\n self.dotbracketToPairtable = function(dotbracket) {\n // create an array and initialize it to 0\n var pt = Array.apply(null, new Array(dotbracket.length + 1)).map(Number.prototype.valueOf,0);\n \n // the first element is always the length of the RNA molecule\n pt[0] = dotbracket.length;\n\n // store the pairing partners for each symbol\n var stack = {};\n for (var i = 0; i < self.bracketLeft.length; i++) {\n stack[i] = [];\n }\n\n // lookup the index of each symbol in the bracket array\n var inverseBracketLeft = self.inverseBrackets(self.bracketLeft);\n var inverseBracketRight = self.inverseBrackets(self.bracketRight);\n\n for (var i = 0; i < dotbracket.length; i++) {\n var a = dotbracket[i];\n var ni = i + 1;\n\n if (a == '.' || a == 'o') {\n // unpaired\n pt[ni] = 0;\n } else {\n if (a in inverseBracketLeft) {\n // open pair?\n stack[inverseBracketLeft[a]].push(ni);\n } else if (a in inverseBracketRight){\n // close pair?\n var j = stack[inverseBracketRight[a]].pop();\n\n pt[ni] = j;\n pt[j] = ni;\n } else if (a == '&'){\n // there is a sequence break here, ignore it\n } else {\n throw \"Unknown symbol in dotbracket string\";\n }\n }\n }\n\n for (var key in stack) {\n if (stack[key].length > 0) {\n throw \"Unmatched base at position \" + stack[key][0];\n }\n }\n\n return pt;\n };\n\n self.insertIntoStack = function(stack, i, j) {\n var k = 0;\n while (stack[k].length > 0 && stack[k][stack[k].length - 1] < j) {\n k += 1;\n }\n\n stack[k].push(j);\n return k;\n };\n\n self.deleteFromStack = function(stack, j) {\n var k = 0;\n while (stack[k].length === 0 || stack[k][stack[k].length-1] != j) {\n k += 1;\n }\n stack[k].pop();\n return k;\n };\n\n self.pairtableToDotbracket = function(pt) {\n // store the pairing partners for each symbol\n var stack = {};\n for (var i = 0; i < pt[0]; i++) {\n stack[i] = [];\n }\n\n var seen = {};\n var res = \"\";\n var i;\n for (var i = 1; i < pt[0] + 1; i++) {\n if (pt[i] !== 0 && pt[i] in seen) {\n throw \"Invalid pairtable contains duplicate entries\";\n }\n seen[pt[i]] = true;\n\n if (pt[i] === 0) {\n res += '.';\n } else {\n if (pt[i] > i) {\n res += self.bracketLeft[self.insertIntoStack(stack, i, pt[i])];\n } else {\n res += self.bracketRight[self.deleteFromStack(stack, i)];\n }\n }\n }\n\n return res;\n };\n\n self.findUnmatched = function(pt, from, to) {\n /*\n * Find unmatched nucleotides in this molecule.\n */\n var toRemove = [];\n var unmatched = [];\n\n var origFrom = from;\n var origTo = to;\n var i;\n\n for (var i = from; i <= to; i++)\n if (pt[i] !== 0 && (pt[i] < from || pt[i] > to))\n unmatched.push([i,pt[i]]);\n\n for (var i = origFrom; i <= origTo; i++) {\n while (pt[i] === 0 && i <= origTo) i++;\n\n to = pt[i];\n\n while (pt[i] === to) {\n i++;\n to--;\n }\n \n toRemove = toRemove.concat(self.findUnmatched(pt, i, to));\n }\n\n if (unmatched.length > 0)\n toRemove.push(unmatched);\n\n return toRemove;\n };\n\n self.removePseudoknotsFromPairtable = function(pt) {\n /* Remove the pseudoknots from this structure in such a fashion\n * that the least amount of base-pairs need to be broken\n *\n * The pairtable is manipulated in place and a list of tuples\n * indicating the broken base pairs is returned.\n */\n\n var mm = self.maximumMatching(pt);\n var newPt = self.backtrackMaximumMatching(mm, pt);\n var removed = [];\n\n for (var i = 1; i < pt.length; i++) {\n if (pt[i] < i)\n continue;\n\n if (newPt[i] != pt[i]) {\n removed.push([i, pt[i]]);\n pt[pt[i]] = 0;\n pt[i] = 0;\n }\n }\n\n return removed;\n };\n\n self.ptToElements = function(pt, level, i, j, dotBracketBreaks) {\n /* Convert a pair table to a list of secondary structure \n * elements:\n *\n * [['s',1,[2,3]]\n *\n * The 's' indicates that an element can be a stem. It can also be\n * an interior loop ('i'), a hairpin loop ('h') or a multiloop ('m')\n *\n * The second number (1 in this case) indicates the depth or\n * how many base pairs have to be broken to get to this element.\n *\n * Finally, there is the list of nucleotides which are part of\n * of this element.\n */\n var elements = [];\n var u5 = [i-1];\n var u3 = [j+1];\n\n if (arguments.length < 5)\n dotBracketBreaks = [];\n\n if (i > j)\n return [];\n \n //iterate over the unpaired regions on either side\n //this is either 5' and 3' unpaired if level == 0\n //or an interior loop or a multiloop\n for (; pt[i] === 0; i++) { u5.push(i); }\n for (; pt[j] === 0; j--) { u3.push(j); }\n\n if (i > j) {\n //hairpin loop or one large unpaired molecule\n u5.push(i);\n if (level === 0)\n return [['e',level, u5.sort(numberSort)]];\n else {\n // check to see if we have chain breaks due\n // to multiple strands in the input\n var external = false;\n var left = [];\n var right = [];\n for (var k = 0; k < u5.length; k++) {\n if (external)\n right.push(u5[k]);\n else\n left.push(u5[k]);\n\n if (dotBracketBreaks.indexOf(u5[k]) >= 0)\n external = true;\n }\n\n if (external) {\n return [['h',level, u5.sort(numberSort)]];\n }\n else\n // if not, this is a simple hairpin loop\n return [['h',level, u5.sort(numberSort)]];\n }\n }\n\n if (pt[i] != j) {\n //multiloop\n var m = u5;\n var k = i;\n\n // the nucleotide before and the starting nucleotide\n m.push(k);\n while (k <= j) {\n // recurse into a stem\n elements = elements.concat(self.ptToElements(pt, level, k, pt[k], dotBracketBreaks));\n\n // add the nucleotides between stems\n m.push(pt[k]);\n k = pt[k] + 1;\n for (; pt[k] === 0 && k <= j; k++) { m.push(k);}\n m.push(k);\n }\n m.pop();\n m = m.concat(u3);\n \n if (m.length > 0) {\n if (level === 0)\n elements.push(['e', level, m.sort(numberSort)]);\n else\n elements.push(['m', level, m.sort(numberSort)]);\n }\n \n return elements;\n }\n\n if (pt[i] === j) {\n //interior loop\n u5.push(i);\n u3.push(j);\n\n var combined = u5.concat(u3);\n if (combined.length > 4) {\n if (level === 0)\n elements.push(['e',level, u5.concat(u3).sort(numberSort)]);\n else\n elements.push(['i',level, u5.concat(u3).sort(numberSort)]);\n }\n } \n\n var s = [];\n //go through the stem\n while (pt[i] === j && i < j) {\n //one stem\n s.push(i);\n s.push(j);\n\n i += 1;\n j -= 1;\n\n level += 1;\n }\n\n u5 = [i-1];\n u3 = [j+1];\n elements.push(['s', level, s.sort(numberSort)]);\n\n return elements.concat(self.ptToElements(pt, level, i, j, dotBracketBreaks));\n };\n\n}\n\nexport var rnaUtilities = new RNAUtilities();\n\nexport function ColorScheme(colorsText) {\n var self = this;\n self.colorsText = colorsText;\n\n self.parseRange = function(rangeText) {\n //parse a number range such as 1-10 or 3,7,9 or just 7\n var parts = rangeText.split(',')\n var nums = [];\n\n for (var i = 0; i < parts.length; i++) {\n //could be 1 or 10-11 or something like that\n var parts1 = parts[i].split('-');\n\n if (parts1.length == 1)\n nums.push(parseInt(parts1[0]));\n else if (parts1.length == 2) {\n var from = parseInt(parts1[0]);\n var to = parseInt(parts1[1]);\n\n // add each number in this range\n for (var j = from; j <= to; j++) \n nums.push(j)\n } else {\n console.log('Malformed range (too many dashes):', rangeText);\n }\n }\n\n return nums;\n }\n\n self.parseColorText = function(colorText) {\n /* Parse the text of an RNA color string. Instructions and description\n * of the format are given below.\n *\n * The return is a json double dictionary indexed first by the \n * molecule name, then by the nucleotide. This is then applied\n * by force.js to the RNAs it is displaying. When no molecule\n * name is specified, the color is applied to all molecules*/\n var lines = colorText.split('\\n');\n var currMolecule = '';\n var counter = 1;\n var colorsJson = {colorValues: {'':{}}, range:['white', 'steelblue']};\n var domainValues = [];\n\n\n for (var i = 0; i < lines.length; i++) {\n\n if (lines[i][0] == '>') {\n // new molecule\n currMolecule = lines[i].trim().slice(1);\n counter = 1;\n\n colorsJson.colorValues[currMolecule] = {};\n continue;\n }\n\n let words = lines[i].trim().split(/[\\s]+/);\n\n for (var j = 0; j < words.length; j++) {\n if (isNaN(words[j])) {\n if (words[j].search('range') === 0) {\n //there's a color scale in this entry\n let parts = words[j].split('=');\n let partsRight = parts[1].split(':')\n colorsJson.range = [partsRight[0], partsRight[1]];\n continue;\n }\n\n if (words[j].search('domain') == 0) {\n //there's a color scale in this entry\n let parts = words[j].split('=');\n let partsRight = parts[1].split(':')\n colorsJson.domain = [partsRight[0], partsRight[1]];\n continue;\n }\n\n // it's not a number, should be a combination \n // of a number (nucleotide #) and a color\n let parts = words[j].split(':');\n let nums = self.parseRange(parts[0]);\n let color = parts[1]\n\n for (var k = 0; k < nums.length; k++) {\n if (isNaN(color)) {\n colorsJson.colorValues[currMolecule][nums[k]] = color;\n } else {\n colorsJson.colorValues[currMolecule][nums[k]] = +color;\n domainValues.push(Number(color));\n }\n }\n } else {\n //it's a number, so we add it to the list of values\n //seen for this molecule\n colorsJson.colorValues[currMolecule][counter] = Number(words[j]);\n counter += 1;\n\n domainValues.push(Number(words[j]));\n }\n }\n }\n\n if (!('domain' in colorsJson))\n colorsJson.domain = [Math.min.apply(null, domainValues), Math.max.apply(null, domainValues)];\n\n self.colorsJson = colorsJson;\n\n return self;\n };\n\n self.normalizeColors = function() {\n /* \n * Normalize the passed in values so that they range from\n * 0 to 1\n */\n var value;\n\n for (var moleculeName in self.colorsJson) {\n var minNum = Number.MAX_VALUE;\n var maxNum = Number.MIN_VALUE;\n\n // iterate once to find the min and max values;\n for (var resnum in self.colorsJson.colorValues[moleculeName]) {\n value = self.colorsJson.colorValues[moleculeName][resnum];\n if (typeof value == 'number') {\n if (value < minNum)\n minNum = value;\n if (value > maxNum)\n maxNum = value;\n }\n }\n\n // iterate again to normalize\n for (resnum in self.colorsJson.colorValues[moleculeName]) {\n value = self.colorsJson.colorValues[moleculeName][resnum];\n if (typeof value == 'number') {\n self.colorsJson.colorValues[moleculeName][resnum] = (value - minNum ) / (maxNum - minNum);\n }\n }\n }\n\n return self;\n };\n\n self.parseColorText(self.colorsText);\n return self;\n}\n","import {arraysEqual,RNAUtilities,rnaUtilities} from './rnautils.js';\nimport slugid from 'slugid';\n\nvar numberSort = function(a,b) { return a - b; };\n\nif (typeof(String.prototype.trim) === 'undefined') {\n String.prototype.trim = function() {\n return String(this).replace(/^\\s+|\\s+$/g, '');\n };\n}\n\nexport function ProteinGraph(structName, size, uid) {\n var self = this;\n\n self.type = 'protein';\n self.size = size;\n self.nodes = [{'name': 'P',\n 'num': 1,\n 'radius': 3 * Math.sqrt(size),\n 'rna': self,\n 'nodeType': 'protein',\n 'structName': structName,\n 'elemType': 'p',\n 'size': size,\n 'uid': slugid.nice()}];\n\n self.links = [];\n self.uid = slugid.nice();\n\n self.addUids = function(uids) {\n for (let i = 0; i < uids.length; i++)\n self.nodes[i].uid = uids[i];\n\n return self;\n };\n\n self.getUids = function() {\n /* Get the positions of each node so that they\n * can be passed to elementsToJson later\n */\n uids = [];\n for (let i = 0; i < self.dotbracket.length; i++)\n uids.push(self.nodes[i].uid);\n\n return uids;\n };\n\n}\n\nexport function RNAGraph(seq = '', dotbracket = '', structName = '', startNumber = 1) {\n var self = this;\n\n self.type = 'rna';\n self.circularizeExternal = false;\n self.seq = seq;\n self.dotbracket = dotbracket; //i.e. ..((..))..\n self.structName = structName;\n self.circular = false;\n\n if (self.dotbracket.slice(-1) == '*') {\n //circular RNA\n self.dotbracket = self.dotbracket.slice(0, -1);\n self.circular = true;\n }\n\n self.uid = slugid.nice();\n\n self.elements = []; //store the elements and the\n //nucleotides they contain\n self.pseudoknotPairs = [];\n self.nucsToNodes = {};\n\n self.addUids = function(uids) {\n let nucleotideNodes = self.nodes.filter(function(d) { return d.nodeType == 'nucleotide'; });\n\n for (let i = 0; i < uids.length && i < nucleotideNodes.length; i++) {\n nucleotideNodes[i].uid = uids[i];\n }\n\n return self;\n };\n\n self.computePairtable = function() {\n self.pairtable = rnaUtilities.dotbracketToPairtable(self.dotbracket);\n };\n\n self.removeBreaks = function(targetString) {\n // Collect the indexes of the chain breaks in the targetString\n // chain breaks are indicated by '&'\n var breaks = [];\n for (var i = 0; i < targetString.length; i++) {\n if (targetString[i] === '&') {\n breaks.push(i);\n }\n }\n\n return {targetString: targetString, breaks: breaks};\n };\n\n var ret = self.removeBreaks(self.dotbracket);\n // commented out to avoid removing the break node, let's keep it in the dotbracket\n // self.dotbracket = ret.targetString;\n self.dotBracketBreaks = ret.breaks;\n\n ret = self.removeBreaks(self.seq);\n // commented out to avoid removing the break node, let's keep it in the sequence\n // self.seq = ret.targetString;\n self.seqBreaks = ret.breaks;\n\n self.rnaLength = self.dotbracket.length;\n\n if (!arraysEqual(self.dotBracketBreaks, self.seqBreaks)) {\n console.log('WARNING: Sequence and structure breaks not equal');\n console.log('WARNING: Using the breaks in the structure');\n }\n\n self.computePairtable();\n\n self.addPositions = function(nodeType, positions) {\n let labelNodes = self.nodes.filter(function(d) { return d.nodeType == nodeType; });\n\n for (let i = 0; i < labelNodes.length; i++) {\n labelNodes[i].x = positions[i][0];\n labelNodes[i].y = positions[i][1];\n }\n\n return self;\n };\n\n self.breakNodesToFakeNodes = function() {\n // convert all the nodes following breaks to fake nodes\n let labelNodes = self.nodes.filter(function(d) { return d.nodeType == 'nucleotide'; });\n\n // if a node was an artifical break node, convert it to a middle\n for (let i = 0; i < labelNodes.length; i++) {\n if (self.dotBracketBreaks.indexOf(i) >= 0) {\n labelNodes[i].nodeType = 'middle';\n // commented out to avoid removing the node after the break\n // labelNodes[i+1].nodeType = 'middle';\n }\n }\n\n for (let i = 0; i < self.elements.length; i++) {\n var broken = false;\n\n // change the elemType of the other nodes in the element containing\n // the break\n for (let j = 0; j < self.elements[i][2].length; j++) {\n if (self.dotBracketBreaks.indexOf(self.elements[i][2][j]) >= 0)\n broken = true;\n }\n\n if (broken) {\n self.elements[i][2].map(function(x) {\n if (x == 0)\n return;\n self.nodes[x-1].elemType = 'e';\n });\n } else {\n self.elements[i][2].map(function(x) {\n if (x == 0)\n return;\n self.nodes[x-1].elemType = self.elements[i][0];\n });\n }\n }\n return self;\n };\n\n self.getPositions = function(nodeType) {\n var positions = [];\n let nucleotideNodes = self.nodes.filter(function(d) { return d.nodeType == nodeType; });\n\n for (let i = 0; i < nucleotideNodes.length; i++)\n positions.push([nucleotideNodes[i].x, nucleotideNodes[i].y]);\n\n return positions;\n };\n\n self.getUids = function() {\n /* Get the positions of each node so that they\n * can be passed to elementsToJson later\n */\n var uids = [];\n for (let i = 0; i < self.dotbracket.length; i++)\n uids.push(self.nodes[i].uid);\n\n return uids;\n };\n\n self.reinforceStems = function() {\n var pt = self.pairtable;\n let relevantElements = self.elements.filter( function(d) {\n return d[0] == 's' && d[2].length >= 4;\n });\n\n for (let i = 0; i < relevantElements.length; i++) {\n let allNucs = relevantElements[i][2];\n let nucs = allNucs.slice(0, allNucs.length / 2);\n\n for (let j = 0; j < nucs.length-1; j++) {\n self.addFakeNode([nucs[j], nucs[j+1], pt[nucs[j+1]], pt[nucs[j]]]);\n }\n }\n\n return self;\n };\n\n self.reinforceLoops = function() {\n /*\n * Add a set of fake nodes to enforce the structure\n */\n var filterNucs = function(d) {\n return d !== 0 && d <= self.dotbracket.length;\n };\n\n for (let i = 0; i < self.elements.length; i++) {\n if (self.elements[i][0] == 's' || (!self.circularizeExternal && self.elements[i][0] == 'e'))\n continue;\n\n var nucs = self.elements[i][2].filter(filterNucs);\n\n if (self.elements[i][0] == 'e') {\n var newNode1 = {'name': '',\n 'num': -3,\n //'radius': 18 * radius -6,\n 'radius': 0,\n 'rna': self,\n 'nodeType': 'middle',\n 'elemType': 'f',\n 'nucs': [],\n 'x': self.nodes[self.rnaLength-1].x,\n 'y': self.nodes[self.rnaLength-1].y,\n 'px': self.nodes[self.rnaLength-1].px,\n 'py': self.nodes[self.rnaLength-1].py,\n 'uid': slugid.nice() };\n var newNode2 = {'name': '',\n 'num': -2,\n //'radius': 18 * radius -6,\n 'radius': 0,\n 'rna': self,\n 'nodeType': 'middle',\n 'elemType': 'f',\n 'nucs': [],\n 'x': self.nodes[0].x,\n 'y': self.nodes[0].y,\n 'px': self.nodes[0].px,\n 'py': self.nodes[0].py,\n 'uid': slugid.nice() };\n\n nucs.push(self.nodes.length+1);\n nucs.push(self.nodes.length+2);\n self.nodes.push(newNode1);\n self.nodes.push(newNode2);\n }\n\n\n self.addFakeNode(nucs);\n }\n\n return self;\n };\n\n self.updateLinkUids = function() {\n for (let i = 0; i < self.links.length; i++) {\n self.links[i].uid = self.links[i].source.uid + self.links[i].target.uid;\n }\n\n return self;\n };\n\n self.addFakeNode = function(nucs) {\n var linkLength = 18; //make sure this is consistent with the value in force.js\n var nodeWidth = 6;\n var angle = (3.1415 * 2) / (2 * nucs.length);\n var radius = linkLength / (2 * Math.tan(angle));\n\n var fakeNodeUid = '';\n\n for (let i = 0; i < nucs.length; i++)\n fakeNodeUid += self.nodes[nucs[i]-1].uid;\n\n var newNode = {'name': '',\n 'num': -1,\n //'radius': 18 * radius -6,\n 'radius': radius,\n 'rna': self,\n 'nodeType': 'middle',\n 'elemType': 'f',\n 'nucs': nucs,\n 'uid': fakeNodeUid };\n self.nodes.push(newNode);\n\n var newX = 0;\n var newY = 0;\n var coordsCounted = 0;\n\n angle = (nucs.length - 2) * 3.14159 / (2 * nucs.length);\n radius = 0.5 / Math.cos(angle);\n\n for (let j = 0; j < nucs.length; j++) {\n if (nucs[j] === 0 || nucs[j] > self.dotbracket.length)\n continue;\n\n //link to the center node\n self.links.push({'source': self.nodes[nucs[j] - 1],\n 'target': self.nodes[self.nodes.length-1],\n 'linkType': 'fake',\n 'value': radius,\n 'uid': slugid.nice() });\n\n if (nucs.length > 4) {\n //link across the loop\n self.links.push({'source': self.nodes[nucs[j] - 1],\n 'target': self.nodes[nucs[(j + Math.floor(nucs.length / 2)) % nucs.length] - 1],\n 'linkType': 'fake',\n 'value': radius * 2,\n 'uid': slugid.nice() });\n }\n\n var ia = ((nucs.length - 2) * 3.14159) / nucs.length;\n var c = 2 * Math.cos(3.14159 / 2 - ia / 2);\n //link to over-neighbor\n self.links.push({'source': self.nodes[nucs[j] - 1],\n 'target': self.nodes[nucs[(j + 2) % nucs.length] - 1],\n 'linkType': 'fake',\n 'value': c});\n\n // calculate the mean of the coordinats in this loop\n // and place the fake node there\n var fromNode = self.nodes[nucs[j]-1];\n if ('x' in fromNode) {\n newX += fromNode.x;\n newY += fromNode.y;\n\n coordsCounted += 1;\n }\n }\n\n if (coordsCounted > 0) {\n // the nucleotides had set positions so we can calculate the position\n // of the fake node\n newNode.x = newX / coordsCounted;\n newNode.y = newY / coordsCounted;\n newNode.px = newNode.x;\n newNode.py = newNode.y;\n }\n\n return self;\n };\n\n self.connectFakeNodes = function() {\n var linkLength = 18;\n\n // We want to be able to connect all of the fake nodes\n // and create a structure consisting of just them\n var filterOutNonFakeNodes = function(d) {\n return d.nodeType == 'middle';\n }\n\n var nucsToNodes = {};\n var fakeNodes = self.nodes.filter(filterOutNonFakeNodes);\n var linked = {};\n\n // initialize the nucleotides to nodes\n for (var i = 1; i <= self.nodes.length; i++)\n nucsToNodes[i] = [];\n\n for (var i = 0; i < fakeNodes.length; i++) {\n var thisNode = fakeNodes[i];\n\n // each fake node represents a certain set of nucleotides (thisNode.nucs)\n for (var j = 0; j < thisNode.nucs.length; j++) {\n var thisNuc = thisNode.nucs[j];\n\n // check to see if this nucleotide has been seen in another fake node\n // if it has, then we add a link between the two nodes\n for (var k = 0; k < nucsToNodes[thisNuc].length; k++) {\n if (JSON.stringify([nucsToNodes[thisNuc][k].uid, thisNode.uid].sort()) in linked)\n continue; //already linked\n\n var distance = nucsToNodes[thisNuc][k].radius + thisNode.radius;\n\n self.links.push({'source': nucsToNodes[thisNuc][k],\n 'target': thisNode,\n 'value': distance / linkLength,\n 'linkType': 'fake_fake'});\n\n // note that we've already seen this link\n linked[JSON.stringify([nucsToNodes[thisNuc][k].uid, thisNode.uid].sort())] = true;\n }\n\n nucsToNodes[thisNuc].push(thisNode);\n }\n }\n\n return self;\n\n };\n\n self.addExtraLinks = function(extraLinks) {\n if (typeof extraLinks == 'undefined')\n return self;\n\n for (var i = 0; i < extraLinks.length; i++) {\n var source = self.getNodeFromNucleotides(extraLinks[i].from);\n var target = self.getNodeFromNucleotides(extraLinks[i].to);\n\n var newLink = {'source': source, 'target': target, 'linkType': 'extra',\n 'extraLinkType': extraLinks[i].linkType, 'uid': slugid.nice() };\n\n self.links.push(newLink);\n }\n\n return self;\n }\n\n\n self.elementsToJson = function() {\n /* Convert a set of secondary structure elements to a json\n * representation of the graph that can be used with d3's\n * force-directed layout to generate a visualization of\n * the structure.\n */\n var pt = self.pairtable;\n var elements = self.elements;\n\n self.nodes = [];\n self.links = [];\n\n //create a reverse lookup so we can find out the type\n //of element that a node is part of\n var elemTypes = {};\n\n //sort so that we count stems last\n self.elements.sort();\n\n for (let i = 0; i < self.elements.length; i++) {\n var nucs = self.elements[i][2];\n for (let j = 0; j < nucs.length; j++) {\n elemTypes[nucs[j]] = self.elements[i][0];\n }\n }\n\n for (let i = 1; i <= pt[0]; i++) {\n var nodeName = self.seq[i-1];\n\n // remove only the breaks that are in the sequence\n if (self.dotBracketBreaks.indexOf(i-1) >= 0) {\n nodeName = '';\n }\n\n //create a node for each nucleotide\n self.nodes.push({'name': nodeName,\n 'num': startNumber + i - 1,\n 'radius': 5,\n 'rna': self,\n 'nodeType': 'nucleotide',\n 'structName': self.structName,\n 'elemType': elemTypes[i],\n 'uid': slugid.nice(),\n 'linked': false});\n }\n\n for (let i = 0; i < self.nodes.length; i++) {\n if (i === 0)\n self.nodes[i].prevNode = null;\n else {\n self.nodes[i].prevNode = self.nodes[i-1];\n }\n\n if (i == self.nodes.length-1)\n self.nodes[i].nextNode = null;\n else {\n self.nodes[i].nextNode = self.nodes[i+1];\n }\n }\n\n for (let i = 1; i <= pt[0]; i++) {\n\n if (pt[i] !== 0) {\n // base-pair links\n self.links.push({'source': self.nodes[i-1],\n 'target': self.nodes[pt[i]-1],\n 'linkType': 'basepair',\n 'value': 1,\n 'uid': slugid.nice() });\n }\n\n if (i > 1) {\n // backbone links\n // unlink only the break and the nucleotide before it\n if (self.dotBracketBreaks.indexOf(i-1) === -1 &&\n self.dotBracketBreaks.indexOf(i-2) == -1) {\n // there is no break in the strands here\n // we can add a backbone link\n self.links.push({'source': self.nodes[i-2],\n 'target': self.nodes[i-1],\n 'linkType': 'backbone',\n 'value': 1,\n 'uid': slugid.nice() });\n self.nodes[i-1].linked = true;\n }\n }\n }\n\n //add the pseudoknot links\n for (let i = 0; i < self.pseudoknotPairs.length; i++) {\n self.links.push({'source': self.nodes[self.pseudoknotPairs[i][0]-1],\n 'target': self.nodes[self.pseudoknotPairs[i][1]-1],\n 'linkType': 'pseudoknot',\n 'value': 1,\n 'uid': slugid.nice()});\n }\n\n if (self.circular) {\n self.links.push({'source': self.nodes[0],\n 'target': self.nodes[self.rnaLength-1],\n 'linkType': 'backbone',\n 'value': 1,\n 'uid': slugid.nice() });\n\n }\n\n return self;\n };\n\n self.ptToElements = function(pt, level, i, j) {\n /* Convert a pair table to a list of secondary structure\n * elements:\n *\n * [['s',1,[2,3]]\n *\n * The 's' indicates that an element can be a stem. It can also be\n * an interior loop ('i'), a hairpin loop ('h') or a multiloop ('m')\n *\n * The second number (1 in this case) indicates the depth or\n * how many base pairs have to be broken to get to this element.\n *\n * Finally, there is the list of nucleotides which are part of\n * of this element.\n */\n var elements = [];\n var u5 = [i-1];\n var u3 = [j+1];\n\n if (i > j)\n return [];\n\n //iterate over the unpaired regions on either side\n //this is either 5' and 3' unpaired if level == 0\n //or an interior loop or a multiloop\n for (; pt[i] === 0; i++) { u5.push(i); }\n for (; pt[j] === 0; j--) { u3.push(j); }\n\n if (i > j) {\n //hairpin loop or one large unpaired molecule\n u5.push(i);\n if (level === 0)\n return [['e',level, u5.sort(numberSort)]];\n else {\n // check to see if we have chain breaks due\n // to multiple strands in the input\n var external = false;\n var left = [];\n var right = [];\n for (var k = 0; k < u5.length; k++) {\n if (external)\n right.push(u5[k]);\n else\n left.push(u5[k]);\n\n if (self.dotBracketBreaks.indexOf(u5[k]) >= 0)\n external = true;\n }\n\n if (external) {\n return [['h',level, u5.sort(numberSort)]];\n }\n else\n // if not, this is a simple hairpin loop\n return [['h',level, u5.sort(numberSort)]];\n }\n }\n\n if (pt[i] != j) {\n //multiloop\n var m = u5;\n var k = i;\n\n // the nucleotide before and the starting nucleotide\n m.push(k);\n while (k <= j) {\n // recurse into a stem\n elements = elements.concat(self.ptToElements(pt, level, k, pt[k]));\n\n // add the nucleotides between stems\n m.push(pt[k]);\n k = pt[k] + 1;\n for (; pt[k] === 0 && k <= j; k++) { m.push(k);}\n m.push(k);\n }\n m.pop();\n m = m.concat(u3);\n\n if (m.length > 0) {\n if (level === 0)\n elements.push(['e', level, m.sort(numberSort)]);\n else\n elements.push(['m', level, m.sort(numberSort)]);\n }\n\n return elements;\n }\n\n if (pt[i] === j) {\n //interior loop\n u5.push(i);\n u3.push(j);\n\n var combined = u5.concat(u3);\n if (combined.length > 4) {\n if (level === 0)\n elements.push(['e',level, u5.concat(u3).sort(numberSort)]);\n else\n elements.push(['i',level, u5.concat(u3).sort(numberSort)]);\n }\n }\n\n var s = [];\n //go through the stem\n while (pt[i] === j && i < j) {\n //one stem\n s.push(i);\n s.push(j);\n\n i += 1;\n j -= 1;\n\n level += 1;\n }\n\n u5 = [i-1];\n u3 = [j+1];\n elements.push(['s', level, s.sort(numberSort)]);\n\n return elements.concat(self.ptToElements(pt, level, i, j));\n };\n\n self.addLabels = function(startNumber = 1, labelInterval = 10) {\n if (labelInterval === 0)\n return self;\n\n for (let i = 1; i <= self.rnaLength; i++) {\n // add labels\n if (i % labelInterval === 0) {\n //create a node for each label\n let newX, newY;\n\n let thisNode = self.nodes[i-1];\n let prevNode, nextNode;\n let prevVec, nextVec;\n\n if (self.rnaLength == 1) {\n nextVec = [thisNode.x - 15, thisNode.y];\n prevVec = [thisNode.x - 15, thisNode.y];\n } else {\n // if we're labelling the first node, then label it in relation to the last\n if (i == 1)\n prevNode = self.nodes[self.rnaLength - 1];\n else\n prevNode = self.nodes[i - 2];\n\n // if we're labelling the last node, then label it in relation to the first\n if (i == self.rnaLength)\n nextNode = self.nodes[0];\n else\n nextNode = self.nodes[i];\n\n // this nucleotide and its neighbors are paired\n if (self.pairtable[nextNode.num - startNumber+1] !== 0 &&\n self.pairtable[prevNode.num - startNumber+1] !== 0 &&\n self.pairtable[thisNode.num - startNumber+1] !== 0) {\n\n prevNode = nextNode = self.nodes[self.pairtable[thisNode.num - startNumber+1]-1];\n }\n\n // this node is paired but at least one of its neighbors is unpaired\n // place the label in the direction of the two neighbors\n if (self.pairtable[thisNode.num - startNumber+1] !== 0 && (\n self.pairtable[nextNode.num - startNumber+1] === 0 ||\n self.pairtable[prevNode.num - startNumber+1] === 0)) {\n nextVec = [thisNode.x - nextNode.x, thisNode.y - nextNode.y];\n prevVec = [thisNode.x - prevNode.x, thisNode.y - prevNode.y];\n\n } else {\n nextVec = [nextNode.x - thisNode.x, nextNode.y - thisNode.y];\n prevVec = [prevNode.x - thisNode.x, prevNode.y - thisNode.y];\n }\n }\n\n var combinedVec = [nextVec[0] + prevVec[0], nextVec[1] + prevVec[1]];\n var vecLength = Math.sqrt(combinedVec[0] * combinedVec[0] + combinedVec[1] * combinedVec[1]);\n var normedVec = [combinedVec[0] / vecLength, combinedVec[1] / vecLength];\n var offsetVec = [-15 * normedVec[0], -15 * normedVec[1]];\n\n newX = self.nodes[i-1].x + offsetVec[0];\n newY = self.nodes[i-1].y + offsetVec[1];\n\n var newNode = {'name': i + startNumber -1,\n 'num': -1,\n 'radius': 6,\n 'rna': self,\n 'nodeType': 'label',\n 'structName': self.structName,\n 'elemType': 'l',\n 'x': newX,\n 'y': newY,\n 'px': newX,\n 'py': newY,\n 'uid': slugid.nice() };\n var newLink = {'source': self.nodes[i-1],\n 'target': newNode,\n 'value': 1,\n 'linkType': 'label_link',\n 'uid': slugid.nice() };\n\n self.nodes.push(newNode);\n self.links.push(newLink);\n }\n }\n\n return self;\n };\n\n self.recalculateElements = function() {\n self.removePseudoknots();\n self.elements = self.ptToElements(self.pairtable, 0, 1, self.dotbracket.length);\n\n if (self.circular) {\n //check to see if the external loop is a hairpin or a multiloop\n let externalLoop = self.elements.filter(function(d) { if (d[0] == 'e') return true; });\n\n if (externalLoop.length > 0) {\n eloop = externalLoop[0];\n nucs = eloop[2].sort(numberSort);\n\n prev = nucs[0];\n hloop = true;\n numGreater = 0;\n for (let i = 1; i < nucs.length; i++) {\n if (nucs[i] - prev > 1) {\n numGreater += 1;\n }\n prev = nucs[i];\n }\n\n if (numGreater == 1) {\n eloop[0] = 'h';\n } else if (numGreater == 2) {\n eloop[0] = 'i';\n } else {\n eloop[0] = 'm';\n }\n }\n }\n\n return self;\n };\n\n self.reassignLinkUids = function() {\n // reassign uids to the links, corresponding to the uids of the two nodes\n // they connect\n var i;\n\n for (var i = 0; i < self.links.length; i++) {\n self.links[i].uid = self.links[i].source.uid + self.links[i].target.uid;\n }\n\n return self;\n }\n\n self.removePseudoknots = function() {\n if (self.pairtable.length > 1)\n self.pseudoknotPairs = self.pseudoknotPairs.concat(rnaUtilities.removePseudoknotsFromPairtable(self.pairtable));\n\n return self;\n };\n\n self.addPseudoknots = function() {\n /* Add all of the pseudoknot pairs which are stored outside\n * of the pairtable back to the pairtable\n */\n var pt = self.pairtable;\n var pseudoknotPairs = self.pseudoknotPairs;\n\n for (var i = 0; i < pseudoknotPairs.length; i++) {\n pt[pseudoknotPairs[i][0]] = pseudoknotPairs[i][1];\n pt[pseudoknotPairs[i][1]] = pseudoknotPairs[i][0];\n }\n\n self.pseudoknotPairs = [];\n return self;\n };\n\n self.addName = function(name) {\n if (typeof name == 'undefined') {\n self.name = '';\n return self;\n } else {\n self.name = name;\n return self;\n }\n };\n\n\n if (self.rnaLength > 0)\n self.recalculateElements();\n\n self.getNodeFromNucleotides = function(nucs) {\n /* Get a node given a nucleotide number or an array of nucleotide\n * numbers indicating an element node */\n if (Object.prototype.toString.call(nucs) === '[object Array]') {\n for (let j = 0; j < self.nodes.length; j++) {\n if ('nucs' in self.nodes[j]) {\n if (self.nodes[j].nucs.equals(nucs)) {\n return self.nodes[j];\n }\n }\n }\n } else {\n for (let j = 0; j < self.nodes.length; j++) {\n if (self.nodes[j].num == nucs) {\n return self.nodes[j];\n }\n }\n }\n\n console.log('ERROR: No node found for nucs:', nucs);\n return null;\n }\n}\n\nexport function moleculesToJson(moleculesJson) {\n /* Convert a list of RNA and protein molecules to a list of RNAGraph\n * ProteinGraph and extraLinks structure */\n\n var nodes = {}; //index the nodes by uid\n var graphs = [];\n var extraLinks = [];\n\n\n // Create the graphs for each molecule\n for (var i = 0; i < moleculesJson.molecules.length; i++) {\n var molecule = moleculesJson.molecules[i];\n var rg;\n\n if (molecule.type == 'rna') {\n rg = new RNAGraph(molecule.seq, molecule.ss, molecule.header);\n rg.circularizeExternal = true;\n rg.elementsToJson()\n .addPositions('nucleotide', molecule.positions)\n .addLabels()\n .reinforceStems()\n .reinforceLoops();\n\n\n } else if (molecule.type == 'protein') {\n rg = new ProteinGraph(molecule.header, molecule.size);\n\n }\n\n rg.addUids(molecule.uids);\n\n for (var j = 0; j < rg.nodes.length; j++) {\n nodes[rg.nodes[j].uid] = rg.nodes[j];\n }\n\n graphs.push(rg);\n }\n\n //Add the extra links\n for (var i = 0; i < moleculesJson.extraLinks.length; i++) {\n link = moleculesJson.extraLinks[i];\n\n link.source = nodes[link.source];\n link.target = nodes[link.target];\n link.uid = slugid.nice();\n\n extraLinks.push(link);\n }\n\n return {'graphs': graphs, 'extraLinks': extraLinks};\n};\n","export function simpleXyCoordinates (pair_table) {\n var INIT_ANGLE=0.; /* initial bending angle */\n var INIT_X = 100.; /* coordinate of first digit */\n var INIT_Y = 100.; /* see above */\n var RADIUS = 15.;\n\n var x = [], y = [];\n\n var i, len;\n var alpha;\n\n len = pair_table[0];\n var angle = Array.apply(null, new Array(len+5)).map(Number.prototype.valueOf,0); \n var loop_size = Array.apply(null, new Array(16+Math.floor(len/5)))\n .map(Number.prototype.valueOf, 0); \n var stack_size = Array.apply(null, new Array(16+Math.floor(len/5)))\n .map(Number.prototype.valueOf, 0); \n\n var lp = 0;\n var stk = 0;\n var PIHALF = Math.PI / 2;\n\n\n var loop = function(i, j, pair_table)\n /* i, j are the positions AFTER the last pair of a stack; i.e\n i-1 and j+1 are paired. */\n {\n var count = 2; /* counts the VERTICES of a loop polygon; that's\n NOT necessarily the number of unpaired bases!\n Upon entry the loop has already 2 vertices, namely\n the pair i-1/j+1. */\n\n var r = 0, bubble = 0; /* bubble counts the unpaired digits in loops */\n\n var i_old, partner, k, l, start_k, start_l, fill, ladder;\n var begin, v, diff;\n var polygon;\n\n var remember = Array.apply(null, new Array((3+Math.floor((j-i)/5)*2))).map(Number.prototype.valueOf, 0);\n\n i_old = i-1, j++; /* j has now been set to the partner of the\n previous pair for correct while-loop\n termination. */\n while (i != j) {\n partner = pair_table[i];\n if ((!partner) || (i==0))\n i++, count++, bubble++;\n else {\n count += 2;\n k = i, l = partner; /* beginning of stack */\n remember[++r] = k;\n remember[++r] = l;\n i = partner+1; /* next i for the current loop */\n\n start_k = k, start_l = l;\n ladder = 0;\n do {\n k++, l--, ladder++; /* go along the stack region */\n }\n while ((pair_table[k] == l) && (pair_table[k] > k));\n\n fill = ladder-2;\n if (ladder >= 2) {\n angle[start_k+1+fill] += PIHALF; /* Loop entries and */\n angle[start_l-1-fill] += PIHALF; /* exits get an */\n angle[start_k] += PIHALF; /* additional PI/2. */\n angle[start_l] += PIHALF; /* Why ? (exercise) */\n if (ladder > 2) {\n for (; fill >= 1; fill--) {\n angle[start_k+fill] = Math.PI; /* fill in the angles */\n angle[start_l-fill] = Math.PI; /* for the backbone */\n }\n }\n }\n stack_size[++stk] = ladder;\n if (k <= l)\n loop(k, l, pair_table);\n }\n }\n\n polygon = Math.PI*(count-2)/count; /* bending angle in loop polygon */\n remember[++r] = j;\n begin = i_old < 0 ? 0 : i_old;\n for (v = 1; v <= r; v++) {\n diff = remember[v]-begin;\n for (fill = 0; fill <= diff; fill++)\n angle[begin+fill] += polygon;\n if (v > r)\n break;\n begin = remember[++v];\n }\n loop_size[++lp] = bubble;\n }\n\n loop(0, len+1, pair_table);\n loop_size[lp] -= 2; /* correct for cheating with function loop */\n\n alpha = INIT_ANGLE;\n x[0] = INIT_X;\n y[0] = INIT_Y;\n\n var poss = [];\n\n poss.push([x[0], y[0]]);\n for (i = 1; i < len; i++) {\n x[i] = x[i-1]+RADIUS*Math.cos(alpha);\n y[i] = y[i-1]+RADIUS*Math.sin(alpha);\n\n poss.push([x[i], y[i]]);\n alpha += Math.PI-angle[i+1];\n }\n\n return poss;\n}\n","export function Radloop() {\n\tthis.radius = null;\n\tthis.loopnumber = null;\n\tthis.next = null;\n this.prev = null;\n}\n\nRadloop.prototype.getRadius = function(){\n\treturn this.radius;\n}\n\nRadloop.prototype.setRadius = function(radius){\n\tthis.radius = radius;\n}\n\nRadloop.prototype.getLoopnumber = function(){\n\treturn this.loopnumber;\n}\n\nRadloop.prototype.setLoopnumber = function(loopnumber){\n\tthis.loopnumber = loopnumber;\n}\n\nRadloop.prototype.getNext = function(){\n\treturn this.next;\n}\n\nRadloop.prototype.setNext = function(next){\n\tthis.next = next;\n}\n\nRadloop.prototype.getPrev = function(){\n\treturn this.prev;\n}\n\nRadloop.prototype.setPrev = function(prev){\n\tthis.prev = prev;\n}\n","import {Region} from './region.js';\n\nexport function Base() {\n\tthis.mate = null;\n\tthis.x = null;\n this.y = null;\n\tthis.extracted = null;\n\tthis.region = new Region();\n}\n\nBase.prototype.getMate = function(){\n\treturn this.mate;\n}\n\nBase.prototype.setMate = function(mate){\n\tthis.mate = mate;\n}\n\nBase.prototype.getX = function(){\n\treturn this.x;\n}\n\nBase.prototype.setX = function(x){\n\tthis.x = x;\n}\n\nBase.prototype.getY = function(){\n\treturn this.y;\n}\n\nBase.prototype.setY = function(y){\n\tthis.y = y;\n}\n\nBase.prototype.isExtracted = function(){\n\treturn this.extracted;\n}\n\nBase.prototype.setExtracted = function(extracted){\n\tthis.extracted = extracted;\n}\n\nBase.prototype.getRegion = function(){\n\treturn this.region;\n}\n\nBase.prototype.setRegion = function(region){\n\tthis.region = region;\n}\n","import {Radloop} from './radloop.js';\nimport {Connection} from './connection.js';\nimport {Region} from './region.js';\nimport {Base} from './base.js';\nimport {Loop} from './loop.js';\n\nexport function NAView(){\n this.ANUM = 9999.0;\n\tthis.MAXITER = 500;\n\n\tthis.bases = [];\n\tthis.nbase = null;\n this.nregion = null;\n this.loop_count = null;\n\n\tthis.root = new Loop();\n\tthis.loops = [];\n\n\tthis.regions = [];\n\n\tthis.rlphead = new Radloop();\n\n\tthis.lencut = 0.8;\n\tthis.RADIUS_REDUCTION_FACTOR = 1.4;\n\n\t// show algorithm step by step\n\tthis.angleinc = null;\n\n\tthis._h = null;\n\n\t// private boolean noIterationFailureYet = true;\n\n\tthis.HELIX_FACTOR = 0.6;\n\tthis.BACKBONE_DISTANCE = 27;\n}\n\nNAView.prototype.naview_xy_coordinates = function(pair_table){\n var x = [];\n\tvar y = [];\n if (pair_table.length === 0 || pair_table[0] === 0){\n return 0;\n }\n var i;\n this.nbase = pair_table[0];\n this.bases = [];\n for (var index = 0; index < this.nbase + 1; index++){\n this.bases.push(new Base());\n }\n this.regions = [];\n for (var index = 0; index < this.nbase + 1; index++){\n this.regions.push(new Region());\n }\n this.read_in_bases(pair_table);\n this.rlphead = null;\n this.find_regions();\n this.loop_count = 0;\n this.loops = [];\n for (var index = 0; index < this.nbase + 1; index++){\n this.loops.push(new Loop());\n }\n this.construct_loop(0);\n this.find_central_loop();\n this.traverse_loop(this.root, null);\n\n for (i = 0; i < this.nbase; i++){\n x.push(100 + this.BACKBONE_DISTANCE * this.bases[i + 1].getX());\n y.push(100 + this.BACKBONE_DISTANCE * this.bases[i + 1].getY());\n }\n\n return {\n nbase: this.nbase,\n x: x,\n y: y\n }\n}\n\nNAView.prototype.read_in_bases = function read_in_bases(pair_table){\n var i = null;\n var npairs = null;\n\n // Set up an origin.\n this.bases.push(new Base());\n this.bases[0].setMate(0);\n this.bases[0].setExtracted(false);\n this.bases[0].setX(this.ANUM);\n this.bases[0].setY(this.ANUM);\n\n for (npairs = 0, i = 1; i <= this.nbase; i++){\n this.bases.push(new Base());\n this.bases[i].setExtracted(false);\n this.bases[i].setX(this.ANUM);\n this.bases[i].setY(this.ANUM);\n this.bases[i].setMate(pair_table[i]);\n if (pair_table[i] > i)\n npairs++;\n }\n // must have at least 1 pair to avoid segfault\n if (npairs == 0){\n this.bases[1].setMate(this.nbase);\n this.bases[this.nbase].setMate(1);\n }\n}\n\nNAView.prototype.find_regions = function find_regions(){\n var i = null;\n var mate = null;\n var nb1 = null;\n\n nb1 = this.nbase + 1;\n var mark = [];\n for (i = 0; i < nb1; i++){\n mark.push(false);\n }\n this.nregion = 0;\n for (i = 0; i <= this.nbase; i++) {\n if ((mate = this.bases[i].getMate()) != 0 && !mark[i]) {\n this.regions[this.nregion].setStart1(i);\n this.regions[this.nregion].setEnd2(mate);\n mark[i] = true;\n mark[mate] = true;\n this.bases[i].setRegion(this.regions[this.nregion]);\n this.bases[mate].setRegion(this.regions[this.nregion]);\n for (i++, mate--; i < mate && this.bases[i].getMate() == mate; i++, mate--) {\n mark[mate] = true;\n mark[i]= true;\n this.bases[i].setRegion(this.regions[this.nregion]);\n this.bases[mate].setRegion(this.regions[this.nregion]);\n }\n this.regions[this.nregion].setEnd1(--i);\n this.regions[this.nregion].setStart2(mate + 1);\n\n this.nregion++;\n }\n }\n}\n\nNAView.prototype.construct_loop = function construct_loop(ibase){\n var i = null;\n var mate = null;\n var retloop = new Loop();\n var lp = new Loop();\n var cp = new Connection();\n var rp = new Region();\n var rlp = new Radloop();\n retloop = this.loops[this.loop_count++];\n retloop.setNconnection(0);\n retloop.setDepth(0);\n retloop.setNumber(this.loop_count);\n retloop.setRadius(0.0);\n\n for (rlp = this.rlphead; rlp != null; rlp = rlp.getNext())\n if (rlp.getLoopnumber() == this.loop_count)\n retloop.setRadius(rlp.getRadius());\n i = ibase;\n do {\n if ((mate = this.bases[i].getMate()) != 0) {\n rp = this.bases[i].getRegion();\n if (!this.bases[rp.getStart1()].isExtracted()) {\n if (i == rp.getStart1()) {\n this.bases[rp.getStart1()].setExtracted(true);\n this.bases[rp.getEnd1()].setExtracted(true);\n this.bases[rp.getStart2()].setExtracted(true);\n this.bases[rp.getEnd2()].setExtracted(true);\n lp = this.construct_loop(rp.getEnd1() < this.nbase ? rp.getEnd1() + 1\n : 0);\n } else if (i == rp.getStart2()) {\n this.bases[rp.getStart2()].setExtracted(true);\n this.bases[rp.getEnd2()].setExtracted(true);\n this.bases[rp.getStart1()].setExtracted(true);\n this.bases[rp.getEnd1()].setExtracted(true);\n lp = this.construct_loop(rp.getEnd2() < this.nbase ? rp.getEnd2() + 1\n : 0);\n } else {\n console.log(\"Something went terribly wrong ....\");\n }\n retloop.setNconnection(retloop.getNconnection() + 1);\n cp = new Connection();\n retloop.setConnection(retloop.getNconnection() - 1,\tcp);\n retloop.setConnection(retloop.getNconnection(), null);\n cp.setLoop(lp);\n cp.setRegion(rp);\n if(i == rp.getStart1()) {\n cp.setStart(rp.getStart1());\n cp.setEnd(rp.getEnd2());\n } else {\n cp.setStart(rp.getStart2());\n cp.setEnd(rp.getEnd1());\n }\n cp.setExtruded(false);\n cp.setBroken(false);\n lp.setNconnection(lp.getNconnection() + 1);\n cp = new Connection();\n lp.setConnection(lp.getNconnection() - 1, cp);\n lp.setConnection(lp.getNconnection(), null);\n cp.setLoop(retloop);\n cp.setRegion(rp);\n if (i == rp.getStart1()) {\n cp.setStart(rp.getStart2());\n cp.setEnd(rp.getEnd1());\n } else {\n cp.setStart(rp.getStart1());\n cp.setEnd(rp.getEnd2());\n }\n cp.setExtruded(false);\n cp.setBroken(false);\n }\n i = mate;\n }\n if (++i > this.nbase)\n i = 0;\n } while (i != ibase);\n return retloop;\n}\n\nNAView.prototype.find_central_loop = function find_central_loop(){\n var lp = new Loop();\n var maxconn = null;\n var maxdepth = null;\n var i = null;\n\n determine_depths.bind(this)();\n maxconn = 0;\n maxdepth = -1;\n for (i = 0; i < this.loop_count; i++) {\n lp = this.loops[i];\n if (lp.getNconnection() > maxconn) {\n maxdepth = lp.getDepth();\n maxconn = lp.getNconnection();\n this.root = lp;\n } else if (lp.getDepth() > maxdepth\n && lp.getNconnection() == maxconn) {\n maxdepth = lp.getDepth();\n this.root = lp;\n }\n }\n}\n\nfunction determine_depths() {\n var lp = new Loop();\n var i = null;\n var j = null;\n\n for (i = 0; i < this.loop_count; i++) {\n lp = this.loops[i];\n for (j = 0; j < this.loop_count; j++){\n this.loops[j].setMark(false);\n }\n lp.setDepth(depth(lp));\n }\n}\n\nfunction depth(lp){\n var count = null;\n var ret = null;\n var d = null;\n\n if (lp.getNconnection() <= 1){\n return 0;\n }\n if (lp.isMark()){\n return -1;\n }\n lp.setMark(true);\n count = 0;\n ret = 0;\n for (var i = 0; lp.getConnection(i) != null; i++) {\n d = depth(lp.getConnection(i).getLoop());\n if (d >= 0) {\n if (++count == 1){\n ret = d;\n }\n else if (ret > d){\n ret = d;\n }\n }\n }\n lp.setMark(false);\n return ret + 1;\n}\n\nNAView.prototype.traverse_loop = function traverse_loop(lp, anchor_connection){\n var xs, ys, xe, ye, xn, yn, angleinc, r;\n var radius, xc, yc, xo, yo, astart, aend, a;\n var cp, cpnext, acp, cpprev;\n var i, j, n, ic;\n var da, maxang;\n var count, icstart, icend, icmiddle, icroot;\n var done, done_all_connections, rooted;\n var sign;\n var midx, midy, nrx, nry, mx, my, vx, vy, dotmv, nmidx, nmidy;\n var icstart1, icup, icdown, icnext, direction;\n var dan, dx, dy, rr;\n var cpx, cpy, cpnextx, cpnexty, cnx, cny, rcn, rc, lnx, lny, rl, ac, acn, sx, sy, dcp;\n var imaxloop = 0;\n\n angleinc = 2 * Math.PI / (this.nbase + 1);\n acp = null;\n icroot = -1;\n var indice = 0;\n\n for (ic = 0; (cp = lp.getConnection(indice)) != null; indice++, ic++) {\n xs = -Math.sin(angleinc * cp.getStart());\n ys = Math.cos(angleinc * cp.getStart());\n xe = -Math.sin(angleinc * cp.getEnd());\n ye = Math.cos(angleinc * cp.getEnd());\n xn = ye - ys;\n yn = xs - xe;\n r = Math.sqrt(xn * xn + yn * yn);\n cp.setXrad(xn / r);\n cp.setYrad(yn / r);\n cp.setAngle(Math.atan2(yn, xn));\n if (cp.getAngle() < 0.0){\n cp.setAngle(cp.getAngle() + 2 * Math.PI);\n }\n if (anchor_connection != null\n && anchor_connection.getRegion() == cp.getRegion()) {\n acp = cp;\n icroot = ic;\n }\n }\n set_radius: while (true) {\n this.determine_radius(lp, this.lencut);\n radius = lp.getRadius()/this.RADIUS_REDUCTION_FACTOR;\n if (anchor_connection == null){\n xc = yc = 0.0;\n }\n else {\n xo = (this.bases[acp.getStart()].getX() + this.bases\n [acp.getEnd()].getX()) / 2.0;\n yo = (this.bases[acp.getStart()].getY() + this.bases\n [acp.getEnd()].getY()) / 2.0;\n xc = xo - radius * acp.getXrad();\n yc = yo - radius * acp.getYrad();\n }\n\n // The construction of the connectors will proceed in blocks of\n // connected connectors, where a connected connector pairs means two\n // connectors that are forced out of the drawn circle because they\n // are too close together in angle.\n\n // First, find the start of a block of connected connectors\n\n if (icroot == -1){\n icstart = 0;\n }\n else {\n icstart = icroot;\n }\n cp = lp.getConnection(icstart);\n count = 0;\n done = false;\n do {\n j = icstart - 1;\n if (j < 0){\n j = lp.getNconnection() - 1;\n }\n cpprev = lp.getConnection(j);\n if (!this.connected_connection(cpprev, cp)) {\n done = true;\n }\n else {\n icstart = j;\n cp = cpprev;\n }\n if (++count > lp.getNconnection()) {\n // Here everything is connected. Break on maximum angular\n // separation between connections.\n maxang = -1.0;\n for (ic = 0; ic < lp.getNconnection(); ic++) {\n j = ic + 1;\n if (j >= lp.getNconnection()){\n j = 0;\n }\n cp = lp.getConnection(ic);\n cpnext = lp.getConnection(j);\n ac = cpnext.getAngle() - cp.getAngle();\n if (ac < 0.0){\n ac += 2 * Math.PI;\n }\n if (ac > maxang) {\n maxang = ac;\n imaxloop = ic;\n }\n }\n icend = imaxloop;\n icstart = imaxloop + 1;\n if (icstart >= lp.getNconnection()){\n icstart = 0;\n }\n cp = lp.getConnection(icend);\n cp.setBroken(true);\n done = true;\n }\n } while (!done);\n done_all_connections = false;\n icstart1 = icstart;\n while (!done_all_connections) {\n count = 0;\n done = false;\n icend = icstart;\n rooted = false;\n while (!done) {\n cp = lp.getConnection(icend);\n if (icend == icroot){\n rooted = true;\n }\n j = icend + 1;\n if (j >= lp.getNconnection()) {\n j = 0;\n }\n cpnext = lp.getConnection(j);\n if (this.connected_connection(cp, cpnext)) {\n if (++count >= lp.getNconnection()){\n break;\n }\n icend = j;\n }\n else {\n done = true;\n }\n }\n icmiddle = this.find_ic_middle(icstart, icend, anchor_connection,\n acp, lp);\n ic = icup = icdown = icmiddle;\n done = false;\n direction = 0;\n while (!done) {\n if (direction < 0) {\n ic = icup;\n }\n else if (direction == 0) {\n ic = icmiddle;\n }\n else {\n ic = icdown;\n }\n if (ic >= 0) {\n cp = lp.getConnection(ic);\n if (anchor_connection == null || acp != cp) {\n if (direction == 0) {\n astart = cp.getAngle()\n - Math.asin(1.0 / 2.0 / radius);\n aend = cp.getAngle()\n + Math.asin(1.0 / 2.0 / radius);\n this.bases[cp.getStart()].setX(\n xc + radius * Math.cos(astart));\n this.bases[cp.getStart()].setY(\n yc + radius * Math.sin(astart));\n this.bases[cp.getEnd()].setX(\n xc + radius * Math.cos(aend));\n this.bases[cp.getEnd()].setY(\n yc + radius * Math.sin(aend));\n }\n else if (direction < 0) {\n j = ic + 1;\n if (j >= lp.getNconnection()){\n j = 0;\n }\n cp = lp.getConnection(ic);\n cpnext = lp.getConnection(j);\n cpx = cp.getXrad();\n cpy = cp.getYrad();\n ac = (cp.getAngle() + cpnext.getAngle()) / 2.0;\n if (cp.getAngle() > cpnext.getAngle()){\n ac -= Math.PI;\n }\n cnx = Math.cos(ac);\n cny = Math.sin(ac);\n lnx = cny;\n lny = -cnx;\n da = cpnext.getAngle() - cp.getAngle();\n if (da < 0.0){\n da += 2 * Math.PI;\n }\n if (cp.isExtruded()) {\n if (da <= Math.PI / 2){\n rl = 2.0;\n }\n else {\n rl = 1.5;\n }\n }\n else {\n rl = 1.0;\n }\n this.bases[cp.getEnd()].setX(\n this.bases[cpnext.getStart()].getX()\n + rl * lnx);\n this.bases[cp.getEnd()].setY(\n this.bases[cpnext.getStart()].getY()\n + rl * lny);\n this.bases[cp.getStart()].setX(\n this.bases[cp.getEnd()].getX() + cpy);\n this.bases[cp.getStart()].setY(\n this.bases[cp.getEnd()].getY() - cpx);\n } else {\n j = ic - 1;\n if (j < 0){\n j = lp.getNconnection() - 1;\n }\n cp = lp.getConnection(j);\n cpnext = lp.getConnection(ic);\n cpnextx = cpnext.getXrad();\n cpnexty = cpnext.getYrad();\n ac = (cp.getAngle() + cpnext.getAngle()) / 2.0;\n if (cp.getAngle() > cpnext.getAngle()){\n ac -= Math.PI;\n }\n cnx = Math.cos(ac);\n cny = Math.sin(ac);\n lnx = -cny;\n lny = cnx;\n da = cpnext.getAngle() - cp.getAngle();\n if (da < 0.0){\n da += 2 * Math.PI;\n }\n if (cp.isExtruded()) {\n if (da <= Math.PI / 2){\n rl = 2.0;\n }\n else {\n rl = 1.5;\n }\n }\n else {\n rl = 1.0;\n }\n this.bases[cpnext.getStart()].setX(\n this.bases[cp.getEnd()].getX() + rl\n * lnx);\n this.bases[cpnext.getStart()].setY(\n this.bases[cp.getEnd()].getY() + rl\n * lny);\n this.bases[cpnext.getEnd()].setX(\n this.bases[cpnext.getStart()].getX()\n - cpnexty);\n this.bases[cpnext.getEnd()].setY(\n this.bases[cpnext.getStart()].getY()\n + cpnextx);\n }\n }\n }\n if (direction < 0) {\n if (icdown == icend) {\n icdown = -1;\n }\n else if (icdown >= 0) {\n if (++icdown >= lp.getNconnection()) {\n icdown = 0;\n }\n }\n direction = 1;\n }\n else {\n if (icup == icstart){\n icup = -1;\n }\n else if (icup >= 0) {\n if (--icup < 0) {\n icup = lp.getNconnection() - 1;\n }\n }\n direction = -1;\n }\n done = icup == -1 && icdown == -1;\n }\n icnext = icend + 1;\n if (icnext >= lp.getNconnection()){\n icnext = 0;\n }\n if (icend != icstart\n && (!(icstart == icstart1 && icnext == icstart1))) {\n\n // Move the bases just constructed (or the radius) so that\n // the bisector of the end points is radius distance away\n // from the loop center.\n\n cp = lp.getConnection(icstart);\n cpnext = lp.getConnection(icend);\n dx = this.bases[cpnext.getEnd()].getX()\n - this.bases[cp.getStart()].getX();\n dy = this.bases[cpnext.getEnd()].getY()\n - this.bases[cp.getStart()].getY();\n midx = this.bases[cp.getStart()].getX() + dx / 2.0;\n midy = this.bases[cp.getStart()].getY() + dy / 2.0;\n rr = Math.sqrt(dx * dx + dy * dy);\n mx = dx / rr;\n my = dy / rr;\n vx = xc - midx;\n vy = yc - midy;\n rr = Math.sqrt(dx * dx + dy * dy);\n vx /= rr;\n vy /= rr;\n dotmv = vx * mx + vy * my;\n nrx = dotmv * mx - vx;\n nry = dotmv * my - vy;\n rr = Math.sqrt(nrx * nrx + nry * nry);\n nrx /= rr;\n nry /= rr;\n\n // Determine which side of the bisector the center should\n // be.\n\n dx = this.bases[cp.getStart()].getX() - xc;\n dy = this.bases[cp.getStart()].getY() - yc;\n ac = Math.atan2(dy, dx);\n if (ac < 0.0){\n ac += 2 * Math.PI;\n }\n dx = this.bases[cpnext.getEnd()].getX() - xc;\n dy = this.bases[cpnext.getEnd()].getY() - yc;\n acn = Math.atan2(dy, dx);\n if (acn < 0.0){\n acn += 2 * Math.PI;\n }\n if (acn < ac){\n acn += 2 * Math.PI;\n }\n if (acn - ac > Math.PI){\n sign = -1;\n }\n else {\n sign = 1;\n }\n nmidx = xc + sign * radius * nrx;\n nmidy = yc + sign * radius * nry;\n if (rooted) {\n xc -= nmidx - midx;\n yc -= nmidy - midy;\n }\n else {\n for (ic = icstart;;) {\n cp = lp.getConnection(ic);\n i = cp.getStart();\n this.bases[i].setX(\n this.bases[i].getX() + nmidx - midx);\n this.bases[i].setY(\n this.bases[i].getY() + nmidy - midy);\n i = cp.getEnd();\n this.bases[i].setX(\n this.bases[i].getX() + nmidx - midx);\n this.bases[i].setY(\n this.bases[i].getY() + nmidy - midy);\n if (ic == icend){\n break;\n }\n if (++ic >= lp.getNconnection()){\n ic = 0;\n }\n }\n }\n }\n icstart = icnext;\n done_all_connections = icstart == icstart1;\n }\n for (ic = 0; ic < lp.getNconnection(); ic++) {\n cp = lp.getConnection(ic);\n j = ic + 1;\n if (j >= lp.getNconnection()){\n j = 0;\n }\n cpnext = lp.getConnection(j);\n dx = this.bases[cp.getEnd()].getX() - xc;\n dy = this.bases[cp.getEnd()].getY() - yc;\n rc = Math.sqrt(dx * dx + dy * dy);\n ac = Math.atan2(dy, dx);\n if (ac < 0.0){\n ac += 2 * Math.PI;\n }\n dx = this.bases[cpnext.getStart()].getX() - xc;\n dy = this.bases[cpnext.getStart()].getY() - yc;\n rcn = Math.sqrt(dx * dx + dy * dy);\n acn = Math.atan2(dy, dx);\n if (acn < 0.0){\n acn += 2 * Math.PI;\n }\n if (acn < ac){\n acn += 2 * Math.PI;\n }\n dan = acn - ac;\n dcp = cpnext.getAngle() - cp.getAngle();\n if (dcp <= 0.0){\n dcp += 2 * Math.PI;\n }\n if (Math.abs(dan - dcp) > Math.PI) {\n if (cp.isExtruded()) {\n console.log(\"Warning from traverse_loop. Loop \"\n + lp.getNumber() + \" has crossed regions\\n\");\n }\n else if ((cpnext.getStart() - cp.getEnd()) != 1) {\n cp.setExtruded(true);\n continue set_radius; // remplacement du goto\n }\n }\n if (cp.isExtruded()) {\n this.construct_extruded_segment(cp, cpnext);\n }\n else {\n n = cpnext.getStart() - cp.getEnd();\n if (n < 0){\n n += this.nbase + 1;\n }\n angleinc = dan / n;\n for (j = 1; j < n; j++) {\n i = cp.getEnd() + j;\n if (i > this.nbase){\n i -= this.nbase + 1;\n }\n a = ac + j * angleinc;\n rr = rc + (rcn - rc) * (a - ac) / dan;\n this.bases[i].setX(xc + rr * Math.cos(a));\n this.bases[i].setY(yc + rr * Math.sin(a));\n }\n }\n }\n break;\n }\n for (ic = 0; ic < lp.getNconnection(); ic++) {\n if (icroot != ic) {\n cp = lp.getConnection(ic);\n //IM HERE\n this.generate_region(cp);\n this.traverse_loop(cp.getLoop(), cp);\n }\n }\n n = 0;\n sx = 0.0;\n sy = 0.0;\n for (ic = 0; ic < lp.getNconnection(); ic++) {\n j = ic + 1;\n if (j >= lp.getNconnection()){\n j = 0;\n }\n cp = lp.getConnection(ic);\n cpnext = lp.getConnection(j);\n n += 2;\n sx += this.bases[cp.getStart()].getX()\n + this.bases[cp.getEnd()].getX();\n sy += this.bases[cp.getStart()].getY()\n + this.bases[cp.getEnd()].getY();\n if (!cp.isExtruded()) {\n for (j = cp.getEnd() + 1; j != cpnext.getStart(); j++) {\n if (j > this.nbase){\n j -= this.nbase + 1;\n }\n n++;\n sx += this.bases[j].getX();\n sy += this.bases[j].getY();\n }\n }\n }\n lp.setX(sx / n);\n lp.setY(sy / n);\n}\n\nNAView.prototype.determine_radius = function determine_radius(lp, lencut){\n var mindit, ci, dt, sumn, sumd, radius, dit;\n var i, j, end, start, imindit = 0;\n var cp = new Connection(), cpnext = new Connection();\n var rt2_2 = 0.7071068;\n\n do {\n mindit = 1.0e10;\n for (sumd = 0.0, sumn = 0.0, i = 0; i < lp.getNconnection(); i++) {\n cp = lp.getConnection(i);\n j = i + 1;\n if (j >= lp.getNconnection()){\n j = 0;\n }\n cpnext = lp.getConnection(j);\n end = cp.getEnd();\n start = cpnext.getStart();\n if (start < end){\n start += this.nbase + 1;\n }\n dt = cpnext.getAngle() - cp.getAngle();\n if (dt <= 0.0){\n dt += 2 * Math.PI;\n }\n if (!cp.isExtruded()){\n ci = start - end;\n }\n else {\n if (dt <= Math.PI / 2){\n ci = 2.0;\n }\n else {\n ci = 1.5;\n }\n }\n sumn += dt * (1.0 / ci + 1.0);\n sumd += dt * dt / ci;\n dit = dt / ci;\n if (dit < mindit && !cp.isExtruded() && ci > 1.0) {\n mindit = dit;\n imindit = i;\n }\n }\n radius = sumn / sumd;\n if (radius < rt2_2){\n radius = rt2_2;\n }\n if (mindit * radius < lencut) {\n lp.getConnection(imindit).setExtruded(true);\n }\n } while (mindit * radius < lencut);\n if (lp.getRadius() > 0.0){\n radius = lp.getRadius();\n }\n else {\n lp.setRadius(radius);\n }\n}\n\nNAView.prototype.find_ic_middle = function find_ic_middle(icstart, icend, anchor_connection, acp, lp){\n var count, ret, ic, i;\n var done;\n\n count = 0;\n ret = -1;\n ic = icstart;\n done = false;\n while (!done) {\n if (count++ > lp.getNconnection() * 2) {\n console.log(\"Infinite loop in 'find_ic_middle'\");\n }\n if (anchor_connection != null && lp.getConnection(ic) == acp) {\n ret = ic;\n }\n done = ic == icend;\n if (++ic >= lp.getNconnection()) {\n ic = 0;\n }\n }\n if (ret == -1) {\n for (i = 1, ic = icstart; i < (count + 1) / 2; i++) {\n if (++ic >= lp.getNconnection())\n ic = 0;\n }\n ret = ic;\n }\n return ret;\n}\n\nNAView.prototype.construct_extruded_segment = function construct_extruded_segment(cp, cpnext){\n var astart, aend1, aend2, aave, dx, dy, a1, a2, ac, rr, da, dac;\n var start, end, n, nstart, nend;\n var collision;\n\n astart = cp.getAngle();\n aend2 = aend1 = cpnext.getAngle();\n if (aend2 < astart){\n aend2 += 2 * Math.PI;\n }\n aave = (astart + aend2) / 2.0;\n start = cp.getEnd();\n end = cpnext.getStart();\n n = end - start;\n if (n < 0){\n n += this.nbase + 1;\n }\n da = cpnext.getAngle() - cp.getAngle();\n if (da < 0.0) {\n da += 2 * Math.PI;\n }\n if (n == 2) {\n this.construct_circle_segment(start, end);\n }\n else {\n dx = this.bases[end].getX() - this.bases[start].getX();\n dy = this.bases[end].getY() - this.bases[start].getY();\n rr = Math.sqrt(dx * dx + dy * dy);\n dx /= rr;\n dy /= rr;\n if (rr >= 1.5 && da <= Math.PI / 2) {\n nstart = start + 1;\n if (nstart > this.nbase){\n nstart -= this.nbase + 1;\n }\n nend = end - 1;\n if (nend < 0){\n nend += this.nbase + 1;\n }\n this.bases[nstart].setX(this.bases[start].getX() + 0.5 * dx);\n this.bases[nstart].setY(this.bases[start].getY() + 0.5 * dy);\n this.bases[nend].setX(this.bases[end].getX() - 0.5 * dx);\n this.bases[nend].setY(this.bases[end].getY() - 0.5 * dy);\n start = nstart;\n end = nend;\n }\n do {\n collision = false;\n this.construct_circle_segment(start, end);\n nstart = start + 1;\n if (nstart > this.nbase) {\n nstart -= this.nbase + 1;\n }\n dx = this.bases[nstart].getX() - this.bases[start].getX();\n dy = this.bases[nstart].getY() - this.bases[start].getY();\n a1 = Math.atan2(dy, dx);\n if (a1 < 0.0){\n a1 += 2 * Math.PI;\n }\n dac = a1 - astart;\n if (dac < 0.0){\n dac += 2 * Math.PI;\n }\n if (dac > Math.PI){\n collision = true;\n }\n nend = end - 1;\n if (nend < 0){\n nend += this.nbase + 1;\n }\n dx = this.bases[nend].getX() - this.bases[end].getX();\n dy = this.bases[nend].getY() - this.bases[end].getY();\n a2 = Math.atan2(dy, dx);\n if (a2 < 0.0){\n a2 += 2 * Math.PI;\n }\n dac = aend1 - a2;\n if (dac < 0.0){\n dac += 2 * Math.PI;\n }\n if (dac > Math.PI){\n collision = true;\n }\n if (collision) {\n ac = this.minf2(aave, astart + 0.5);\n this.bases[nstart].setX(\n this.bases[start].getX() + Math.cos(ac));\n this.bases[nstart].setY(\n this.bases[start].getY() + Math.sin(ac));\n start = nstart;\n ac = this.maxf2(aave, aend2 - 0.5);\n this.bases[nend].setX(this.bases[end].getX() + Math.cos(ac));\n this.bases[nend].setY(this.bases[end].getY() + Math.sin(ac));\n end = nend;\n n -= 2;\n }\n } while (collision && n > 1);\n }\n}\n\nNAView.prototype.construct_circle_segment = function construct_circle_segment(start, end){\n var dx, dy, rr, midx, midy, xn, yn, nrx, nry, mx, my, a;\n var l, j, i;\n\n dx = this.bases[end].getX() - this.bases[start].getX();\n dy = this.bases[end].getY() - this.bases[start].getY();\n rr = Math.sqrt(dx * dx + dy * dy);\n l = end - start;\n if (l < 0){\n l += this.nbase + 1;\n }\n if (rr >= l) {\n dx /= rr;\n dy /= rr;\n for (j = 1; j < l; j++) {\n i = start + j;\n if (i > this.nbase){\n i -= this.nbase + 1;\n }\n this.bases[i].setX(\n this.bases[start].getX() + dx * j / l);\n this.bases[i].setY(\n this.bases[start].getY() + dy * j / l);\n }\n }\n else {\n this.find_center_for_arc((l - 1), rr);\n dx /= rr;\n dy /= rr;\n midx = this.bases[start].getX() + dx * rr / 2.0;\n midy = this.bases[start].getY() + dy * rr / 2.0;\n xn = dy;\n yn = -dx;\n nrx = midx + this._h * xn;\n nry = midy + this._h * yn;\n mx = this.bases[start].getX() - nrx;\n my = this.bases[start].getY() - nry;\n rr = Math.sqrt(mx * mx + my * my);\n a = Math.atan2(my, mx);\n for (j = 1; j < l; j++) {\n i = start + j;\n if (i > this.nbase){\n i -= this.nbase + 1;\n }\n this.bases[i].setX(nrx + rr * Math.cos(a + j * this.angleinc));\n this.bases[i].setY(nry + rr * Math.sin(a + j * this.angleinc));\n }\n }\n}\n\nNAView.prototype.find_center_for_arc = function find_center_for_arc(n, b){\n var h, hhi, hlow, r, disc, theta, e, phi;\n var iter;\n\n hhi = (n + 1.0) / Math.PI;\n // changed to prevent div by zero if (ih)\n hlow = -hhi - b / (n + 1.000001 - b);\n if (b < 1){\n // otherwise we might fail below (ih)\n hlow = 0;\n }\n iter = 0;\n do {\n h = (hhi + hlow) / 2.0;\n r = Math.sqrt(h * h + b * b / 4.0);\n disc = 1.0 - 0.5 / (r * r);\n if (Math.abs(disc) > 1.0) {\n console.log(\"Unexpected large magnitude discriminant = \" + disc\n + \" \" + r);\n }\n theta = Math.acos(disc);\n phi = Math.acos(h / r);\n e = theta * (n + 1) + 2 * phi - 2 * Math.PI;\n if (e > 0.0) {\n hlow = h;\n }\n else {\n hhi = h;\n }\n } while (Math.abs(e) > 0.0001 && ++iter < this.MAXITER);\n if (iter >= this.MAXITER) {\n if (noIterationFailureYet) {\n console.log(\"Iteration failed in find_center_for_arc\");\n noIterationFailureYet = false;\n }\n h = 0.0;\n theta = 0.0;\n }\n this._h = h;\n this.angleinc = theta;\n}\n\nNAView.prototype.generate_region = function generate_region(cp){\n var l, start, end, i, mate;\n var rp;\n\n rp = cp.getRegion();\n l = 0;\n if (cp.getStart() == rp.getStart1()) {\n start = rp.getStart1();\n end = rp.getEnd1();\n }\n else {\n start = rp.getStart2();\n end = rp.getEnd2();\n }\n if (this.bases[cp.getStart()].getX() > this.ANUM - 100.0\n || this.bases[cp.getEnd()].getX() > this.ANUM - 100.0) {\n console.log(\n \"Bad region passed to generate_region. Coordinates not defined.\");\n }\n for (i = start + 1; i <= end; i++) {\n l++;\n this.bases[i].setX(\n this.bases[cp.getStart()].getX() + this.HELIX_FACTOR * l\n * cp.getXrad());\n this.bases[i].setY(\n this.bases[cp.getStart()].getY() + this.HELIX_FACTOR * l\n * cp.getYrad());\n mate = this.bases[i].getMate();\n this.bases[mate].setX(\n this.bases[cp.getEnd()].getX() + this.HELIX_FACTOR * l\n * cp.getXrad());\n this.bases[mate].setY(\n this.bases[cp.getEnd()].getY() + this.HELIX_FACTOR * l\n * cp.getYrad());\n\n }\n}\n\nNAView.prototype.minf2 = function minf2(x1, x2) {\n return ((x1) < (x2)) ? (x1) : (x2);\n}\n\nNAView.prototype.maxf2 = function maxf2(x1, x2) {\n return ((x1) > (x2)) ? (x1) : (x2);\n}\n\nNAView.prototype.connected_connection = function connected_connection(cp, cpnext) {\n if (cp.isExtruded()) {\n return true;\n }\n else if (cp.getEnd() + 1 == cpnext.getStart()) {\n return true;\n }\n else {\n return false;\n }\n}\n","/* Version: 0.2\n* Date: 2015-03-15\n*/\n\nimport fstyle from './fornac.css';\n\nimport d3 from 'd3';\nimport slugid from 'slugid';\nimport {contextMenu} from './d3-context-menu.js';\n\nimport {RNAGraph} from './rnagraph.js';\nimport {ColorScheme, rnaUtilities} from './rnautils.js';\n\nimport {simpleXyCoordinates} from './simplernaplot.js';\nimport {NAView} from './naview/naview.js';\n\nexport function FornaContainer(element, passedOptions = {}) {\n var self = this;\n\n let options = {\n 'editable': false,\n 'zoomable': true,\n 'animation': true,\n 'displayAllLinks': false,\n 'labelInterval': 10,\n 'chargeDistance': 110,\n 'friction': 0.35,\n 'middleCharge': -30,\n 'otherCharge': -30,\n 'linkDistanceMultiplier': 15,\n 'initialSize': null,\n 'layout': 'standard-polygonal',\n 'transitionDuration': 500,\n 'maxNodeRadius': 80 // the maximum radius of a node when the view is centered\n };\n\n self.options = Object.assign(options, passedOptions);\n\n if (self.options.initialSize !== null) {\n self.options.svgW = self.options.initialSize[0];\n self.options.svgH = self.options.initialSize[1];\n } else {\n self.options.svgW = 300;\n self.options.svgH = 300;\n }\n\n self.linkStrengths = {\n 'pseudoknot': 0.00,\n 'proteinChain': 0.00,\n 'chainChain': 0.00,\n 'intermolecule': 10.00,\n 'external': 0.00,\n 'other': 10.00\n };\n\n self.displayParameters = {\n 'displayNumbering': true,\n 'displayNodeOutline': true,\n 'displayNodeLabel': true,\n 'displayLinks': true,\n 'displayPseudoknotLinks': true,\n 'displayProteinLinks': true,\n 'displayDirectionArrows': true\n };\n\n self.colorScheme = 'structure';\n self.customColors = {};\n self.rnas = {};\n self.extraLinks = []; //store links between different RNAs\n\n // global mouse event vars\n var mousedownLink = null,\n mousedownNode = null,\n mouseupNode = null;\n let linkContextMenuShown = false;\n\n let resetMouseVars = () => {\n mousedownNode = null;\n mouseupNode = null;\n mousedownLink = null;\n }\n\n var graph = self.graph = {\n 'nodes':[],\n 'links':[]\n };\n\n Array.prototype.equals = function (array) {\n // if the other array is a falsy value, return\n if (!array)\n return false;\n\n // compare lengths - can save a lot of time\n if (this.length != array.length)\n return false;\n\n for (var i = 0, l=this.length; i < l; i++) {\n // Check if we have nested arrays\n if (this[i] instanceof Array && array[i] instanceof Array) {\n // recurse into the nested arrays\n if (!this[i].equals(array[i]))\n return false;\n }\n else if (this[i] != array[i]) {\n // Warning - two different object instances will never be equal: {x:20} != {x:20}\n return false;\n }\n }\n return true;\n };\n\n /* Register global mouse and key events */\n if (self.options.editable || self.options.animation) {\n var shiftKeydown = false;\n var ctrlKeydown = false;\n\n let keydown = () => {\n switch (d3.event.keyCode) {\n case 68: //'d' key\n console.log('dotbracket:', self.getStructuresDotBracket());\n break;\n case 16:\n shiftKeydown = true;\n break;\n case 17:\n ctrlKeydown = true;\n break;\n case 67: //c\n self.centerView();\n break;\n }\n\n if (ctrlKeydown) {\n // Ctrl key must disable panning and zooming\n if (self.options.zoomable)\n disableZooming()\n // Ctrl Button must enable crosshair and start brusher\n if (self.options.editable || self.options.animation) {\n enableBrushing()\n }\n }\n }\n\n let keyup = () => {\n shiftKeydown = false;\n ctrlKeydown = false;\n\n // enable zoomer\n if (self.options.zoomable)\n enableZooming()\n // disable brushing events\n disableBrushing()\n }\n\n d3.select('body')\n .on('keydown', keydown)\n .on('keyup', keyup)\n .on('contextmenu', function() {\n d3.event.preventDefault();\n });\n }\n\n /* Register global context menu */\n if (self.options.editable) {\n let backgroundMenu = [\n {\n title: 'Add Node',\n action: function(elm, d, i, mousePos) {\n\n },\n children: [{\n 'title': 'A',\n action: function(elm, d, i, mousePos) {\n console.log('mousePos:', mousePos, self.options.svgW, self.options.svgH);\n let canvasMousePos = [xScale.invert(mousePos[0]),\n yScale.invert(mousePos[1])];\n console.log('canvasMousePos', canvasMousePos);\n\n self.addRNA('.', {'sequence': 'A', 'centerPos': canvasMousePos});\n }\n },\n {\n 'title': 'C',\n action: function(elm, d, i, mousePos) {\n console.log('mousePos:', mousePos, self.options.svgW, self.options.svgH);\n let canvasMousePos = [xScale.invert(mousePos[0]),\n yScale.invert(mousePos[1])];\n console.log('canvasMousePos', canvasMousePos);\n\n self.addRNA('.', {'sequence': 'C', 'centerPos': canvasMousePos});\n }\n\n },\n {\n 'title': 'G',\n action: function(elm, d, i, mousePos) {\n console.log('mousePos:', mousePos, self.options.svgW, self.options.svgH);\n let canvasMousePos = [xScale.invert(mousePos[0]),\n yScale.invert(mousePos[1])];\n console.log('canvasMousePos', canvasMousePos);\n\n self.addRNA('.', {'sequence': 'G', 'centerPos': canvasMousePos});\n }\n\n },\n {\n 'title': 'U',\n action: function(elm, d, i, mousePos) {\n console.log('mousePos:', mousePos, self.options.svgW, self.options.svgH);\n let canvasMousePos = [xScale.invert(mousePos[0]),\n yScale.invert(mousePos[1])];\n console.log('canvasMousePos', canvasMousePos);\n\n self.addRNA('.', {'sequence': 'U', 'centerPos': canvasMousePos});\n\n }\n }\n ],\n disabled: false // optional, defaults to false\n }\n ]\n\n let nodeMenu = [\n {\n title: 'Delete Node',\n action: function(elm, d, i) {\n deleteNode(d);\n },\n disabled: false // optional, defaults to false\n },\n {\n title: 'Change Node',\n action: function(elm, d, i) {\n console.log('You have clicked the second item!');\n console.log('The data for this circle is: ' + d);\n },\n children: [\n {\n title: 'A',\n action: function(elm, d, i) {\n changeNode('A', d);\n }\n },\n {\n title: 'C',\n action: function(elm, d, i) {\n changeNode('C', d);\n\n }\n },\n {\n title: 'G',\n action: function(elm, d, i) {\n changeNode('G', d);\n\n }\n },\n {\n title: 'U',\n action: function(elm, d, i) {\n changeNode('U', d);\n }\n },\n ]\n },\n {\n title: 'Insert Before',\n action: function(elm, d, i) {\n\n },\n children: [\n {\n title: 'A',\n action: function(elm, d, i) {\n insertNodeBeforeOrAfter('A', d, -1);\n }\n },\n {\n title: 'C',\n action: function(elm, d, i) {\n insertNodeBeforeOrAfter('C', d, -1);\n\n }\n },\n {\n title: 'G',\n action: function(elm, d, i) {\n insertNodeBeforeOrAfter('G', d, -1);\n\n }\n },\n {\n title: 'U',\n action: function(elm, d, i) {\n insertNodeBeforeOrAfter('U', d, -1);\n }\n },\n ]\n },\n {\n title: 'Insert After',\n action: function(elm, d, i) {\n console.log('d:', d);\n\n },\n children: [\n {\n title: 'A',\n action: function(elm, d, i) {\n insertNodeBeforeOrAfter('A', d, 0);\n\n }\n },\n {\n title: 'C',\n action: function(elm, d, i) {\n insertNodeBeforeOrAfter('C', d, 0);\n }\n },\n {\n title: 'G',\n action: function(elm, d, i) {\n insertNodeBeforeOrAfter('G', d, 0);\n }\n },\n {\n title: 'U',\n action: function(elm, d, i) {\n insertNodeBeforeOrAfter('U', d, 0);\n }\n },\n ]\n }\n ]\n\n self.nodeContextMenu = contextMenu(nodeMenu);\n self.backgroundContextMenu = contextMenu(backgroundMenu);\n\n } else {\n //console.log('empty context menu');\n self.nodeContextMenu = function() {};\n }\n\n /* Draw the plot here */\n d3.select(element).select('svg').remove();\n\n var svg = d3.select(element)\n .attr('tabindex', 1)\n .each(function() { this.focus(); })\n .append('svg:svg')\n .attr('preserveAspectRatio', 'xMidYMid meet')\n .attr('viewBox', '0 0 ' + self.options.svgW + ' ' + self.options.svgH)\n\n self.options.svg = svg;\n\n if (self.options.editable || self.options.animation) {\n var mouseEventHelper = svg.append('svg:g')\n .on('mousemove', () => {\n // only if we are dragging\n if (!mousedownNode) return;\n\n // update drag line\n let mpos = d3.mouse(vis.node());\n dragLine\n .attr('x1', mousedownNode.x)\n .attr('y1', mousedownNode.y)\n .attr('x2', mpos[0])\n .attr('y2', mpos[1]);\n })\n .on('mousedown', () => {\n })\n .on('mouseup', () => {\n if (mousedownNode && !linkContextMenuShown) {\n dragLine.classed(fstyle.transparent, true);\n }\n // clear mouse event vars\n resetMouseVars();\n //update()\n })\n .classed(fstyle.mouseEventHelper, true)\n .style('pointer-events', 'all')\n\n // draw a background layer for mouse events\n mouseEventHelper.append('svg:rect')\n .classed('background', true)\n .style('visibility', 'hidden')\n .attr('width', self.options.svgW)\n .attr('height', self.options.svgH)\n .on('mousedown', function() {\n //console.log('background click');\n deselectAllNodes()\n })\n } else {\n var mouseEventHelper = svg;\n }\n\n var vis = mouseEventHelper.append('svg:g')\n .classed(fstyle.plot, true)\n var visLinks = vis.append('svg:g')\n .classed('fornac-links', true);\n var visNodes = vis.append('svg:g')\n .classed('fornac-nodes', true);\n\n // line displayed when dragging new nodes\n if (self.options.editable) {\n var dragLine = vis.append('line')\n .attr('class', fstyle.dragLine)\n .attr('x1', 0)\n .attr('y1', 0)\n .attr('x2', 0)\n .attr('y2', 0);\n\n svg.on('contextmenu', self.backgroundContextMenu);\n }\n\n /* Zooming related objects and functions */\n var xScale = d3.scale.linear()\n .domain([0,self.options.svgW]).range([0,self.options.svgW]);\n var yScale = d3.scale.linear()\n .domain([0,self.options.svgH]).range([0, self.options.svgH]);\n\n self.zoomer = d3.behavior.zoom()\n .scaleExtent([0.1,10])\n .x(xScale)\n .y(yScale)\n .on('zoom', () => {\n vis.attr('transform',\n 'translate(' + d3.event.translate + ')' + ' scale(' + d3.event.scale + ')');\n });\n\n let enableZooming = () => {\n svg.call(self.zoomer)\n .on(\"dblclick.zoom\", null);\n }\n\n let disableZooming = () => {\n svg.call(self.zoomer)\n .on(\"dblclick.zoom\", null)\n .on('mousedown.zoom', null)\n .on('touchstart.zoom', null)\n .on('touchmove.zoom', null)\n .on('touchend.zoom', null);\n }\n\n if (self.options.zoomable)\n enableZooming()\n\n /* Node selection related objects and functions */\n let toggleSelectNode = (node) => {\n node.selected = !node.selected;\n visNodes.selectAll('g.gnode').filter((d) => { return node.uid == d.uid; })\n .classed(fstyle.selectedNode, function(p) { return p.selected; });\n }\n\n let selectNode = (node) => {\n node.selected = true;\n visNodes.selectAll('g.gnode').filter((d) => { return node.uid == d.uid; })\n .classed(fstyle.selectedNode, function(p) { return p.selected; });\n }\n\n let deselectAllNodes = () => {\n visNodes.selectAll('g.gnode')\n .classed(fstyle.selectedNode, function(p) { return p.selected = false; });\n }\n\n let selectedNodes = () => {\n // return all selected nodes\n return visNodes.selectAll('g.gnode').filter(function(d) { return d.selected; });\n }\n\n self.brusher = d3.svg.brush()\n .x(xScale)\n .y(yScale)\n .on('brushstart', function(d) {})\n .on('brush', function() {\n // during brushing invert styling of selection as preview\n let extent = d3.event.target.extent();\n\n visNodes.selectAll('g.gnode')\n .classed(fstyle.selectedNode, function (d) {\n return d.selected ^ (extent[0][0] <= d.x && d.x < extent[1][0]\n && extent[0][1] <= d.y && d.y < extent[1][1])\n })\n })\n .on('brushend', function() {\n // after brushing finally toggle the selection\n let extent = d3.event.target.extent();\n\n visNodes.selectAll('g.gnode')\n .filter(function (d) {\n return extent[0][0] <= d.x && d.x < extent[1][0]\n && extent[0][1] <= d.y && d.y < extent[1][1]\n })\n .each(toggleSelectNode)\n\n d3.event.target.clear();\n d3.select(this).call(d3.event.target);\n });\n\n let enableBrushing = () => {\n // crosshair curson\n mouseEventHelper.select('.background').style('cursor', 'crosshair');\n // bind brusher\n mouseEventHelper.call(self.brusher);\n }\n\n let disableBrushing = () => {\n // normal cursor\n mouseEventHelper.select('.background').style('cursor', 'auto');\n // disable brushing events\n mouseEventHelper.call(self.brusher)\n .on('mousedown.brush', null)\n .on('touchstart.brush', null)\n .on('touchmove.brush', null)\n .on('touchend.brush', null);\n }\n\n /* Force related objects and functions */\n self.force = d3.layout.force()\n .charge(function(d) {\n if (d.nodeType == 'middle')\n return self.options.middleCharge;\n else\n return self.options.otherCharge;\n })\n .friction(self.options.friction)\n .linkDistance(function(d) { return self.options.linkDistanceMultiplier * d.value; })\n .linkStrength(function(d) { if (d.linkType in self.linkStrengths) {\n return self.linkStrengths[d.linkType];\n } else {\n return self.linkStrengths.other; }\n })\n .gravity(0.000)\n .nodes(self.graph.nodes)\n .links(self.graph.links)\n .chargeDistance(self.options.chargeDistance)\n .size([self.options.svgW, self.options.svgH]);\n\n var drag = d3.behavior.drag()\n .on('dragstart', function(d) {\n console.log('dragstart')\n d3.event.sourceEvent.stopPropagation();\n\n selectedNodes().each(function(d1) {\n d1.fixed |= 2;\n });\n })\n .on('drag', (d) => {\n if (shiftKeydown) return\n selectedNodes().each(function(d1) {\n d1.x += d3.event.dx;\n d1.y += d3.event.dy;\n\n d1.px += d3.event.dx;\n d1.py += d3.event.dy;\n });\n\n self.resumeForce();\n d3.event.sourceEvent.preventDefault();\n })\n .on('dragend', (d) => {\n console.log('dragend')\n selectedNodes().each(function(d1) {\n d1.fixed &= ~6;\n });\n });\n\n /* Main plot drawing functions */\n let createInitialLayout = function(structure, passedOptions = {}) {\n // the default options\n let options = {\n 'sequence': '',\n 'name': 'empty',\n 'positions': [],\n 'labelInterval': self.options.labelInterval,\n 'avoidOthers': true,\n 'uids': [],\n 'circularizeExternal': true\n };\n\n options = Object.assign(options, passedOptions);\n\n //console.log('options.uids:', options.uids);\n let rg = new RNAGraph(options.sequence, structure, options.name);\n rg.circularizeExternal = options.circularizeExternal;\n\n let rnaJson = rg.recalculateElements();\n\n if (options.positions.length === 0) {\n // no provided positions means we need to calculate an initial layout\n\n if (self.options.layout == 'naview') {\n let naview = new NAView();\n\n let naViewPositions = naview.naview_xy_coordinates(rg.pairtable);\n options.positions = []\n for (let i = 0; i < naViewPositions.nbase; i++)\n options.positions.push([naViewPositions.x[i], naViewPositions.y[i]]);\n } else {\n options.positions = simpleXyCoordinates(rnaJson.pairtable);\n }\n }\n\n rnaJson = rnaJson.elementsToJson()\n .addUids(options.uids)\n .addPositions('nucleotide', options.positions)\n .addLabels(1, options.labelInterval)\n .reinforceStems()\n .reinforceLoops()\n .connectFakeNodes()\n .reassignLinkUids()\n .breakNodesToFakeNodes();\n\n return rnaJson;\n };\n\n let createNewNodes = function(gnodesEnter) {\n gnodesEnter = gnodesEnter.append('g')\n .classed('gnode', true)\n .attr('struct_name', function(d) { return d.structName; })\n .attr('transform', function(d) {\n if (typeof d.x != 'undefined' && typeof d.y != 'undefined')\n return 'translate(' + [d.x, d.y] + ')';\n else\n return '';\n })\n .each( function(d) { d.selected = d.previouslySelected = false; });\n\n gnodesEnter\n .attr('num', function(d) { return 'n' + d.num; })\n .attr('rnum', function(d) {\n return 'n' + (d.rna.rnaLength - d.num + 1); })\n .transition()\n .duration(750)\n .ease('elastic');\n\n if (self.options.editable || self.options.animation) {\n gnodesEnter.on('mousedown', nodeMousedown)\n //.on('mousedrag', function(d) {})\n .on('mouseup', nodeMouseup)\n .on('contextmenu', self.nodeContextMenu)\n .call(drag)\n }\n\n let labelAndProteinNodes = gnodesEnter.filter(function(d) {\n return d.nodeType == 'label' || d.nodeType == 'protein';\n });\n\n let nucleotideNodes = gnodesEnter.filter(function(d) {\n return d.nodeType == 'nucleotide';\n });\n\n labelAndProteinNodes.append('svg:circle')\n .classed(fstyle.node, true)\n .attr('r', function(d) {\n if (d.nodeType == 'middle') return 0;\n else {\n return d.radius;\n }\n })\n .attr('node_type', function(d) { return d.nodeType; })\n .attr('node_num', function(d) { return d.num; });\n\n // direction arrows\n nucleotideNodes.append('svg:path')\n .attr('class', fstyle.directionArrow)\n .attr('node_num', function(d) { return d.num; })\n\n // nucleotide outlines\n nucleotideNodes.append('svg:circle')\n .attr('class', fstyle.node)\n .attr('node_type', function(d) { return d.nodeType; })\n .attr('node_num', function(d) { return d.num; })\n .attr('r', function(d) { return d.radius; })\n .append('svg:title')\n .text(function(d) {\n if (d.nodeType == 'nucleotide') {\n return d.structName + ':' + d.num;\n } else {\n return '';\n }\n });\n\n // nucleotide labels\n var labelsEnter = gnodesEnter.append('text')\n .text(function(d) { return d.name; })\n .attr('class', fstyle.nodeLabel)\n .attr('label_type', function(d) { return d.nodeType; })\n\n // nucleotide label title\n labelsEnter.append('svg:title')\n .text(function(d) {\n if (d.nodeType == 'nucleotide') {\n return d.structName + ':' + d.num;\n } else {\n return '';\n }\n });\n\n return gnodesEnter;\n };\n\n let createNewLinks = function(linksEnter) {\n var linkLines = linksEnter.append('svg:line');\n\n linkLines.append('svg:title')\n .text((d) => { return d.linkType + ':' + d.source.num + '-' + d.target.num });\n\n linkLines\n .classed('link', true)\n .classed(fstyle.link, true)\n .attr('x1', function(d) { return d.source.x; })\n .attr('y1', function(d) { return d.source.y; })\n .attr('x2', function(d) { return d.target.x; })\n .attr('y2', function(d) { return d.target.y; })\n .attr('link_type', function(d) { return d.linkType; } )\n .attr('pointer-events', function(d) { if (d.linkType == 'fake') return 'none'; else return 'all';});\n\n if (self.options.editable)\n linkLines.on('click', linkClick);\n\n /* We don't need to update the positions of the stabilizing links */\n /*\n basepairLinks = visLinks.selectAll('[link_type=basepair]');\n basepairLinks.classed('basepair', true);\n\n fakeLinks = visLinks.selectAll('[link_type=fake]')\n fakeLinks.classed('fake', true);\n\n intermolecule_links = vis_links.selectAll('[link_type=intermolecule]');\n intermolecule_links.classed('intermolecule', true);\n\n plink = vis_links.selectAll('[link_type=protein_chain],[link_type=chain_chain]');\n plink.classed('chain_chain', true);\n */\n\n return linkLines;\n };\n\n function drawDirectionArrow(d) {\n let magnitude = (x) => {\n return Math.sqrt(x[0] * x[0] + x[1] * x[1]);\n }\n\n let endPoint = d;\n let startPoint = d.prevNode;\n // get stroke width and arrow size values from css\n let nodeStroke = parseFloat(fstyle.nodeStrokeWidth) / 2;\n let lengthMult = parseFloat(fstyle.directionArrowSize);\n let arrowWidth = parseFloat(fstyle.directionArrowWidth);\n\n if (startPoint === null)\n return;\n\n // does this node have a link pointing to it?\n if (!d.linked)\n return;\n\n // point back toward the previous node\n let u = [-(endPoint.x - startPoint.x), -(endPoint.y - startPoint.y)];\n\n if (u[0] == 0 && u[1] == 0)\n return; // will lead to a NaN error\n\n // scale u to unit length\n u = [u[0] / magnitude(u), u[1] / magnitude(u)];\n // normal vector of u\n let v = [-u[1], u[0]];\n\n // calculate the tip position\n let arrowTip = [(d.radius + nodeStroke) * u[0], (d.radius + nodeStroke) * u[1]];\n\n let path = 'M' + (arrowTip[0] + lengthMult * (u[0]/2 + v[0]*arrowWidth/2)) + ',' + (arrowTip[1] + lengthMult * (u[1]/2 + v[1]*arrowWidth/2)) +\n 'L' + (arrowTip[0]) + ',' + (arrowTip[1]) +\n 'L' + (arrowTip[0] + lengthMult * (u[0]/2 - v[0]*arrowWidth/2)) + ',' + (arrowTip[1] + lengthMult * (u[1]/2 - v[1]*arrowWidth/2));\n\n d3.select(this).attr('d', path);\n }\n\n let realLinkFilter = (d) => {\n return d.linkType == 'basepair' ||\n d.linkType == 'backbone' ||\n d.linkType == 'intermolecule' ||\n d.linkType == 'pseudoknot' ||\n d.linkType == 'label_link' ||\n d.linkType == 'external' ||\n d.linkType == 'chain_chain';\n }\n\n let recalculateGraph = () => {\n // Condense all of the individual RNAs into one\n // collection of nodes and links\n self.graph.nodes = [];\n self.graph.links = [];\n for (let uid in self.rnas) {\n self.graph.nodes = self.graph.nodes.concat(self.rnas[uid].nodes);\n self.graph.links = self.graph.links.concat(self.rnas[uid].links);\n }\n\n // Create a lookup table so that we can access each node\n // based on its uid. This will be used to create the links\n // between different RNAs\n var uidsToNodes = {};\n\n for (let i = 0; i < self.graph.nodes.length; i++)\n uidsToNodes[self.graph.nodes[i].uid] = self.graph.nodes[i];\n\n self.graph.links.forEach(function(link) {\n link.source = uidsToNodes[link.source.uid];\n link.target = uidsToNodes[link.target.uid];\n });\n\n for (let i = 0; i < self.extraLinks.length; i++) {\n // the actual node objects may have changed, so we hae to recreate\n // the extra links based on the uids\n if (!(self.extraLinks[i].target.uid in uidsToNodes)) {\n console.log('not there:', self.extraLinks[i]);\n continue;\n }\n\n self.extraLinks[i].source = uidsToNodes[self.extraLinks[i].source.uid];\n self.extraLinks[i].target = uidsToNodes[self.extraLinks[i].target.uid];\n\n if (self.extraLinks[i].linkType == 'intermolecule') {\n //remove links to middle nodes\n let fakeLinks = self.graph.links.filter(function(d) {\n return ((d.source == self.extraLinks[i].source || d.source == self.extraLinks[i].target ||\n d.target == self.extraLinks[i].source || d.target == self.extraLinks[i].source) &&\n d.linkType == 'fake');\n });\n\n for (let j = 0; j < fakeLinks.length; j++) {\n let linkIndex = self.graph.links.indexOf(fakeLinks[j]);\n self.graph.links.splice(linkIndex, 1);\n }\n }\n\n graph.links.push(self.extraLinks[i]);\n }\n };\n\n self.update = function () {\n self.force.nodes(self.graph.nodes)\n .links(self.graph.links);\n\n if (self.options.animation) {\n self.force.start();\n }\n\n let allLinks = visLinks.selectAll('line.link')\n .data(self.graph.links.filter(realLinkFilter), elementKey);\n\n allLinks.attr('class', '')\n .classed('link', true)\n .classed(fstyle.link, true)\n .attr('link_type', function(d) { return d.linkType; } )\n\n let linksEnter = allLinks.enter();\n createNewLinks(linksEnter);\n\n allLinks.exit().remove();\n\n let gnodes = visNodes.selectAll('g.gnode')\n .data(self.graph.nodes, elementKey);\n //.attr('pointer-events', 'all');\n\n let gnodesEnter = gnodes.enter();\n createNewNodes(gnodesEnter);\n gnodes.exit().remove();\n\n\n //fake_nodes = self.graph.nodes.filter(function(d) { return d.nodeType == 'middle'; });\n //fakeNodes = self.graph.nodes.filter(function(d) { return true; });\n let realNodes = self.graph.nodes.filter(function(d) { return d.nodeType == 'nucleotide' || d.nodeType == 'label';});\n\n gnodes.select('.' + fstyle.directionArrow).each(drawDirectionArrow);\n\n self.force.on('tick', function() {\n let q = d3.geom.quadtree(realNodes);\n let i = 0;\n let n = realNodes.length;\n\n let collide = (node) => {\n let r = node.radius + 16,\n nx1 = node.x - r,\n nx2 = node.x + r,\n ny1 = node.y - r,\n ny2 = node.y + r;\n return function(quad, x1, y1, x2, y2) {\n if (quad.point && (quad.point !== node)) {\n let x = node.x - quad.point.x,\n y = node.y - quad.point.y,\n l = Math.sqrt(x * x + y * y),\n r = node.radius + quad.point.radius;\n if (l < r) {\n l = (l - r) / l * 0.1;\n node.x -= x *= l;\n node.y -= y *= l;\n quad.point.x += x;\n quad.point.y += y;\n }\n }\n return x1 > nx2 || x2 < nx1 || y1 > ny2 || y2 < ny1;\n };\n }\n\n while (++i < n) q.visit(collide(realNodes[i]));\n\n allLinks.attr('x1', function(d) { return d.source.x; })\n .attr('y1', function(d) { return d.source.y; })\n .attr('x2', function(d) { return d.target.x; })\n .attr('y2', function(d) { return d.target.y; });\n\n // Translate the groups\n gnodes.attr('transform', function(d) {\n return 'translate(' + [d.x, d.y] + ')';\n });\n\n gnodes.select('.' + fstyle.directionArrow).each(drawDirectionArrow);\n\n });\n\n self.force.on('end', () => {\n gnodes.selectAll('[node_type=nucleotide]')\n .filter((d,i) => { if (i == 0) return true; else return false; })\n .each((d,i) => {\n //console.log(\"pos\", d.num, d.x, d.y);\n });\n\n //for (let uid in self.rnas) {\n // for (let i = 1; i < self.rnas[uid].pairtable[0]; i++) {\n // console.log('pt', i, self.rnas[uid].pairtable[i]);\n // }\n //}\n\n });\n\n self.changeColorScheme(self.colorScheme);\n\n if (self.options.animation) {\n self.force.start();\n }\n\n updateStyle();\n };\n\n self.transitionRNA = function(newStructure, nextFunction) {\n if (self.dotbracket == newStructure) {\n return;\n } else {\n self.dotbracket = newStructure;\n }\n //transition from an RNA which is already displayed to a new structure\n var duration = self.options.transitionDuration;\n\n var uids = self.graph.nodes\n .filter(function(d) { return d.nodeType == 'nucleotide'; })\n .map(function(d) { return d.uid; });\n\n let options = {'uids': uids};\n var newRNAJson = createInitialLayout(newStructure, options);\n\n let gnodes = visNodes.selectAll('g.gnode').data(newRNAJson.nodes, elementKey);\n var links = visLinks.selectAll('line.link').data(newRNAJson.links.filter(realLinkFilter), elementKey);\n\n if (duration === 0)\n gnodes.attr('transform', function(d) {\n return 'translate(' + [d.x, d.y] + ')';\n });\n else {\n gnodes.transition()\n .attr('transform', function(d) {\n return 'translate(' + [d.x, d.y] + ')'; }).duration(duration);\n }\n\n\n var newNodes = createNewNodes(gnodes.enter())\n .attr('transform', function(d) {\n if (typeof d.x != 'undefined' && typeof d.y != 'undefined')\n return 'translate(' + [0, 0] + ')';\n else\n return '';\n });\n\n if (duration === 0)\n gnodes.exit().remove();\n else\n gnodes.exit().transition()\n .attr('transform', function(d) {\n if (typeof d.x != 'undefined' && typeof d.y != 'undefined')\n return 'translate(' + [0, 0] + ')';\n else\n return '';\n });\n\n self.graph.nodes = gnodes.data();\n gnodes.select('.' + fstyle.directionArrow).each(drawDirectionArrow);\n self.changeColorScheme(self.colorScheme);\n updateStyle();\n self.centerView(duration);\n\n function endall(transition, callback) {\n if (transition.size() === 0) { setTimeout(callback, duration); }\n var n = 0;\n transition\n .each(function() { ++n; })\n .each('end', function() { if (!--n) callback.apply(this, arguments); });\n }\n\n function afterAnimation() {\n var newLinks = createNewLinks(links.enter());\n self.graph.links = links.data();\n self.changeColorScheme(self.colorScheme);\n updateStyle();\n\n if (typeof nextFunction != 'undefined')\n nextFunction();\n\n }\n\n links.exit().remove();\n\n if (duration === 0) {\n links\n .attr('x1', function(d) { return d.source.x; })\n .attr('y1', function(d) { return d.source.y; })\n .attr('x2', function(d) { return d.target.x; })\n .attr('y2', function(d) { return d.target.y; });\n\n var newLinks = createNewLinks(links.enter());\n self.graph.links = links.data();\n\n updateStyle();\n } else {\n links.transition()\n .attr('x1', function(d) { return d.source.x; })\n .attr('y1', function(d) { return d.source.y; })\n .attr('x2', function(d) { return d.target.x; })\n .attr('y2', function(d) { return d.target.y; })\n .duration(duration)\n .call(endall, afterAnimation);\n }\n\n if (duration === 0) {\n newNodes\n .attr('transform', function(d) {\n if (typeof d.x != 'undefined' && typeof d.y != 'undefined')\n return 'translate(' + [d.x, d.y] + ')';\n else\n return '';\n });\n } else {\n newNodes.transition()\n .attr('transform', function(d) {\n if (typeof d.x != 'undefined' && typeof d.y != 'undefined')\n return 'translate(' + [d.x, d.y] + ')';\n else\n return '';\n });\n }\n\n };\n\n /* Plot presentation related functions */\n let getBoundingBoxTransform = () => {\n // Center the view on the molecule(s) and scale it so that everything\n // fits in the window\n\n //no molecules, nothing to do\n if (self.graph.nodes.length === 0)\n return {'translate': [0,0], 'scale': 1};\n\n // Get the bounding box\n var minX = d3.min(self.graph.nodes.map(function(d) {return d.x;}));\n var minY = d3.min(self.graph.nodes.map(function(d) {return d.y;}));\n\n var maxX = d3.max(self.graph.nodes.map(function(d) {return d.x;}));\n var maxY = d3.max(self.graph.nodes.map(function(d) {return d.y;}));\n\n var maxRadius = d3.max(self.graph.nodes.map(function(d) { return d.radius; }));\n\n // The width and the height of the molecule\n var molWidth = maxX - minX;\n var molHeight = maxY - minY;\n\n // how much larger the drawing area is than the width and the height\n var widthRatio = self.options.svgW / (molWidth + 1);\n var heightRatio = self.options.svgH / (molHeight + 1);\n\n // we need to fit it in both directions, so we scale according to\n // the direction in which we need to shrink the most\n var minRatio = Math.min(widthRatio, heightRatio,\n self.options.maxNodeRadius / maxRadius) * 0.8;\n\n // the new dimensions of the molecule\n var newMolWidth = molWidth * minRatio;\n var newMolHeight = molHeight * minRatio;\n\n // translate so that it's in the center of the window\n var xTrans = -(minX) * minRatio + (self.options.svgW - newMolWidth) / 2;\n var yTrans = -(minY) * minRatio + (self.options.svgH - newMolHeight) / 2;\n\n return {'translate': [xTrans, yTrans], 'scale': minRatio};\n };\n\n self.centerView = function(duration = 0) {\n var bbTransform = getBoundingBoxTransform();\n\n if (bbTransform === null)\n return;\n\n // do the actual moving\n vis.transition().attr('transform',\n 'translate(' + bbTransform.translate + ')' + ' scale(' + bbTransform.scale + ')').duration(duration);\n\n // tell the zoomer what we did so that next we zoom, it uses the\n // transformation we entered here\n self.zoomer.translate(bbTransform.translate);\n self.zoomer.scale(bbTransform.scale);\n };\n\n self.setSize = (\n svgW = d3.select(element).node().offsetWidth,\n svgH = d3.select(element).node().offsetHeight\n ) => {\n // save width and height\n self.options.svgW = svgW;\n self.options.svgH = svgH;\n\n // set the viewBox\n svg.attr('viewBox', \"0 0 \" + svgW + \" \" + svgH)\n\n //Set the output range of the scales\n xScale.range([0, svgW]).domain([0, svgW]);\n yScale.range([0, svgH]).domain([0, svgH]);\n\n //re-attach the scales to the zoom behaviour\n self.zoomer.x(xScale)\n .y(yScale);\n self.brusher.x(xScale)\n .y(yScale);\n\n //resize the background\n svg.select('.background')\n .attr('width', svgW)\n .attr('height', svgH);\n\n // center the view\n self.centerView();\n }\n\n /* Style and color related functions */\n self.setOutlineColor = function(color) {\n var nodes = visNodes.selectAll('g.gnode').select('[node_type=nucleotide]');\n nodes.style('fill', color);\n }\n\n self.addCustomColors = function addCustomColors(json) {\n // Add a json file containing the custom colors\n self.customColors = json;\n self.changeColorScheme('custom');\n };\n\n self.addCustomColorsText = function(customColorsText) {\n let cs = new ColorScheme(customColorsText);\n self.customColors = cs.colorsJson;\n self.changeColorScheme('custom');\n };\n\n self.changeColorScheme = function(newColorScheme) {\n var proteinNodes = visNodes.selectAll('[node_type=protein]');\n\n proteinNodes.classed(fstyle.node, true)\n .attr('r', function(d) { return d.radius; });\n\n var gnodes = visNodes.selectAll('g.gnode');\n var circles = visNodes.selectAll('g.gnode').selectAll('circle');\n var nodes = visNodes.selectAll('g.gnode').select('[node_type=nucleotide]');\n self.colorScheme = newColorScheme;\n\n\n if (newColorScheme == 'sequence') {\n var scale = d3.scale.ordinal()\n .range(['#dbdb8d', '#98df8a', '#ff9896', '#aec7e8', '#aec7e8'])\n .domain(['A','C','G','U','T']);\n nodes.style('fill', function(d) {\n return scale(d.name);\n });\n\n } else if (newColorScheme == 'structure') {\n var scale = d3.scale.category10()\n .domain(['s','m','i','e','t','h','x'])\n .range(['lightgreen', '#ff9896', '#dbdb8d', 'lightsalmon',\n 'lightcyan', 'lightblue', 'transparent']);\n\n nodes.style('fill', function(d) {\n return scale(d.elemType);\n });\n\n } else if (newColorScheme == 'positions') {\n nodes.style('fill', function(d) {\n var scale = d3.scale.linear()\n .range(['#98df8a', '#dbdb8d', '#ff9896'])\n .interpolate(d3.interpolateLab)\n .domain([1, 1 + (d.rna.rnaLength - 1) / 2, d.rna.rnaLength]);\n\n return scale(d.num);\n });\n } else if (newColorScheme == 'custom') {\n // scale to be used in case the user passes scalar\n // values rather than color names\n if (typeof self.customColors != 'undefined' &&\n 'domain' in self.customColors &&\n 'range' in self.customColors) {\n var scale = d3.scale.linear()\n .interpolate(d3.interpolateLab)\n .domain(self.customColors.domain)\n .range(self.customColors.range);\n }\n\n let changeColors = (moleculeColors, d, scale) => {\n if (moleculeColors.hasOwnProperty(d.num)) {\n let val = parseFloat(moleculeColors[d.num]);\n\n if (isNaN(val)) {\n // passed in color is not a scalar, so\n // treat it as a color\n return moleculeColors[d.num];\n } else {\n // the user passed in a float, let's use a colormap\n // to convert it to a color\n return scale(val);\n }\n } else {\n return 'white';\n }\n }\n\n nodes.style('fill', function(d) {\n if (typeof self.customColors == 'undefined' ||\n !self.customColors.hasOwnProperty('colorValues')) {\n return 'white';\n }\n\n if (self.customColors.colorValues.hasOwnProperty(d.structName) &&\n self.customColors.colorValues[d.structName].hasOwnProperty(d.num)) {\n // if a molecule name is specified, it supercedes the default colors\n // (for which no molecule name has been specified)\n let moleculeColors = self.customColors.colorValues[d.structName];\n return changeColors(moleculeColors, d, scale);\n } else if (self.customColors.colorValues.hasOwnProperty('')) {\n let moleculeColors = self.customColors.colorValues[''];\n return changeColors(moleculeColors, d, scale);\n }\n\n return 'white';\n });\n }\n };\n\n let updateStyle = () => {\n // Numbering\n visNodes.selectAll('[node_type=label]').classed(fstyle.transparent, !self.displayParameters.displayNumbering);\n visNodes.selectAll('[label_type=label]').classed(fstyle.transparent, !self.displayParameters.displayNumbering);\n visLinks.selectAll('[link_type=label_link]').classed(fstyle.transparent, !self.displayParameters.displayNumbering);\n // Node Outline\n svg.selectAll('[node_type=nucleotide]').classed(fstyle.transparent, !self.displayParameters.displayNodeOutline);\n // Node Labels\n visNodes.selectAll('[label_type=nucleotide]').classed(fstyle.transparent, !self.displayParameters.displayNodeLabel);\n // Links\n svg.selectAll('[link_type=real],[link_type=basepair],[link_type=backbone],[link_type=pseudoknot],[link_type=protein_chain],[link_type=chain_chain],[link_type=external]').classed(fstyle.transparent, !self.displayParameters.displayLinks);\n // Pseudoknot Links\n svg.selectAll('[link_type=pseudoknot]').classed(fstyle.transparent, !self.displayParameters.displayPseudoknotLinks);\n // Protein Links\n svg.selectAll('[link_type=protein_chain]').classed(fstyle.transparent, !self.displayParameters.displayProteinLinks);\n // Fake Links\n visLinks.selectAll('[link_type=fake]').classed(fstyle.transparent, !self.options.displayAllLinks);\n visLinks.selectAll('[link_type=fake_fake]').classed(fstyle.transparent, !self.options.displayAllLinks);\n // direction Arrows\n svg.selectAll('.' + fstyle.directionArrow).classed(fstyle.transparent, !self.displayParameters.displayDirectionArrows);\n };\n\n /* RNA edditing related functions */\n let changeNode = function(nodeName, referenceNode) {\n // change the label of a node\n let rna = referenceNode.rna;\n\n let dotbracket = rnaUtilities.pairtableToDotbracket(rna.pairtable);\n let positions = rna.getPositions('nucleotide');\n let sequence = rna.seq\n let uids = rna.getUids();\n\n let newNodeNum = referenceNode.num;\n\n let newDotbracket = dotbracket;\n let newSequence = sequence.slice(0,newNodeNum-1) + nodeName + sequence.slice(newNodeNum);\n\n console.log('newSequence:', newSequence);\n\n console.log('uids:', uids);\n uids.splice(newNodeNum-1, 1, slugid.nice());\n let newPositions = positions;\n\n delete self.rnas[rna.uid];\n let newRNA = self.addRNA(newDotbracket, {'sequence': newSequence,\n 'positions': newPositions,\n 'uids': uids,\n 'centerView': false});\n }\n\n let insertNodeBeforeOrAfter = function(nodeName, referenceNode, positionOffset) {\n //insert a new node before or after another one\n //positionOffset specifies who far from the original to insert the new node\n let rna = referenceNode.rna;\n\n let dotbracket = rnaUtilities.pairtableToDotbracket(rna.pairtable);\n let positions = rna.getPositions('nucleotide');\n let sequence = rna.seq\n let uids = rna.getUids();\n\n let newNodeNum = referenceNode.num + positionOffset;\n\n let newDotbracket = dotbracket.slice(0,newNodeNum) + '.' + dotbracket.slice(newNodeNum);\n let newSequence = sequence.slice(0,newNodeNum) + nodeName + sequence.slice(newNodeNum);\n\n console.log('newSequence:', newSequence);\n\n uids.splice(newNodeNum, 0, slugid.nice());\n positions.splice(newNodeNum, 0, positions[newNodeNum - positionOffset-1]);\n\n let newUids = uids;\n let newPositions = positions;\n\n console.log('positions:', positions);\n console.log('new node positions:', newPositions);\n\n delete self.rnas[rna.uid];\n let newRNA = self.addRNA(newDotbracket, {'sequence': newSequence,\n 'positions': newPositions,\n 'uids': newUids,\n 'centerView': false});\n }\n\n let deleteNode = function(node) {\n console.log('deleting...', node);\n // get the dotbracket string for this rna\n let rna = node.rna;\n let pair = rna.pairtable[node.num];\n\n // remove basepairs for this node\n if (pair != 0) {\n rna.pairtable[node.num] = 0;\n rna.pairtable[pair] = 0;\n }\n\n let dotbracket = rnaUtilities.pairtableToDotbracket(rna.pairtable);\n let positions = rna.getPositions('nucleotide');\n let sequence = rna.seq\n let uids = rna.getUids();\n\n let newDotbracket = dotbracket.slice(0, node.num-1) + dotbracket.slice(node.num)\n let newPositions = positions.slice(0, node.num-1)\n .concat(positions.slice(node.num));\n let newSequence = sequence.slice(0, node.num-1) + sequence.slice(node.num)\n let newUids = uids.slice(0, node.num-1)\n .concat(uids.slice(node.num));\n\n delete self.rnas[rna.uid];\n let newRNA = self.addRNA(newDotbracket, {'sequence': newSequence,\n 'positions': newPositions,\n 'uids': newUids,\n 'centerView': false});\n\n console.log('new dotbracket:', newDotbracket);\n //recalculateGraph();\n\n //remove backbone links associated with this node\n\n //remove this node\n\n }\n\n let elementKey = (d) => {\n return d.uid;\n };\n\n let updateRnaGraph = function(r) {\n let nucleotidePositions = r.getPositions('nucleotide');\n let labelPositions = r.getPositions('label');\n\n let uids = r.getUids();\n\n r.recalculateElements()\n .elementsToJson()\n .addPseudoknots()\n .addPositions('nucleotide', nucleotidePositions)\n .addUids(uids)\n .addLabels(1, self.options.labelInterval)\n .addPositions('label', labelPositions)\n .reinforceStems()\n .reinforceLoops()\n .updateLinkUids();\n };\n\n let removeBackBoneLink = function(d) {\n if (d.target.num - d.source.num != 1) {\n console.log('ERROR: non adjacent nodes. Target:', d.target,\n 'Source:', d.source, 'Link:', d);\n return;\n }\n\n let rna = d.target.rna;\n let toRemove = [];\n\n for (let i = 0; i < rna.links.length; i++) {\n let link = rna.links[i];\n\n if (link.linkType != 'basepair')\n continue;\n\n if (link.source.num <= d.source.num && link.target.num >= d.target.num) {\n console.log('crossing basepair', link);\n toRemove.push(link);\n }\n }\n\n\n // Remove all base pairs that are between these two nodes and add them as extra\n // links\n console.log('toRemove:', toRemove);\n\n for (let i = 0; i < toRemove.length; i++) {\n rna.pairtable[toRemove[i].source.num] = 0;\n rna.pairtable[toRemove[i].target.num] = 0;\n\n toRemove[i].from = toRemove[i].source.num;\n toRemove[i].to = toRemove[i].target.num - d.source.num;\n }\n\n // extract the dotbracket string of the rna\n // cut it at the position of this backbone bond\n let sequence = rna.seq;\n let sequence1 = rna.seq.slice(0, d.source.num);\n let sequence2 = rna.seq.slice(d.source.num);\n\n let rnaDotBracket = rnaUtilities.pairtableToDotbracket(rna.pairtable);\n let dotBracket1 = rnaDotBracket.slice(0, d.source.num);\n let dotBracket2 = rnaDotBracket.slice(d.source.num)\n\n // get the nucleotide positions\n // cut them at the positions of the backbone bond\n let positions = rna.getPositions('nucleotide')\n let uids = rna.getUids();\n\n let positions1 = positions.slice(0, d.source.num);\n let positions2 = positions.slice(d.source.num);\n\n let uids1 = uids.slice(0, d.source.num);\n let uids2 = uids.slice(d.source.num);\n\n console.log('positions1:', positions1);\n console.log('positions2:', positions2);\n\n delete self.rnas[rna.uid];\n let rna1 = self.addRNA(dotBracket1, { 'sequence': sequence1,\n 'positions': positions1,\n 'uids': uids1 });\n let rna2 = self.addRNA(dotBracket2, { 'sequence': sequence2,\n 'positions': positions2,\n 'uids': uids2 });\n for (let i = 0; i < toRemove.length; i++) {\n console.log('rna1:', rna1);\n console.log('rna2:', rna2);\n console.log('toRemove[i]', toRemove[i]);\n self.extraLinks.push(\n {'source': rna1.nodes[toRemove[i].from-1],\n 'target': rna2.nodes[toRemove[i].to-1],\n 'value': 1,\n 'uid': slugid.nice(),\n 'linkType': 'intermolecule'});\n recalculateGraph();\n self.update();\n\n }\n console.log('self.extraLinks:', self.extraLinks);\n //self.extraLinks.push({'source': rna1.nodes[\n\n // create two new rnas\n // add their positions\n // add them back to the plot\n }\n\n var removeLink = function(d) {\n // remove a link between two nodes\n let index = self.graph.links.indexOf(d);\n console.log('removing link:', index);\n\n if (index > -1) {\n //remove a link\n //graph.links.splice(index, 1);\n\n // there should be two cases\n // 1. The link is within a single molecule\n\n if (d.source.rna == d.target.rna) {\n if (d.linkType == 'backbone') {\n console.log('trying to remove a backbone link', d.source.num, d.target.num);\n removeBackBoneLink(d);\n return;\n } else {\n let r = d.source.rna;\n r.addPseudoknots();\n r.pairtable[d.source.num] = 0;\n r.pairtable[d.target.num] = 0;\n\n updateRnaGraph(r);\n }\n } else {\n // 2. The link is between two different molecules\n let extraLinkIndex = self.extraLinks.indexOf(d);\n\n self.extraLinks.splice(extraLinkIndex, 1);\n }\n recalculateGraph();\n }\n self.update();\n };\n\n let addBackBoneLink = function(newLink) {\n // opposite of deleting a link\n // get the two dotbracket strings\n let rna1 = newLink.target.rna;\n let rna2 = newLink.source.rna;\n if (newLink.target.num == 1) {\n rna1 = newLink.source.rna;\n rna2 = newLink.target.rna;\n }\n\n let dotbracket1 = rnaUtilities.pairtableToDotbracket(rna1.pairtable);\n let dotbracket2 = rnaUtilities.pairtableToDotbracket(rna2.pairtable);\n\n let seq1 = rna1.seq;\n let seq2 = rna2.seq;\n\n let positions1 = rna1.getPositions('nucleotide');\n let positions2 = rna2.getPositions('nucleotide');\n\n // concatenate them\n let newDotbracket = dotbracket1 + dotbracket2;\n let newSeq = seq1 + seq2;\n let newPositions = positions1.concat(positions2);\n\n let toAddInternal = [];\n let toAddExternal = [];\n let toDelete = {};\n\n for (let i = 0; i < self.extraLinks.length; i++) {\n console.log('self.extraLinks[i]', self.extraLinks[i]);\n console.log('rna1:', rna1);\n console.log('rna2:', rna2);\n if (self.extraLinks[i].source.rna == rna1) {\n if ( self.extraLinks[i].target.rna == rna2) {\n // both ends of the extra link are within what will become the new molecule\n // need to be added as base pairs afterwards\n //self.extraLinks[i].from = self.extraLinks[i].source.num;\n //self.extraLinks[i].to = dotbracket1.length + self.extraLinks[i].target.num;\n //toAddInternal.push(self.extraLinks[i]);\n } else {\n // only one end of the extra link is within what will become the newly\n // created molecule, needs to remain an extra link\n // source will always be the unchanged molecule, whereas target will be\n // the newly created one\n toAddExternal.push({\n 'source': self.extraLinks[i].target,\n 'target': self.extraLinks[i].source.num\n });\n\n toDelete[self.extraLinks[i].uid] = true;\n }\n } else if (self.extraLinks[i].source.rna == rna2) {\n if ( self.extraLinks[i].target.rna == rna1) {\n // add internal link\n // both ends of the extra link are within what will become the new molecule\n // need to be added as base pairs afterwards\n //self.extraLinks[i].from = self.extraLinks[i].target.num;\n //self.extraLinks[i].to = dotbracket1.length + self.extraLinks[i].source.num;\n\n //toAddInternal.push(self.extraLinks[i]);\n } else {\n toAddExternal.push({\n 'source': self.extraLinks[i].target,\n 'target': self.extraLinks[i].source.num + dotbracket1.length\n });\n toDelete[self.extraLinks[i].uid] = true;\n }\n }\n\n if (self.extraLinks[i].target.rna == rna1) {\n if (self.extraLinks[i].source.rna == rna2) {\n // covered in previous if statement\n } else {\n // only one end of the extra link is within what will become the newly\n // created molecule, needs to remain an extra link\n toAddExternal.push({\n 'source': self.extraLinks[i].source,\n 'target': self.extraLinks[i].target.num\n });\n\n toDelete[self.extraLinks[i].uid] = true;\n }\n } else if (self.extraLinks[i].target.rna == rna2) {\n if (self.extraLinks[i].source.rna == rna1) {\n toAddExternal.push({\n 'source': self.extraLinks[i].source,\n 'target': self.extraLinks[i].target.num + dotbracket1.length\n });\n\n toDelete[self.extraLinks[i].uid] = true;\n }\n }\n }\n\n\n self.extraLinks = self.extraLinks.filter((e) => { return !(e.uid in toDelete) });\n\n delete self.rnas[rna1.uid];\n delete self.rnas[rna2.uid];\n\n let newRna = null;\n // create a new RNA\n if (self.options.animation)\n newRna = self.addRNA(newDotbracket, { 'sequence': newSeq,\n 'positions': newPositions,\n 'centerView': false});\n else\n newRna = self.addRNA(newDotbracket, { 'sequence': newSeq,\n 'centerView': false });\n\n\n\n // add new external links\n for (let i = 0; i < toAddExternal.length; i++) {\n self.extraLinks.push({\n 'source': toAddExternal[i].source,\n 'target': newRna.nodes[toAddExternal[i].target-1],\n 'value': 1,\n 'uid': slugid.nice(),\n 'linkType': 'intermolecule'\n });\n }\n\n recalculateGraph();\n self.update();\n console.log('self.extraLinks:', self.extraLinks);\n };\n\n function nudge(dx, dy) {\n // TODO currently unused\n node.filter(function(d) { return d.selected; })\n .attr('cx', function(d) { return d.x += dx; })\n .attr('cy', function(d) { return d.y += dy; });\n\n link.filter(function(d) { return d.source.selected; })\n .attr('x1', function(d) { return d.source.x; })\n .attr('y1', function(d) { return d.source.y; });\n\n link.filter(function(d) { return d.target.selected; })\n .attr('x2', function(d) { return d.target.x; })\n .attr('y2', function(d) { return d.target.y; });\n\n d3.event.preventDefault();\n }\n\n let nodeMouseup = function(d,i) {\n console.log(\"nodeMouseup\")\n let backbonePossible = true, basepairPossible = true;\n\n if (mousedownNode) {\n mouseupNode = d;\n\n // if the node isn't a nucleotide, we can't create a link\n if (mouseupNode.nodeType == 'middle' || mousedownNode.nodeType == 'middle' || mouseupNode.nodeType == 'label' || mousedownNode.nodeType == 'label')\n return;\n\n if (mouseupNode == mousedownNode) { resetMouseVars(); return; }\n let newLink = {source: mousedownNode, target: mouseupNode, linkType: 'basepair', value: 1, uid: slugid.nice()};\n\n for (let i = 0; i < self.graph.links.length; i++) {\n if ((self.graph.links[i].source == mousedownNode) ||\n (self.graph.links[i].target == mousedownNode) ||\n (self.graph.links[i].source == mouseupNode) ||\n (self.graph.links[i].target == mouseupNode)) {\n // either one of the nodes is already in a link\n\n // if any of the nodes are already involved in a basepair or a pseudoknot\n // then we can't make a basepair link\n if (self.graph.links[i].linkType == 'basepair' ||\n self.graph.links[i].linkType == 'pseudoknot' ||\n self.graph.links[i].linkType == 'intermolecule') {\n // although should be able to make a backbone link\n console.log('no basepair possible');\n basepairPossible = false;\n }\n }\n\n if (((self.graph.links[i].source == mouseupNode) &&\n (self.graph.links[i].target == mousedownNode)) ||\n ((self.graph.links[i].source == mousedownNode) &&\n (self.graph.links[i].target == mouseupNode))) {\n\n // if we're trying to make a link between two nodes which already have\n // a backbone between them, then we can't make a link\n if (self.graph.links[i].linkType == 'backbone') {\n return;\n }\n }\n }\n\n\n if (newLink.source.rna != newLink.target.rna) {\n // could be either a backbone link or an intermolecule link\n\n if ((newLink.source.num == 1 &&\n newLink.target.num == newLink.target.rna.rnaLength) ||\n (newLink.target.num == 1 &&\n newLink.source.num == newLink.source.rna.rnaLength)) {\n //\n let linkMenu = [\n {\n title: 'Backbone Link',\n action: function(elm, d, i) {\n linkContextMenuShown = false;\n console.log('Item #1 clicked!');\n console.log('The data for this circle is: ' + d);\n dragLine.attr('class', fstyle.transparent);\n addBackBoneLink(newLink);\n },\n disabled: false // optional, defaults to false\n },\n {\n title: 'Basepair Link',\n action: function(elm, d, i) {\n linkContextMenuShown = false;\n console.log('You have clicked the second item!');\n console.log('The data for this circle is: ' + d);\n dragLine.attr('class', fstyle.transparent);\n self.addLink(newLink);\n }\n }\n ]\n linkContextMenuShown = true;\n let linkContextMenu = contextMenu(linkMenu);\n console.log('newLinkMenu');\n linkContextMenu.apply(this, [d,i,true,\n function() { dragLine.attr('class', fstyle.transparent) }]);\n } else {\n // between end points but can't make a backbone\n if (basepairPossible)\n self.addLink(newLink);\n }\n } else {\n if (basepairPossible)\n self.addLink(newLink);\n }\n\n }\n };\n\n let nodeMousedown = function(d) {\n console.log(\"nodeMousedown\")\n if (!d.selected && !ctrlKeydown) {\n // if this node isn't selected, then we have to unselect every other node\n deselectAllNodes()\n }\n\n if (!shiftKeydown) {\n // only without shift, toggle select or select\n if (ctrlKeydown) {\n toggleSelectNode(d)\n } else {\n selectNode(d)\n }\n }\n\n if (shiftKeydown && self.options.editable) {\n // with shift key and editable continue to draw dragline\n mousedownNode = d;\n\n dragLine\n .attr('class', fstyle.dragLine)\n .attr('x1', mousedownNode.x)\n .attr('y1', mousedownNode.y)\n .attr('x2', mousedownNode.x)\n .attr('y2', mousedownNode.y);\n\n d3.event.stopPropagation();\n }\n };\n\n let linkClick = (d) => {\n if (!shiftKeydown) {\n return;\n }\n\n var invalidLinks = { //'backbone': true,\n 'fake': true,\n 'fake_fake': true,\n 'label_link': true};\n\n console.log('d.linkType:', d.linkType);\n if (d.linkType in invalidLinks )\n return;\n\n removeLink(d);\n };\n\n /* I/O functions */\n self.toJSON = function toJSON() {\n var data = {'rnas': self.rnas, 'extraLinks': self.extraLinks};\n var dataString = JSON.stringify(data, function(key, value) {\n //remove circular references\n if (key == 'rna') {\n return;\n } else {\n return value;\n }\n }, '\\t');\n return dataString;\n };\n\n self.fromJSON = function(jsonString) {\n var rnas, extraLinks;\n\n try{\n var data = JSON.parse(jsonString);\n rnas = data.rnas;\n extraLinks = data.extraLinks;\n } catch(err) {\n throw err;\n }\n\n for (var uid in rnas) {\n if (rnas[uid].type == 'rna') {\n r = new RNAGraph();\n\n r.seq = rnas[uid].seq;\n r.dotbracket = rnas[uid].dotbracket;\n r.circular = rnas[uid].circular;\n r.pairtable = rnas[uid].pairtable;\n r.uid = rnas[uid].uid;\n r.structName = rnas[uid].structName;\n r.nodes = rnas[uid].nodes;\n r.links = rnas[uid].links;\n r.rnaLength = rnas[uid].rnaLength;\n r.elements = rnas[uid].elements;\n r.nucsToNodes = rnas[uid].nucsToNodes;\n r.pseudoknotPairs = rnas[uid].pseudoknotPairs;\n } else {\n r = new ProteinGraph();\n r.size = rnas[uid].size;\n r.nodes = rnas[uid].nodes;\n r.uid = rnas[uid].uid;\n }\n\n self.addRNAJSON(r, false);\n }\n\n extraLinks.forEach(function(link) {\n self.extraLinks.push(link);\n });\n\n recalculateGraph();\n self.update();\n };\n\n self.addRNA = function(structure, passedOptions = {}) {\n let rnaJson = createInitialLayout(structure, passedOptions);\n let centerView = false;\n\n /*\n * Code to display the JSONs representing the structure\n *\n rnaJson.nodes[0].rna = null;\n rnaJson.nodes[0].nextNode = null;\n\n rnaJson.links[0].source = null;\n rnaJson.links[0].target = null;\n\n console.log(rnaJson.nodes[0]);\n console.log(rnaJson.links[0]);\n console.log(JSON.stringify(rnaJson.nodes[0],null,2));\n console.log(JSON.stringify(rnaJson.links[0],null,2));\n */\n\n if ('extraLinks' in passedOptions) {\n // presumably the passed in links are within the passed molecule\n let newLinks = self.addExternalLinks(rnaJson, passedOptions.extraLinks);\n\n self.extraLinks = self.extraLinks.concat(newLinks);\n }\n\n if ('centerPos' in passedOptions)\n self.addRNAJSON(rnaJson, {centerPos: passedOptions.centerPos,\n centerView: false})\n else if ('avoidOthers' in passedOptions)\n self.addRNAJSON(rnaJson, {avoidOthers: passedOptions.avoidOthers});\n else\n self.addRNAJSON(rnaJson, {centerView: passedOptions.centerView});\n\n return rnaJson;\n };\n\n self.addRNAJSON = function(rnaGraph,\n { avoidOthers = false,\n centerPos = null,\n centerView = true}\n ) {\n // Add an RNAGraph, which contains nodes and links as part of the\n // structure\n // Each RNA will have uid to identify it\n // when it is modified, it is replaced in the global list of RNAs\n //\n var maxX, minX;\n //console.log('centerView:', centerView);\n\n if (centerPos != null) {\n // center the newly created RNA at a given position\n let totalX = 0;\n let totalY = 0;\n let nodeCount = 0;\n\n rnaGraph.nodes.forEach(function(node) {\n totalX += node.x;\n totalY += node.y;\n nodeCount += 1;\n });\n\n if (nodeCount > 0) {\n // center the nodes at centerPos\n\n rnaGraph.nodes.forEach(function(node) {\n node.x = node.x + centerPos[0] - totalX / nodeCount;\n node.y = node.y + centerPos[1] - totalY / nodeCount;\n\n node.px = node.x;\n node.py = node.y;\n });\n }\n }\n\n if (avoidOthers) {\n if (self.graph.nodes.length > 0)\n maxX = d3.max(self.graph.nodes.map(function(d) { return d.x; }));\n else\n maxX = 0;\n\n minX = d3.min(rnaGraph.nodes.map(function(d) { return d.x; }));\n\n rnaGraph.nodes.forEach(function(node) {\n node.x += (maxX - minX) + 20;\n node.px += (maxX - minX);\n });\n }\n\n rnaGraph.nodes.forEach(function(node) {\n node.rna = rnaGraph;\n });\n\n self.rnas[rnaGraph.uid] = rnaGraph;\n recalculateGraph();\n\n self.update();\n\n if (centerView)\n self.centerView();\n\n return rnaGraph;\n };\n\n self.addNodes = function addNodes(json) {\n // add a new set of nodes from a json file\n\n // Resolve the sources and targets of the links so that they\n // are not just indeces into an array\n json.links.forEach(function(entry) {\n if (typeof entry.source == 'number') entry.source = json.nodes[entry.source];\n if (typeof entry.target == 'number') entry.target = json.nodes[entry.target];\n });\n\n // Get the maximum x and y values of the current graph\n // so that we don't place a new structure on top of the\n // old one\n if (self.graph.nodes.length > 0) {\n maxX = d3.max(self.graph.nodes.map(function(d) {return d.x;}));\n maxY = d3.max(self.graph.nodes.map(function(d) {return d.y;}));\n } else {\n maxX = 0;\n maxY = 0;\n }\n\n json.nodes.forEach(function(entry) {\n if (!(entry.rna.uid in self.rnas)) {\n self.rnas[entry.rna.uid] = entry.rna;\n }\n\n entry.x += maxX;\n //entry.y += maxY;\n\n entry.px += maxX;\n //entry.py += maxY;\n });\n\n r = new RNAGraph('','');\n r.nodes = json.nodes;\n r.links = json.links;\n\n //self.addRNA(r);\n recalculateGraph();\n\n self.update();\n self.centerView();\n };\n\n self.clearNodes = () => {\n self.graph.nodes = [];\n self.graph.links = [];\n\n self.rnas = {};\n self.extraLinks = [];\n\n self.update();\n };\n\n self.addLink = function(newLink) {\n // this means we have a new json, which means we have\n // to recalculate the structure and change the colors\n // appropriately\n //\n console.log('adding new link');\n if (newLink.source.rna == newLink.target.rna) {\n // must be a basepair\n let r = newLink.source.rna;\n\n r.pairtable[newLink.source.num] = newLink.target.num;\n r.pairtable[newLink.target.num] = newLink.source.num;\n\n updateRnaGraph(r);\n\n } else {\n //Add an extra link\n console.log('intermolecule');\n newLink.linkType = 'intermolecule';\n self.extraLinks.push(newLink);\n }\n recalculateGraph();\n self.update();\n };\n\n self.addExternalLinks = function(rnaJson, externalLinks) {\n let newLinks = [];\n\n for (let i = 0; i < externalLinks.length; i++) {\n let newLink = {linkType: 'external', value: 1, uid: slugid.nice(),\n source: null, target: null};\n // check if the source node is an array\n if (Object.prototype.toString.call(externalLinks[i][0]) === '[object Array]') {\n for (let j = 0; j < rnaJson.nodes.length; j++) {\n if ('nucs' in rnaJson.nodes[j]) {\n if (rnaJson.nodes[j].nucs.equals(externalLinks[i][0])) {\n newLink.source = rnaJson.nodes[j];\n break;\n }\n }\n }\n } else {\n for (let j = 0; j < rnaJson.nodes.length; j++) {\n if (rnaJson.nodes[j].num == externalLinks[i][0]) {\n newLink.source = rnaJson.nodes[j];\n }\n }\n }\n\n // check if the target node is an array\n if (Object.prototype.toString.call(externalLinks[i][1]) === '[object Array]') {\n for (let j = 0; j < rnaJson.nodes.length; j++) {\n if ('nucs' in rnaJson.nodes[j]) {\n if (rnaJson.nodes[j].nucs.equals(externalLinks[i][1])) {\n newLink.target = rnaJson.nodes[j];\n }\n }\n }\n } else {\n for (let j = 0; j < rnaJson.nodes.length; j++) {\n if (rnaJson.nodes[j].num == externalLinks[i][1]) {\n newLink.target = rnaJson.nodes[j];\n }\n }\n }\n\n if (newLink.source == null || newLink.target == null) {\n console.log('ERROR: source or target of new link not found:', newLink, externalLinks[i]);\n continue;\n }\n\n newLinks.push(newLink);\n }\n\n return newLinks;\n };\n\n self.getStructuresDotBracket = function() {\n console.log('self.rnas:', self.rnas);\n let sequence = [];\n let currIdx = 1;\n let nodeIdxs = {};\n let breaks = [];\n let pairtable = [];\n\n // add the nodes\n for (let uid in self.rnas) {\n let rna = self.rnas[uid];\n\n for (let j = 0; j < rna.nodes.length; j++) {\n let node = rna.nodes[j];\n\n if (node.nodeType != 'nucleotide')\n continue;\n\n console.log('node:', node);\n nodeIdxs[node.uid] = currIdx;\n currIdx += 1;\n\n sequence.push(node.name);\n }\n\n breaks.push(currIdx);\n }\n\n pairtable = [currIdx-1]\n for (let i = 0; i < currIdx; i++)\n pairtable.push(0)\n\n // add the links\n for (let uid in self.rnas) {\n let rna = self.rnas[uid];\n\n for (let j = 0; j < rna.links.length; j++) {\n let link = rna.links[j];\n\n if (link.linkType != 'basepair')\n continue;\n\n let idx1 = nodeIdxs[link.source.uid];\n let idx2 = nodeIdxs[link.target.uid];\n pairtable[idx1] = idx2;\n pairtable[idx2] = idx1;\n }\n }\n\n for (let i = 0; i < self.extraLinks.length; i++) {\n let link = self.extraLinks[i];\n\n let idx1 = nodeIdxs[link.source.uid];\n let idx2 = nodeIdxs[link.target.uid];\n\n pairtable[idx1] = idx2;\n pairtable[idx2] = idx1;\n }\n\n let structure = rnaUtilities.pairtableToDotbracket(pairtable).split('');\n\n for (let i = 0; i < breaks.length - 1; i++) {\n console.log('breaks[i]:', breaks[i]);\n sequence.splice(breaks[i] + i - 1, 0, '&');\n structure.splice(breaks[i] + i - 1, 0, '&');\n }\n\n console.log('sequence:', sequence, sequence.join(''));\n console.log('structure:', structure, structure.join(''));\n return [sequence.join(''), structure.join('')];\n };\n\n /* APIs */\n self.startAnimation = function() {\n self.options.animation = true;\n vis.selectAll('g.gnode')\n .call(drag);\n self.force.start();\n };\n\n self.stopAnimation = function() {\n self.options.animation = false;\n vis.selectAll('g.gnode')\n .on('mousedown.drag', null);\n self.force.stop();\n };\n\n self.resumeForce = function() {\n if (self.options.animation)\n self.force.resume();\n };\n\n self.setFriction = function(value) {\n self.force.friction(value);\n self.resumeForce();\n };\n\n self.setCharge = function(value) {\n self.force.charge(value);\n self.resumeForce();\n };\n\n self.setGravity = function(value) {\n self.force.gravity(value);\n self.resumeForce();\n };\n\n self.setPseudoknotStrength = function(value) {\n self.linkStrengths.pseudoknot = value;\n self.update();\n };\n\n self.displayNumbering = function(value) {\n self.displayParameters.displayNumbering = value;\n updateStyle();\n };\n\n self.displayNodeOutline = function(value) {\n self.displayParameters.displayNodeOutline = value;\n updateStyle();\n };\n\n self.displayNodeLabel = function(value) {\n self.displayParameters.displayNodeLabel = value;\n updateStyle();\n };\n\n self.displayLinks = function(value) {\n self.displayParameters.displayLinks = value;\n updateStyle();\n };\n\n self.displayPseudoknotLinks = function(value) {\n self.displayParameters.displayPseudoknotLinks = value;\n updateStyle();\n };\n\n self.displayProteinLinks = function(value) {\n self.displayParameters.displayProteinLinks = value;\n updateStyle();\n };\n\n self.displayDirectionArrows = function(value) {\n self.displayParameters.displayDirectionArrows = value;\n updateStyle();\n };\n}\n","import {RNAGraph} from './rnagraph.js';\n\nimport {simpleXyCoordinates} from './simplernaplot.js';\nimport {NAView} from './naview/naview.js'\n\nimport fstyle from './fornac.css';\n\nexport function rnaPlot(passedOptions = {}) {\n var options = {\n 'width': 300,\n 'height': 300,\n 'nucleotideRadius': 5,\n 'rnaEdgePadding': 1, // how far the leftmost, rightmost, topmost and bottomost\n // nucleotides are from the edge of the plot\n 'labelInterval': 10,\n 'showNucleotideLabels': true,\n 'startNucleotideNumber': 1,\n 'bundleExternalLinks': false,\n\n 'rnaLayout': 'simple', // simple or naview\n 'namePosition': '0 0' // for x and y either 0, 0.5 or 1\n };\n var options = Object.assign(options, passedOptions);\n\n var xScale, yScale;\n\n function createTransformToFillViewport(xValues, yValues) {\n // create transform that will scale the x and y values so that\n // they fill the available viewport\n let xExtent = d3.extent(xValues);\n let yExtent = d3.extent(yValues);\n\n // add the radius of the nucleotides\n xExtent[0] -= options.nucleotideRadius + options.rnaEdgePadding;\n yExtent[0] -= options.nucleotideRadius + options.rnaEdgePadding;\n\n xExtent[1] += options.nucleotideRadius + options.rnaEdgePadding;\n yExtent[1] += options.nucleotideRadius + options.rnaEdgePadding;\n\n // find out how wide and height the molecule\n var xRange = xExtent[1] - xExtent[0];\n var yRange = yExtent[1] - yExtent[0];\n\n // how much wider / taller is it than the available viewport\n var xExtra = xRange - options.width;\n var yExtra = yRange - options.height;\n\n // once we have a scale for one dimension, we can create the scale for the other\n // keeping the same expansion / shrinking ratio\n function createOtherScale(firstScale, newDomain, newRange) {\n var scaleFactor = (firstScale.range()[1] - firstScale.range()[0]) /\n (firstScale.domain()[1] - firstScale.domain()[0]);\n var newWidth = (newDomain[1] - newDomain[0]) * scaleFactor\n var newMargin = ((newRange[1] - newRange[0]) - newWidth) / 2;\n\n return {'scaleFactor': scaleFactor,\n 'scale': d3.scale.linear()\n .domain(newDomain)\n .range([newRange[0] + newMargin, newRange[1] - newMargin])};\n }\n\n var ret;\n\n if (xExtra > yExtra) {\n // we have to shrink more in the x-dimension than the y\n xScale = d3.scale.linear()\n .domain(xExtent)\n .range([0, options.width])\n\n ret = createOtherScale(xScale, yExtent, [0, options.height]);\n yScale = ret.scale;\n } else {\n // we have to shrink more in the x-dimension than the y\n yScale = d3.scale.linear()\n .domain(yExtent)\n .range([0, options.height])\n\n ret = createOtherScale(yScale, xExtent, [0, options.width]);\n xScale = ret.scale;\n }\n\n var xOffset = xScale.range()[0] - xScale.domain()[0];\n var yOffset = yScale.range()[0] - yScale.domain()[0];\n\n return 'translate(' + -(xScale.domain()[0] * ret.scaleFactor - xScale.range()[0]) +\n ',' + -(yScale.domain()[0] * ret.scaleFactor - yScale.range()[0]) + ')' +\n 'scale(' + ret.scaleFactor + ')';\n }\n\n function createNucleotides(selection, nucleotideNodes) {\n // create groupings for each nucleotide and label\n var gs = selection\n .selectAll('.gnode')\n .data(nucleotideNodes)\n .enter()\n .append('svg:g')\n .classed('gnode', true)\n .attr('transform', function(d) {\n return 'translate(' + d.x + ',' + d.y + ')';\n });\n\n var circles = gs.append('svg:circle')\n .classed(fstyle.node, true)\n .attr('node_type', 'nucleotide')\n .attr('base_type', (d) => { if (d.name) { return d.name.toLowerCase(); }})\n .attr('r', options.nucleotideRadius)\n\n\n if (options.showNucleotideLabels) {\n var nucleotideLabels = gs.append('svg:text')\n .text(function(d) { return d.name; })\n .classed(fstyle.nodeLabel, true)\n .append('svg:title')\n .text(function(d) { return d.struct_name + ':' + d.num; });\n }\n }\n\n function createLabels(selection, labelNodes) {\n // create groupings for each nucleotide and label\n\n var gs = selection\n .selectAll()\n .data(labelNodes)\n .enter()\n .append('svg:g')\n .classed('gnode', true)\n .attr('transform', function(d) {\n return 'translate(' + d.x + ',' + d.y + ')';\n });\n\n var circles = gs.append('svg:circle')\n .classed(fstyle.node, true)\n .attr('node_type', 'label')\n .attr('r', options.nucleotideRadius)\n\n var numberLabels = gs.append('svg:text')\n .classed(fstyle.nodeLabel, true)\n .text(function(d) { return d.name; })\n }\n\n function createName(selection, name) {\n let nameLabel = selection.append('svg:text')\n //.attr('dy', -10)\n .classed(fstyle.plotLabel, true)\n .text(name);\n\n let xyPos = options.namePosition.split(\" \", 2) // 0 0.5 1\n let xy = []\n let textBBox = nameLabel.node().getBBox()\n let textSize = [textBBox.width, textBBox.height]\n let plotSize = [options.width, options.height]\n\n for (let p in [0, 1]) {\n switch (xyPos[p]) {\n case '0':\n xy[p] = textSize[p] / 2\n break;\n case '1':\n xy[p] = plotSize[p] - textSize[p] / 2\n break;\n case '0.5':\n xy[p] = plotSize[p] / 2\n break;\n }\n }\n nameLabel.attr('x', xy[0]).attr('y', xy[1])\n }\n\n function makeExternalLinksBundle(selection, links) {\n var nodesDict = {};\n var linksList = [];\n links = links.filter(function(d) { return d.linkType == 'correct' || d.linkType == 'incorrect' || d.linkType == 'extra'; });\n\n selection.selectAll('[link-type=extra]')\n .remove();\n\n\n for (var i = 0; i < links.length; i++) {\n if (links[i].source === null || links[i].target === null)\n continue;\n\n nodesDict[links[i].source.uid] = links[i].source;\n nodesDict[links[i].target.uid] = links[i].target;\n\n linksList.push({'source': links[i].source.uid, 'target': links[i].target.uid, 'linkType': links[i].linkType, 'extraLinkType': links[i].extraLinkType}) ;\n }\n\n var fbundling = d3.ForceEdgeBundling().nodes(nodesDict).edges(linksList)\n .compatibility_threshold(0.8).step_size(0.2);\n var results = fbundling();\n\n var d3line = d3.svg.line()\n .x(function(d){return d.x;})\n .y(function(d){return d.y;})\n .interpolate('linear');\n\n for (var i = 0; i < results.length; i++) {\n var edge_subpoint_data = results[i];\n // for each of the arrays in the results\n // draw a line between the subdivions points for that edge\n\n selection.append('path').attr('d', d3line(edge_subpoint_data))\n .style('fill', 'none')\n .attr('link-type', function(d) { return linksList[i].linkType; })\n .attr('extra-link-type', function(d) { return linksList[i].extraLinkType; })\n .style('stroke-opacity',0.4); //use opacity as blending\n }\n\n }\n\n function createLinks(selection, links) {\n links = links.filter(function(d) { return d.source !== null && d.target !== null; });\n var gs = selection.selectAll('.link')\n .data(links)\n .enter()\n .append('svg:line')\n .attr('x1', function(d) { return d.source.x; })\n .attr('x2', function(d) { return d.target.x; })\n .attr('y1', function(d) { return d.source.y; })\n .attr('y2', function(d) { return d.target.y; })\n .attr('link-type', function(d) { return d.linkType; })\n .attr('extra-link-type', function(d) { return d.extraLinkType; })\n .classed('link', true)\n .classed(fstyle.link, true)\n }\n\n function chart(selection) {\n selection.each(function(data) {\n let plot = d3.select(this).append('g')\n .classed(fstyle.plot, true)\n\n // data should be a dictionary containing at least a structure\n // and possibly a sequence\n let rg = new RNAGraph(data.sequence, data.structure, data.name, options.startNucleotideNumber)\n .recalculateElements()\n .elementsToJson()\n .addName(data.name);\n\n data.rnaGraph = rg;\n // calculate the position of each nucleotide\n // the positions of the labels will be calculated in\n // the addLabels function\n let positions = [];\n\n if (options.rnaLayout === 'naview') {\n var naview = new NAView();\n var naViewPositions = naview.naview_xy_coordinates(rg.pairtable);\n\n for (var i = 0; i < naViewPositions.nbase; i++) {\n positions.push([naViewPositions.x[i], naViewPositions.y[i]]);\n }\n } else {\n positions = simpleXyCoordinates(rg.pairtable);\n }\n\n rg.addPositions('nucleotide', positions)\n //.reinforceStems()\n //.reinforceLoops()\n //.addExtraLinks(data.extraLinks)\n .addLabels(options.startNucleotideNumber, options.labelInterval);\n\n // create a transform that will fit the molecule to the\n // size of the viewport (canvas, svg, whatever)\n let fillViewportTransform = createTransformToFillViewport(\n rg.nodes.map(function(d) { return d.x; }),\n rg.nodes.map(function(d) { return d.y; })\n );\n plot.attr('transform', fillViewportTransform);\n\n let nucleotideNodes = rg.nodes.filter(function(d) {\n return d.nodeType == 'nucleotide';\n });\n\n let labelNodes = rg.nodes.filter(function(d) {\n return d.nodeType == 'label';\n });\n\n let links = rg.links;\n\n createLinks(plot, links);\n createNucleotides(plot, nucleotideNodes);\n createLabels(plot, labelNodes);\n createName(d3.select(this), data.name);\n\n if (options.bundleExternalLinks) {\n makeExternalLinksBundle(plot, links);\n }\n\n });\n }\n\n chart.width = function(_) {\n if (!arguments.length) return options.width;\n options.width = _;\n return chart;\n };\n\n chart.height = function(_) {\n if (!arguments.length) return options.height;\n options.height = _;\n return chart;\n };\n\n chart.showNucleotideLabels = function(_) {\n if (!arguments.length) return options.showNucleotideLabels;\n options.showNucleotideLabels = _;\n return chart;\n };\n\n chart.rnaEdgePadding = function(_) {\n if (!arguments.length) return options.rnaEdgePadding;\n options.rnaEdgePadding = _;\n return chart;\n };\n\n chart.nucleotideRadius = function(_) {\n if (!arguments.length) return options.nucleotideRadius;\n options.nucleotideRadius = _;\n return chart;\n };\n\n chart.labelInterval = function(_) {\n if (!arguments.length) return options.labelInterval;\n options.labelInterval = _;\n return chart;\n };\n\n chart.showNucleotideLabels = function(_) {\n if (!arguments.length) return options.showNucleotideLabels;\n options.showNucleotideLabels = _;\n return chart;\n };\n\n chart.startNucleotideNumber = function(_) {\n if (!arguments.length) return options.startNucleotideNumber;\n options.startNucleotideNumber = _;\n return chart;\n };\n\n chart.bundleExternalLinks = function(_) {\n if (!arguments.length) return options.bundleExternalLinks;\n options.bundleExternalLinks = _;\n return chart;\n };\n\n chart.rnaLayout = function(_) {\n if (!arguments.length) return options.rnaLayout;\n options.rnaLayout = _;\n return chart;\n };\n\n chart.namePosition = function(_) {\n if (!arguments.length) return options.namePosition;\n options.namePosition = _;\n return chart;\n };\n\n return chart;\n}\n","import {rnaPlot} from './rnaplot.js';\n\nexport function rnaTreemap(passedOptions = {}) {\n var options = {\n 'width': 300,\n 'height': 300,\n 'nucleotideRadius': 5,\n 'rnaEdgePadding': 1, // how far the leftmost, rightmost, topmost and bottomost\n // nucleotides are from the edge of the plot\n 'labelInterval': 10,\n 'showNucleotideLabels': true,\n 'startNucleotideNumber': 1,\n 'bundleExternalLinks': false,\n\n 'rnaLayout': 'simple', // simple or naview\n 'namePosition': '0 0', // for x and y either 0, 0.5 or 1\n };\n\n var options = Object.assign(options, passedOptions);\n\n function rnaTreemapNode(selection) {\n // create a background rectangle for each RNA structure\n selection.each(function(d) {\n d3.select(this)\n .attr('transform', function(d) { return 'translate(' + d.x + ',' + d.y + ')' })\n .append('rect')\n .attr('fill', 'transparent')\n .attr('width', function(d) { return Math.max(0, d.dx); })\n .attr('height', function(d) { return Math.max(0, d.dy); })\n\n // draw the actual RNA structure\n var chart = rnaPlot(options)\n .width( Math.max(0, d.dx))\n .height( Math.max(0, d.dy))\n\n if ('structure' in d) d3.select(this).call(chart)\n });\n }\n\n var chart = function(selection) {\n selection.each(function(data) {\n console.log('data:', data)\n // initialize the treemap structure\n // sample input\n // { 'name': 'blah',\n // 'children: [{'structure': '..((..))',\n // 'sequence': 'ACCGGCC',\n // 'size': 50}]\n // }\n var treemap = d3.layout.treemap()\n .size([options.width, options.height])\n .sticky(false)\n .value(function(d) { return d.size; });\n\n // create a new for each node in the treemap\n // this may be a little redundant, since we expect the calling\n // selection to contain their own g elements\n var gEnter = d3.select(this)\n .append('g')\n .classed('rnatreemap', true)\n var treemapGnodes = gEnter.datum(data).selectAll('.treemapnode')\n .data(treemap.nodes)\n .enter()\n .append('g')\n .classed('treemapnode', true)\n .call(rnaTreemapNode);\n });\n };\n\n chart.width = function(_) {\n if (!arguments.length) return options.width;\n options.width = _;\n return chart;\n };\n\n chart.height = function(_) {\n if (!arguments.length) return options.height;\n options.height = _;\n return chart;\n };\n\n chart.showNucleotideLabels = function(_) {\n if (!arguments.length) return options.showNucleotideLabels;\n options.showNucleotideLabels = _;\n return chart;\n };\n\n chart.rnaEdgePadding = function(_) {\n if (!arguments.length) return options.rnaEdgePadding;\n options.rnaEdgePadding = _;\n return chart;\n };\n\n chart.nucleotideRadius = function(_) {\n if (!arguments.length) return options.nucleotideRadius;\n options.nucleotideRadius = _;\n return chart;\n };\n\n chart.labelInterval = function(_) {\n if (!arguments.length) return options.labelInterval;\n options.labelInterval = _;\n return chart;\n };\n\n chart.showNucleotideLabels = function(_) {\n if (!arguments.length) return options.showNucleotideLabels;\n options.showNucleotideLabels = _;\n return chart;\n };\n\n chart.startNucleotideNumber = function(_) {\n if (!arguments.length) return options.startNucleotideNumber;\n options.startNucleotideNumber = _;\n return chart;\n };\n\n chart.bundleExternalLinks = function(_) {\n if (!arguments.length) return options.bundleExternalLinks;\n options.bundleExternalLinks = _;\n return chart;\n };\n\n chart.rnaLayout = function(_) {\n if (!arguments.length) return options.rnaLayout;\n options.rnaLayout = _;\n return chart;\n };\n\n chart.namePosition = function(_) {\n if (!arguments.length) return options.namePosition;\n options.namePosition = _;\n return chart;\n };\n\n chart.zoom = function(_) {\n if (!arguments.length) return options.zoom;\n options.zoom = _;\n return chart;\n };\n\n return chart;\n}\n"],"names":["root","factory","exports","module","require","define","amd","self","__WEBPACK_EXTERNAL_MODULE__893__","Connection","this","loop","Loop","region","Region","start","end","xrad","yrad","angle","extruded","broken","_isNull","prototype","isNull","setNull","getLoop","setLoop","getRegion","setRegion","getStart","setStart","getEnd","setEnd","getXrad","setXrad","getYrad","setYrad","getAngle","setAngle","isExtruded","setExtruded","isBroken","setBroken","nconnection","connections","_connections","number","depth","mark","x","y","radius","getNconnection","setNconnection","setConnection","i","c","getConnection","addConnection","push","getNumber","setNumber","getDepth","setDepth","isMark","setMark","getX","setX","getY","setY","getRadius","setRadius","_start1","_end1","_start2","_end2","getStart1","setStart1","start1","getEnd1","setEnd1","end1","getStart2","setStart2","start2","getEnd2","setEnd2","end2","byteLength","b64","lens","getLens","validLen","placeHoldersLen","toByteArray","tmp","arr","Arr","_byteLength","curByte","len","revLookup","charCodeAt","fromByteArray","uint8","length","extraBytes","parts","maxChunkLength","len2","encodeChunk","lookup","join","Uint8Array","Array","code","Error","indexOf","num","output","base64","ieee754","customInspectSymbol","Symbol","Buffer","K_MAX_LENGTH","createBuffer","RangeError","buf","Object","setPrototypeOf","arg","encodingOrOffset","TypeError","allocUnsafe","from","value","string","encoding","isEncoding","actual","write","slice","fromString","ArrayBuffer","isView","arrayView","isInstance","copy","fromArrayBuffer","buffer","byteOffset","fromArrayLike","fromArrayView","SharedArrayBuffer","valueOf","b","obj","isBuffer","checked","undefined","numberIsNaN","type","isArray","data","fromObject","toPrimitive","assertSize","size","array","toString","mustMatch","arguments","loweredCase","utf8ToBytes","base64ToBytes","toLowerCase","slowToString","hexSlice","utf8Slice","asciiSlice","latin1Slice","base64Slice","utf16leSlice","swap","n","m","bidirectionalIndexOf","val","dir","arrayIndexOf","call","lastIndexOf","indexSize","arrLength","valLength","String","read","readUInt16BE","foundIndex","found","j","hexWrite","offset","Number","remaining","strLen","parsed","parseInt","substr","utf8Write","blitBuffer","asciiWrite","str","byteArray","asciiToBytes","base64Write","ucs2Write","units","hi","lo","utf16leToBytes","Math","min","res","firstByte","codePoint","bytesPerSequence","secondByte","thirdByte","fourthByte","tempCodePoint","codePoints","MAX_ARGUMENTS_LENGTH","fromCharCode","apply","decodeCodePointsArray","TYPED_ARRAY_SUPPORT","proto","foo","e","typedArraySupport","console","error","defineProperty","enumerable","get","poolSize","alloc","fill","allocUnsafeSlow","_isBuffer","compare","a","concat","list","pos","set","swap16","swap32","swap64","toLocaleString","equals","inspect","max","replace","trim","target","thisStart","thisEnd","thisCopy","targetCopy","includes","isFinite","toJSON","_arr","ret","out","hexSliceLookupTable","bytes","checkOffset","ext","checkInt","wrtBigUInt64LE","checkIntBI","BigInt","wrtBigUInt64BE","checkIEEE754","writeFloat","littleEndian","noAssert","writeDouble","newBuf","subarray","readUintLE","readUIntLE","mul","readUintBE","readUIntBE","readUint8","readUInt8","readUint16LE","readUInt16LE","readUint16BE","readUint32LE","readUInt32LE","readUint32BE","readUInt32BE","readBigUInt64LE","defineBigIntMethod","validateNumber","first","last","boundsError","readBigUInt64BE","readIntLE","pow","readIntBE","readInt8","readInt16LE","readInt16BE","readInt32LE","readInt32BE","readBigInt64LE","readBigInt64BE","readFloatLE","readFloatBE","readDoubleLE","readDoubleBE","writeUintLE","writeUIntLE","writeUintBE","writeUIntBE","writeUint8","writeUInt8","writeUint16LE","writeUInt16LE","writeUint16BE","writeUInt16BE","writeUint32LE","writeUInt32LE","writeUint32BE","writeUInt32BE","writeBigUInt64LE","writeBigUInt64BE","writeIntLE","limit","sub","writeIntBE","writeInt8","writeInt16LE","writeInt16BE","writeInt32LE","writeInt32BE","writeBigInt64LE","writeBigInt64BE","writeFloatLE","writeFloatBE","writeDoubleLE","writeDoubleBE","targetStart","copyWithin","errors","E","sym","getMessage","Base","constructor","super","writable","configurable","name","stack","message","addNumericalSeparator","range","ERR_OUT_OF_RANGE","checkBounds","ERR_INVALID_ARG_TYPE","floor","ERR_BUFFER_OUT_OF_BOUNDS","input","msg","received","isInteger","abs","INVALID_BASE64_RE","Infinity","leadSurrogate","split","base64clean","src","dst","alphabet","table","i16","fn","BufferBigIntNotDefined","isLE","mLen","nBytes","eLen","eMax","eBias","nBits","d","s","NaN","rt","isNaN","log","LN2","uuid","toBase64","btoa","fromBase64","atob","encode","uuid_","parse","substring","decode","slug","stringify","v4","nice","getRandomValues","rnds8","rng","crypto","bind","msCrypto","test","byteToHex","_nodeId","_clockseq","_lastMSecs","_lastNSecs","options","node","clockseq","seedBytes","random","msecs","Date","now","nsecs","dt","tl","tmh","v","version","hashfunc","generateUUID","namespace","unescape","encodeURIComponent","stringToBytes","err","DNS","URL","getOutputLength","inputLength8","safeAdd","lsw","md5cmn","q","t","cnt","md5ff","md5gg","md5hh","md5ii","v35","length32","hexTab","hex","charAt","md5ToHexEncodedArray","olda","oldb","oldc","oldd","wordsToMd5","length8","Uint32Array","bytesToWords","rnds","f","z","ROTL","K","H","l","N","ceil","M","_i","_i2","W","_t","_t2","T","__webpack_module_cache__","__webpack_require__","moduleId","cachedModule","__webpack_modules__","getter","__esModule","definition","key","o","g","globalThis","Function","window","prop","hasOwnProperty","r","toStringTag","scriptUrl","importScripts","location","document","currentScript","scripts","getElementsByTagName","p","contextMenu","menu","opts","openCallback","closeCallback","previouslyMouseUp","uid","slugid","rootElement","orientation","initialPos","parentStart","onOpen","onClose","d3","enter","append","classed","on","style","index","mousePos","pMouseUp","elm","currentThis","openChildMenuUid","html","preventDefault","stopPropagation","selectAll","attr","divider","disabled","action","title","children","childUid","boundingRect","getBoundingClientRect","childrenContextMenu","left","pageXOffset","top","pageYOffset","width","ArrowIcon","contextMenuSelection","pageX","pageY","innerWidth","numberSort","RNAUtilities","bracketLeft","bracketRight","inverseBrackets","bracket","maximumMatching","pt","mm","maximum","backtrackMaximumMatching","oldPt","map","mmBt","dotbracketToPairtable","dotbracket","inverseBracketLeft","inverseBracketRight","ni","pop","insertIntoStack","k","deleteFromStack","pairtableToDotbracket","seen","findUnmatched","to","toRemove","unmatched","origFrom","origTo","removePseudoknotsFromPairtable","newPt","removed","ptToElements","level","dotBracketBreaks","elements","u5","u3","sort","external","right","rnaUtilities","ColorScheme","colorsText","parseRange","rangeText","nums","parts1","parseColorText","colorText","lines","currMolecule","counter","colorsJson","colorValues","domainValues","words","search","partsRight","domain","color","normalizeColors","moleculeName","minNum","MAX_VALUE","maxNum","MIN_VALUE","resnum","RNAGraph","seq","structName","startNumber","circularizeExternal","circular","pseudoknotPairs","nucsToNodes","addUids","uids","nucleotideNodes","nodes","filter","nodeType","computePairtable","pairtable","removeBreaks","targetString","breaks","seqBreaks","rnaLength","arraysEqual","addPositions","positions","labelNodes","breakNodesToFakeNodes","_loop","elemType","getPositions","getUids","reinforceStems","relevantElements","allNucs","nucs","addFakeNode","reinforceLoops","filterNucs","newNode1","px","py","newNode2","updateLinkUids","links","source","tan","fakeNodeUid","newNode","newX","newY","coordsCounted","cos","ia","fromNode","connectFakeNodes","fakeNodes","linked","thisNode","thisNuc","JSON","distance","addExtraLinks","extraLinks","newLink","getNodeFromNucleotides","linkType","elementsToJson","elemTypes","nodeName","prevNode","nextNode","addLabels","labelInterval","prevVec","nextVec","combinedVec","vecLength","sqrt","normedVec","offsetVec","recalculateElements","removePseudoknots","externalLoop","eloop","prev","hloop","numGreater","reassignLinkUids","addPseudoknots","addName","simpleXyCoordinates","pair_table","alpha","loop_size","stack_size","lp","stk","PIHALF","PI","i_old","partner","start_k","start_l","ladder","begin","diff","polygon","count","bubble","remember","poss","sin","Radloop","loopnumber","next","getLoopnumber","setLoopnumber","getNext","setNext","getPrev","setPrev","mate","extracted","getMate","setMate","isExtracted","setExtracted","NAView","ANUM","MAXITER","bases","nbase","nregion","loop_count","loops","regions","rlphead","lencut","RADIUS_REDUCTION_FACTOR","angleinc","_h","HELIX_FACTOR","BACKBONE_DISTANCE","determine_depths","FornaContainer","element","passedOptions","assign","initialSize","svgW","svgH","linkStrengths","displayParameters","colorScheme","customColors","rnas","mousedownNode","mouseupNode","linkContextMenuShown","resetMouseVars","graph","editable","animation","shiftKeydown","ctrlKeydown","keyCode","getStructuresDotBracket","centerView","zoomable","disableZooming","enableBrushing","enableZooming","disableBrushing","backgroundMenu","canvasMousePos","xScale","invert","yScale","addRNA","nodeMenu","deleteNode","changeNode","insertNodeBeforeOrAfter","nodeContextMenu","backgroundContextMenu","select","remove","svg","each","focus","mouseEventHelper","mpos","vis","dragLine","fstyle","deselectAllNodes","visLinks","visNodes","linear","zoomer","zoom","scaleExtent","translate","scale","toggleSelectNode","selected","selectedNodes","brusher","brush","extent","clear","force","charge","middleCharge","otherCharge","friction","linkDistance","linkDistanceMultiplier","linkStrength","other","gravity","chargeDistance","drag","sourceEvent","d1","fixed","dx","dy","resumeForce","createInitialLayout","structure","rg","sequence","rnaJson","layout","naViewPositions","naview_xy_coordinates","createNewNodes","gnodesEnter","previouslySelected","rna","transition","duration","ease","nodeMousedown","nodeMouseup","labelAndProteinNodes","text","createNewLinks","linksEnter","linkLines","linkClick","drawDirectionArrow","magnitude","endPoint","startPoint","nodeStroke","parseFloat","lengthMult","arrowWidth","u","arrowTip","path","realLinkFilter","recalculateGraph","uidsToNodes","forEach","link","fakeLinks","linkIndex","splice","update","allLinks","elementKey","exit","gnodes","realNodes","quadtree","collide","nx1","nx2","ny1","ny2","quad","x1","y1","x2","y2","point","visit","changeColorScheme","updateStyle","transitionRNA","newStructure","nextFunction","transitionDuration","newRNAJson","newNodes","callback","setTimeout","bbTransform","minX","minY","maxX","maxY","maxRadius","molWidth","molHeight","widthRatio","heightRatio","minRatio","maxNodeRadius","newMolWidth","newMolHeight","getBoundingBoxTransform","setSize","offsetWidth","offsetHeight","setOutlineColor","addCustomColors","json","addCustomColorsText","customColorsText","cs","newColorScheme","ordinal","category10","interpolate","changeColors","moleculeColors","displayNumbering","displayNodeOutline","displayNodeLabel","displayLinks","displayPseudoknotLinks","displayProteinLinks","displayAllLinks","displayDirectionArrows","referenceNode","newNodeNum","newDotbracket","newSequence","newPositions","positionOffset","newUids","pair","updateRnaGraph","nucleotidePositions","labelPositions","basepairPossible","linkMenu","rna1","rna2","dotbracket1","dotbracket2","seq1","seq2","positions1","positions2","newSeq","toAddExternal","toDelete","newRna","addBackBoneLink","addLink","linkContextMenu","sequence1","sequence2","rnaDotBracket","dotBracket1","dotBracket2","uids1","uids2","removeBackBoneLink","extraLinkIndex","removeLink","fromJSON","jsonString","ProteinGraph","addRNAJSON","newLinks","addExternalLinks","centerPos","avoidOthers","rnaGraph","_ref","_ref$avoidOthers","_ref$centerPos","_ref$centerView","totalX","totalY","nodeCount","addNodes","entry","clearNodes","externalLinks","currIdx","nodeIdxs","idx1","idx2","startAnimation","stopAnimation","stop","resume","setFriction","setCharge","setGravity","setPseudoknotStrength","pseudoknot","rnaPlot","chart","selection","plot","startNucleotideNumber","rnaLayout","fillViewportTransform","xValues","yValues","xExtent","yExtent","nucleotideRadius","rnaEdgePadding","xRange","yRange","createOtherScale","firstScale","newDomain","newRange","scaleFactor","newWidth","newMargin","height","createTransformToFillViewport","extraLinkType","createLinks","gs","showNucleotideLabels","struct_name","createNucleotides","createLabels","nameLabel","xyPos","namePosition","xy","textBBox","getBBox","textSize","plotSize","createName","bundleExternalLinks","nodesDict","linksList","results","ForceEdgeBundling","edges","compatibility_threshold","step_size","fbundling","d3line","line","edge_subpoint_data","makeExternalLinksBundle","_","rnaTreemap","rnaTreemapNode","treemap","sticky","datum","read_in_bases","find_regions","construct_loop","find_central_loop","traverse_loop","npairs","nb1","ibase","retloop","cp","rp","rlp","maxconn","maxdepth","anchor_connection","xs","ys","xe","xn","yn","xc","yc","xo","yo","astart","aend","cpnext","acp","cpprev","ic","da","maxang","icstart","icend","icmiddle","icroot","done","done_all_connections","rooted","sign","midx","midy","nrx","nry","mx","my","vx","vy","dotmv","nmidx","nmidy","icstart1","icup","icdown","icnext","direction","dan","rr","cpx","cpy","cpnextx","cpnexty","cnx","rcn","rc","lnx","lny","rl","ac","acn","sx","sy","dcp","imaxloop","indice","atan2","set_radius","determine_radius","connected_connection","find_ic_middle","asin","construct_extruded_segment","generate_region","mindit","ci","sumn","sumd","dit","imindit","rt2_2","aend1","aend2","aave","a1","a2","dac","nstart","nend","collision","construct_circle_segment","minf2","maxf2","find_center_for_arc","h","hhi","hlow","disc","theta","iter","acos","noIterationFailureYet"],"sourceRoot":""} \ No newline at end of file From c88a5e9745b0fcd7673c7c1ec3ad2cbbe93ce7c3 Mon Sep 17 00:00:00 2001 From: Lucandia Date: Thu, 30 May 2024 18:25:05 +0200 Subject: [PATCH 3/9] Remove handling and breaking of '&' in RNAgraph --- src/rnagraph.js | 132 ++++++++++++++++++++++++------------------------ 1 file changed, 66 insertions(+), 66 deletions(-) diff --git a/src/rnagraph.js b/src/rnagraph.js index a2fd615..790e353 100644 --- a/src/rnagraph.js +++ b/src/rnagraph.js @@ -84,35 +84,35 @@ export function RNAGraph(seq = '', dotbracket = '', structName = '', startNumber self.pairtable = rnaUtilities.dotbracketToPairtable(self.dotbracket); }; - self.removeBreaks = function(targetString) { - // Collect the indexes of the chain breaks in the targetString - // chain breaks are indicated by '&' - var breaks = []; - for (var i = 0; i < targetString.length; i++) { - if (targetString[i] === '&') { - breaks.push(i); - } - } - - return {targetString: targetString, breaks: breaks}; - }; - - var ret = self.removeBreaks(self.dotbracket); + // self.removeBreaks = function(targetString) { + // // Collect the indexes of the chain breaks in the targetString + // // chain breaks are indicated by '&' + // var breaks = []; + // for (var i = 0; i < targetString.length; i++) { + // if (targetString[i] === '&') { + // breaks.push(i); + // } + // } + + // return {targetString: targetString, breaks: breaks}; + // }; + + // var ret = self.removeBreaks(self.dotbracket); // commented out to avoid removing the break node, let's keep it in the dotbracket // self.dotbracket = ret.targetString; - self.dotBracketBreaks = ret.breaks; + // self.dotBracketBreaks = ret.breaks; - ret = self.removeBreaks(self.seq); + // ret = self.removeBreaks(self.seq); // commented out to avoid removing the break node, let's keep it in the sequence // self.seq = ret.targetString; - self.seqBreaks = ret.breaks; + // self.seqBreaks = ret.breaks; self.rnaLength = self.dotbracket.length; - if (!arraysEqual(self.dotBracketBreaks, self.seqBreaks)) { - console.log('WARNING: Sequence and structure breaks not equal'); - console.log('WARNING: Using the breaks in the structure'); - } + // if (!arraysEqual(self.dotBracketBreaks, self.seqBreaks)) { + // console.log('WARNING: Sequence and structure breaks not equal'); + // console.log('WARNING: Using the breaks in the structure'); + // } self.computePairtable(); @@ -131,24 +131,24 @@ export function RNAGraph(seq = '', dotbracket = '', structName = '', startNumber // convert all the nodes following breaks to fake nodes let labelNodes = self.nodes.filter(function(d) { return d.nodeType == 'nucleotide'; }); - // if a node was an artifical break node, convert it to a middle - for (let i = 0; i < labelNodes.length; i++) { - if (self.dotBracketBreaks.indexOf(i) >= 0) { - labelNodes[i].nodeType = 'middle'; - // commented out to avoid removing the node after the break - // labelNodes[i+1].nodeType = 'middle'; - } - } + // // if a node was an artifical break node, convert it to a middle + // for (let i = 0; i < labelNodes.length; i++) { + // if (self.dotBracketBreaks.indexOf(i) >= 0) { + // labelNodes[i].nodeType = 'middle'; + // // commented out to avoid removing the node after the break + // // labelNodes[i+1].nodeType = 'middle'; + // } + // } for (let i = 0; i < self.elements.length; i++) { var broken = false; - // change the elemType of the other nodes in the element containing - // the break - for (let j = 0; j < self.elements[i][2].length; j++) { - if (self.dotBracketBreaks.indexOf(self.elements[i][2][j]) >= 0) - broken = true; - } + // // change the elemType of the other nodes in the element containing + // // the break + // for (let j = 0; j < self.elements[i][2].length; j++) { + // if (self.dotBracketBreaks.indexOf(self.elements[i][2][j]) >= 0) + // broken = true; + // } if (broken) { self.elements[i][2].map(function(x) { @@ -445,10 +445,10 @@ export function RNAGraph(seq = '', dotbracket = '', structName = '', startNumber for (let i = 1; i <= pt[0]; i++) { var nodeName = self.seq[i-1]; - // remove only the breaks that are in the sequence - if (self.dotBracketBreaks.indexOf(i-1) >= 0) { - nodeName = ''; - } + // // remove only the breaks that are in the sequence + // if (self.dotBracketBreaks.indexOf(i-1) >= 0) { + // nodeName = ''; + // } //create a node for each nucleotide self.nodes.push({'name': nodeName, @@ -490,8 +490,8 @@ export function RNAGraph(seq = '', dotbracket = '', structName = '', startNumber if (i > 1) { // backbone links // unlink only the break and the nucleotide before it - if (self.dotBracketBreaks.indexOf(i-1) === -1 && - self.dotBracketBreaks.indexOf(i-2) == -1) { + // if (self.dotBracketBreaks.indexOf(i-1) === -1 && + // self.dotBracketBreaks.indexOf(i-2) == -1) { // there is no break in the strands here // we can add a backbone link self.links.push({'source': self.nodes[i-2], @@ -500,7 +500,7 @@ export function RNAGraph(seq = '', dotbracket = '', structName = '', startNumber 'value': 1, 'uid': slugid.nice() }); self.nodes[i-1].linked = true; - } + // } } } @@ -556,31 +556,31 @@ export function RNAGraph(seq = '', dotbracket = '', structName = '', startNumber if (i > j) { //hairpin loop or one large unpaired molecule u5.push(i); - if (level === 0) + // if (level === 0) return [['e',level, u5.sort(numberSort)]]; - else { - // check to see if we have chain breaks due - // to multiple strands in the input - var external = false; - var left = []; - var right = []; - for (var k = 0; k < u5.length; k++) { - if (external) - right.push(u5[k]); - else - left.push(u5[k]); - - if (self.dotBracketBreaks.indexOf(u5[k]) >= 0) - external = true; - } - - if (external) { - return [['h',level, u5.sort(numberSort)]]; - } - else - // if not, this is a simple hairpin loop - return [['h',level, u5.sort(numberSort)]]; - } + // else { + // // check to see if we have chain breaks due + // // to multiple strands in the input + // var external = false; + // var left = []; + // var right = []; + // for (var k = 0; k < u5.length; k++) { + // if (external) + // right.push(u5[k]); + // else + // left.push(u5[k]); + + // if (self.dotBracketBreaks.indexOf(u5[k]) >= 0) + // external = true; + // } + + // if (external) { + // return [['h',level, u5.sort(numberSort)]]; + // } + // else + // // if not, this is a simple hairpin loop + // return [['h',level, u5.sort(numberSort)]]; + // } } if (pt[i] != j) { From c595f2bd8b7ba003f9097cf33d6bb5758f00cb59 Mon Sep 17 00:00:00 2001 From: Lucandia Date: Thu, 30 May 2024 18:27:46 +0200 Subject: [PATCH 4/9] if the addRNA structure contains the symbol '&', split them with a new function, add the strands and the extra links --- src/fornac.js | 110 +++++++++++++++++++++++++++++++++++++++++++++++++- 1 file changed, 109 insertions(+), 1 deletion(-) diff --git a/src/fornac.js b/src/fornac.js index f117407..bcafff5 100644 --- a/src/fornac.js +++ b/src/fornac.js @@ -1490,6 +1490,107 @@ export function FornaContainer(element, passedOptions = {}) { // add them back to the plot } + let splitMultiStrand = function(rna) { + // split a multi strand RNA into its individual strands + // get the position of the '&' character in the dotbracket string + let breakPositions = []; + for (let i = 0; i < rna.dotbracket.length; i++) { + if (rna.dotbracket[i] == '&') { + breakPositions.push(i); + } + } + + let toRemove = []; + // collect all the base pairs that are between split strands + for (let i = 0; i < rna.links.length; i++) { + let link = rna.links[i]; + + if (link.linkType != 'basepair') + continue; // only consider base pairs + + for (let j = 0; j < breakPositions.length; j++) { + let node = rna.nodes[breakPositions[j]]; // take the split node + // take the two links that connect the split node + let linkSource = rna.links.filter(link => link.source === node)[0]; + let linkTarget = rna.links.filter(link => link.target === node)[0]; + if (link.source.num <= linkSource.source.num && link.target.num >= linkTarget.target.num) { + console.log('crossing basepair', link); + link.breakFrom = 0; + // find the strand that the source is in + for (let k = 0; k < breakPositions.length - 1; k++) { + if (link.source.num > breakPositions[k] && link.source.num < breakPositions[k+1]) + link.breakFrom = k+1; + } + // find the strand that the target is in + link.breakTo = j+1; + link.from = link.source.num; + // find the position of the source in the strand + if (link.breakFrom > 0) link.from -= breakPositions[link.breakFrom-1] + link.breakFrom; + // find the position of the target in the strand + link.to = link.target.num - linkTarget.target.num; + toRemove.push(link); + } + } + } + + + // Remove all base pairs that are between these two nodes and add them as extra + // links + console.log('toRemove:', toRemove); + let sequences = rna.seq.split('&'); + + // remove the base pairs + for (let i = 0; i < toRemove.length; i++) { + rna.pairtable[toRemove[i].source.num] = 0; + rna.pairtable[toRemove[i].target.num] = 0; + } + + // extract the dotbracket string of the rna + // cut it at the position of this backbone bond + console.log('sequences:', sequences); + + let rnaDotBracket = rnaUtilities.pairtableToDotbracket(rna.pairtable); + let dotbrackets = []; // array to hold the dotbracket strings of the individual strands + let rnaPositions = rna.getPositions('nucleotide') // get the nucleotide positions, cut them at the positions of the backbone bond + let positions = []; + let rnaUids = rna.getUids(); + let uids = []; + let lastBreak = 0; // the position of the last break + for (let i = 0; i <= breakPositions.length; i++) { + // cut the dotbracket + dotbrackets.push(rnaDotBracket.slice(lastBreak, breakPositions[i])); + // add the positions + positions.push(rnaPositions.slice(lastBreak, breakPositions[i])); + // add the uids + uids.push(rnaUids.slice(lastBreak, breakPositions[i])); + lastBreak = breakPositions[i] + 1; + } + + console.log('positions:', positions); + + delete self.rnas[rna.uid]; + let newRnas = []; + for (let i = 0; i < sequences.length; i++) { + let newRna = self.addRNA(dotbrackets[i], { 'sequence': sequences[i], + 'positions': positions[i], + 'uids': uids[i] }); + newRnas.push(newRna); + } + // add the extra links + for (let i = 0; i < toRemove.length; i++) { + console.log('toRemove[i]', toRemove[i]); + self.extraLinks.push( + {'source': newRnas[toRemove[i].breakFrom].nodes[toRemove[i].from-1], + 'target': newRnas[toRemove[i].breakTo].nodes[toRemove[i].to-1], + 'value': 1, + 'uid': slugid.nice(), + 'linkType': 'intermolecule'}); + recalculateGraph(); + self.update(); + } + console.log('self.extraLinks:', self.extraLinks); + } + var removeLink = function(d) { // remove a link between two nodes let index = self.graph.links.indexOf(d); @@ -1907,6 +2008,13 @@ export function FornaContainer(element, passedOptions = {}) { else self.addRNAJSON(rnaJson, {centerView: passedOptions.centerView}); + // if the structure containes multistrands, let's split before the '&' + console.log('structure:', structure); + if (structure.indexOf('&') !== -1 && structure != '&' && structure.indexOf('&') !== 0) { + console.log('splitting multistrand'); + splitMultiStrand(rnaJson); + return; + }; return rnaJson; }; @@ -2126,7 +2234,7 @@ export function FornaContainer(element, passedOptions = {}) { if (node.nodeType != 'nucleotide') continue; - console.log('node:', node); + // console.log('node:', node); nodeIdxs[node.uid] = currIdx; currIdx += 1; From 27dc64f0ed73e3d9b394f2fbdab7f4e4e8a1fa48 Mon Sep 17 00:00:00 2001 From: Lucandia Date: Thu, 30 May 2024 18:28:24 +0200 Subject: [PATCH 5/9] updated the build --- dist/fornac.js | 2 +- dist/fornac.js.map | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/dist/fornac.js b/dist/fornac.js index dd8e1e0..6731735 100644 --- a/dist/fornac.js +++ b/dist/fornac.js @@ -1,3 +1,3 @@ /*! For license information please see fornac.js.LICENSE.txt */ -!function(t,e){"object"==typeof exports&&"object"==typeof module?module.exports=e(require("d3")):"function"==typeof define&&define.amd?define(["d3"],e):"object"==typeof exports?exports.fornac=e(require("d3")):t.fornac=e(t.d3)}(self,(t=>(()=>{var e={332:(t,e,n)=>{"use strict";n.r(e),n.d(e,{Connection:()=>i});var r=n(326),o=n(980);function i(){this.loop=new r.F,this.region=new o.T,this.start=null,this.end=null,this.xrad=null,this.yrad=null,this.angle=null,this.extruded=null,this.broken=null,this._isNull=!1}i.prototype.isNull=function(){return this._isNull},i.prototype.setNull=function(t){this._isNull=t},i.prototype.getLoop=function(){return this.loop},i.prototype.setLoop=function(t){this.loop=t},i.prototype.getRegion=function(){return this.region},i.prototype.setRegion=function(t){this.region=t},i.prototype.getStart=function(){return this.start},i.prototype.setStart=function(t){this.start=t},i.prototype.getEnd=function(){return this.end},i.prototype.setEnd=function(t){this.end=t},i.prototype.getXrad=function(){return this.xrad},i.prototype.setXrad=function(t){this.xrad=t},i.prototype.getYrad=function(){return this.yrad},i.prototype.setYrad=function(t){this.yrad=t},i.prototype.getAngle=function(){return this.angle},i.prototype.setAngle=function(t){this.angle=t},i.prototype.isExtruded=function(){return this.extruded},i.prototype.setExtruded=function(t){this.extruded=t},i.prototype.isBroken=function(){return this.broken},i.prototype.setBroken=function(t){this.broken=t}},326:(t,e,n)=>{"use strict";n.d(e,{F:()=>o});var r=n(332);function o(){this.nconnection=null,this.connections=[],this._connections=[],this.number=null,this.depth=null,this.mark=null,this.x=null,this.y=null,this.radius=null}o.prototype.getNconnection=function(){return this.nconnection},o.prototype.setNconnection=function(t){this.nconnection=t},o.prototype.setConnection=function(t,e){null!=e?this._connections[t]=e:(this._connections[t]||(this._connections[t]=new r.Connection),this._connections[t].setNull(!0))},o.prototype.getConnection=function(t){var e=n(332);this._connections[t]||(this._connections[t]=new e);var r=this._connections[t];return r.isNull()?null:r},o.prototype.addConnection=function(t,e){this._connections.push(e)},o.prototype.getNumber=function(){return this.number},o.prototype.setNumber=function(t){this.number=t},o.prototype.getDepth=function(){return this.depth},o.prototype.setDepth=function(t){this.depth=t},o.prototype.isMark=function(){return this.mark},o.prototype.setMark=function(t){this.mark=t},o.prototype.getX=function(){return this.x},o.prototype.setX=function(t){this.x=t},o.prototype.getY=function(){return this.y},o.prototype.setY=function(t){this.y=t},o.prototype.getRadius=function(){return this.radius},o.prototype.setRadius=function(t){this.radius=t}},980:(t,e,n)=>{"use strict";function r(){this._start1=null,this._end1=null,this._start2=null,this._end2=null}n.d(e,{T:()=>r}),r.prototype.getStart1=function(){return this._start1},r.prototype.setStart1=function(t){this._start1=t},r.prototype.getEnd1=function(){return this._end1},r.prototype.setEnd1=function(t){this._end1=t},r.prototype.getStart2=function(){return this._start2},r.prototype.setStart2=function(t){this._start2=t},r.prototype.getEnd2=function(){return this._end2},r.prototype.setEnd2=function(t){this._end2=t}},526:(t,e)=>{"use strict";e.byteLength=function(t){var e=a(t),n=e[0],r=e[1];return 3*(n+r)/4-r},e.toByteArray=function(t){var e,n,i=a(t),s=i[0],u=i[1],l=new o(function(t,e,n){return 3*(e+n)/4-n}(0,s,u)),c=0,f=u>0?s-4:s;for(n=0;n>16&255,l[c++]=e>>8&255,l[c++]=255&e;return 2===u&&(e=r[t.charCodeAt(n)]<<2|r[t.charCodeAt(n+1)]>>4,l[c++]=255&e),1===u&&(e=r[t.charCodeAt(n)]<<10|r[t.charCodeAt(n+1)]<<4|r[t.charCodeAt(n+2)]>>2,l[c++]=e>>8&255,l[c++]=255&e),l},e.fromByteArray=function(t){for(var e,r=t.length,o=r%3,i=[],s=16383,a=0,l=r-o;al?l:a+s));return 1===o?(e=t[r-1],i.push(n[e>>2]+n[e<<4&63]+"==")):2===o&&(e=(t[r-2]<<8)+t[r-1],i.push(n[e>>10]+n[e>>4&63]+n[e<<2&63]+"=")),i.join("")};for(var n=[],r=[],o="undefined"!=typeof Uint8Array?Uint8Array:Array,i="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/",s=0;s<64;++s)n[s]=i[s],r[i.charCodeAt(s)]=s;function a(t){var e=t.length;if(e%4>0)throw new Error("Invalid string. Length must be a multiple of 4");var n=t.indexOf("=");return-1===n&&(n=e),[n,n===e?0:4-n%4]}function u(t,e,r){for(var o,i,s=[],a=e;a>18&63]+n[i>>12&63]+n[i>>6&63]+n[63&i]);return s.join("")}r["-".charCodeAt(0)]=62,r["_".charCodeAt(0)]=63},287:(t,e,n)=>{"use strict";const r=n(526),o=n(251),i="function"==typeof Symbol&&"function"==typeof Symbol.for?Symbol.for("nodejs.util.inspect.custom"):null;e.hp=u,e.IS=50;const s=2147483647;function a(t){if(t>s)throw new RangeError('The value "'+t+'" is invalid for option "size"');const e=new Uint8Array(t);return Object.setPrototypeOf(e,u.prototype),e}function u(t,e,n){if("number"==typeof t){if("string"==typeof e)throw new TypeError('The "string" argument must be of type string. Received type number');return f(t)}return l(t,e,n)}function l(t,e,n){if("string"==typeof t)return function(t,e){if("string"==typeof e&&""!==e||(e="utf8"),!u.isEncoding(e))throw new TypeError("Unknown encoding: "+e);const n=0|g(t,e);let r=a(n);const o=r.write(t,e);return o!==n&&(r=r.slice(0,o)),r}(t,e);if(ArrayBuffer.isView(t))return function(t){if(J(t,Uint8Array)){const e=new Uint8Array(t);return h(e.buffer,e.byteOffset,e.byteLength)}return d(t)}(t);if(null==t)throw new TypeError("The first argument must be one of type string, Buffer, ArrayBuffer, Array, or Array-like Object. Received type "+typeof t);if(J(t,ArrayBuffer)||t&&J(t.buffer,ArrayBuffer))return h(t,e,n);if("undefined"!=typeof SharedArrayBuffer&&(J(t,SharedArrayBuffer)||t&&J(t.buffer,SharedArrayBuffer)))return h(t,e,n);if("number"==typeof t)throw new TypeError('The "value" argument must not be of type number. Received type number');const r=t.valueOf&&t.valueOf();if(null!=r&&r!==t)return u.from(r,e,n);const o=function(t){if(u.isBuffer(t)){const e=0|p(t.length),n=a(e);return 0===n.length||t.copy(n,0,0,e),n}return void 0!==t.length?"number"!=typeof t.length||H(t.length)?a(0):d(t):"Buffer"===t.type&&Array.isArray(t.data)?d(t.data):void 0}(t);if(o)return o;if("undefined"!=typeof Symbol&&null!=Symbol.toPrimitive&&"function"==typeof t[Symbol.toPrimitive])return u.from(t[Symbol.toPrimitive]("string"),e,n);throw new TypeError("The first argument must be one of type string, Buffer, ArrayBuffer, Array, or Array-like Object. Received type "+typeof t)}function c(t){if("number"!=typeof t)throw new TypeError('"size" argument must be of type number');if(t<0)throw new RangeError('The value "'+t+'" is invalid for option "size"')}function f(t){return c(t),a(t<0?0:0|p(t))}function d(t){const e=t.length<0?0:0|p(t.length),n=a(e);for(let r=0;r=s)throw new RangeError("Attempt to allocate Buffer larger than maximum size: 0x"+s.toString(16)+" bytes");return 0|t}function g(t,e){if(u.isBuffer(t))return t.length;if(ArrayBuffer.isView(t)||J(t,ArrayBuffer))return t.byteLength;if("string"!=typeof t)throw new TypeError('The "string" argument must be one of type string, Buffer, or ArrayBuffer. Received type '+typeof t);const n=t.length,r=arguments.length>2&&!0===arguments[2];if(!r&&0===n)return 0;let o=!1;for(;;)switch(e){case"ascii":case"latin1":case"binary":return n;case"utf8":case"utf-8":return $(t).length;case"ucs2":case"ucs-2":case"utf16le":case"utf-16le":return 2*n;case"hex":return n>>>1;case"base64":return W(t).length;default:if(o)return r?-1:$(t).length;e=(""+e).toLowerCase(),o=!0}}function y(t,e,n){let r=!1;if((void 0===e||e<0)&&(e=0),e>this.length)return"";if((void 0===n||n>this.length)&&(n=this.length),n<=0)return"";if((n>>>=0)<=(e>>>=0))return"";for(t||(t="utf8");;)switch(t){case"hex":return I(this,e,n);case"utf8":case"utf-8":return L(this,e,n);case"ascii":return _(this,e,n);case"latin1":case"binary":return M(this,e,n);case"base64":return N(this,e,n);case"ucs2":case"ucs-2":case"utf16le":case"utf-16le":return S(this,e,n);default:if(r)throw new TypeError("Unknown encoding: "+t);t=(t+"").toLowerCase(),r=!0}}function m(t,e,n){const r=t[e];t[e]=t[n],t[n]=r}function b(t,e,n,r,o){if(0===t.length)return-1;if("string"==typeof n?(r=n,n=0):n>2147483647?n=2147483647:n<-2147483648&&(n=-2147483648),H(n=+n)&&(n=o?0:t.length-1),n<0&&(n=t.length+n),n>=t.length){if(o)return-1;n=t.length-1}else if(n<0){if(!o)return-1;n=0}if("string"==typeof e&&(e=u.from(e,r)),u.isBuffer(e))return 0===e.length?-1:v(t,e,n,r,o);if("number"==typeof e)return e&=255,"function"==typeof Uint8Array.prototype.indexOf?o?Uint8Array.prototype.indexOf.call(t,e,n):Uint8Array.prototype.lastIndexOf.call(t,e,n):v(t,[e],n,r,o);throw new TypeError("val must be string, number or Buffer")}function v(t,e,n,r,o){let i,s=1,a=t.length,u=e.length;if(void 0!==r&&("ucs2"===(r=String(r).toLowerCase())||"ucs-2"===r||"utf16le"===r||"utf-16le"===r)){if(t.length<2||e.length<2)return-1;s=2,a/=2,u/=2,n/=2}function l(t,e){return 1===s?t[e]:t.readUInt16BE(e*s)}if(o){let r=-1;for(i=n;ia&&(n=a-u),i=n;i>=0;i--){let n=!0;for(let r=0;ro&&(r=o):r=o;const i=e.length;let s;for(r>i/2&&(r=i/2),s=0;s>8,o=n%256,i.push(o),i.push(r);return i}(e,t.length-n),t,n,r)}function N(t,e,n){return 0===e&&n===t.length?r.fromByteArray(t):r.fromByteArray(t.slice(e,n))}function L(t,e,n){n=Math.min(t.length,n);const r=[];let o=e;for(;o239?4:e>223?3:e>191?2:1;if(o+s<=n){let n,r,a,u;switch(s){case 1:e<128&&(i=e);break;case 2:n=t[o+1],128==(192&n)&&(u=(31&e)<<6|63&n,u>127&&(i=u));break;case 3:n=t[o+1],r=t[o+2],128==(192&n)&&128==(192&r)&&(u=(15&e)<<12|(63&n)<<6|63&r,u>2047&&(u<55296||u>57343)&&(i=u));break;case 4:n=t[o+1],r=t[o+2],a=t[o+3],128==(192&n)&&128==(192&r)&&128==(192&a)&&(u=(15&e)<<18|(63&n)<<12|(63&r)<<6|63&a,u>65535&&u<1114112&&(i=u))}}null===i?(i=65533,s=1):i>65535&&(i-=65536,r.push(i>>>10&1023|55296),i=56320|1023&i),r.push(i),o+=s}return function(t){const e=t.length;if(e<=T)return String.fromCharCode.apply(String,t);let n="",r=0;for(;rr.length?(u.isBuffer(e)||(e=u.from(e)),e.copy(r,o)):Uint8Array.prototype.set.call(r,e,o);else{if(!u.isBuffer(e))throw new TypeError('"list" argument must be an Array of Buffers');e.copy(r,o)}o+=e.length}return r},u.byteLength=g,u.prototype._isBuffer=!0,u.prototype.swap16=function(){const t=this.length;if(t%2!=0)throw new RangeError("Buffer size must be a multiple of 16-bits");for(let e=0;en&&(t+=" ... "),""},i&&(u.prototype[i]=u.prototype.inspect),u.prototype.compare=function(t,e,n,r,o){if(J(t,Uint8Array)&&(t=u.from(t,t.offset,t.byteLength)),!u.isBuffer(t))throw new TypeError('The "target" argument must be one of type Buffer or Uint8Array. Received type '+typeof t);if(void 0===e&&(e=0),void 0===n&&(n=t?t.length:0),void 0===r&&(r=0),void 0===o&&(o=this.length),e<0||n>t.length||r<0||o>this.length)throw new RangeError("out of range index");if(r>=o&&e>=n)return 0;if(r>=o)return-1;if(e>=n)return 1;if(this===t)return 0;let i=(o>>>=0)-(r>>>=0),s=(n>>>=0)-(e>>>=0);const a=Math.min(i,s),l=this.slice(r,o),c=t.slice(e,n);for(let t=0;t>>=0,isFinite(n)?(n>>>=0,void 0===r&&(r="utf8")):(r=n,n=void 0)}const o=this.length-e;if((void 0===n||n>o)&&(n=o),t.length>0&&(n<0||e<0)||e>this.length)throw new RangeError("Attempt to write outside buffer bounds");r||(r="utf8");let i=!1;for(;;)switch(r){case"hex":return k(this,t,e,n);case"utf8":case"utf-8":return x(this,t,e,n);case"ascii":case"latin1":case"binary":return w(this,t,e,n);case"base64":return E(this,t,e,n);case"ucs2":case"ucs-2":case"utf16le":case"utf-16le":return A(this,t,e,n);default:if(i)throw new TypeError("Unknown encoding: "+r);r=(""+r).toLowerCase(),i=!0}},u.prototype.toJSON=function(){return{type:"Buffer",data:Array.prototype.slice.call(this._arr||this,0)}};const T=4096;function _(t,e,n){let r="";n=Math.min(t.length,n);for(let o=e;or)&&(n=r);let o="";for(let r=e;rn)throw new RangeError("Trying to access beyond buffer length")}function P(t,e,n,r,o,i){if(!u.isBuffer(t))throw new TypeError('"buffer" argument must be a Buffer instance');if(e>o||et.length)throw new RangeError("Index out of range")}function R(t,e,n,r,o){D(e,r,o,t,n,7);let i=Number(e&BigInt(4294967295));t[n++]=i,i>>=8,t[n++]=i,i>>=8,t[n++]=i,i>>=8,t[n++]=i;let s=Number(e>>BigInt(32)&BigInt(4294967295));return t[n++]=s,s>>=8,t[n++]=s,s>>=8,t[n++]=s,s>>=8,t[n++]=s,n}function C(t,e,n,r,o){D(e,r,o,t,n,7);let i=Number(e&BigInt(4294967295));t[n+7]=i,i>>=8,t[n+6]=i,i>>=8,t[n+5]=i,i>>=8,t[n+4]=i;let s=Number(e>>BigInt(32)&BigInt(4294967295));return t[n+3]=s,s>>=8,t[n+2]=s,s>>=8,t[n+1]=s,s>>=8,t[n]=s,n+8}function U(t,e,n,r,o,i){if(n+r>t.length)throw new RangeError("Index out of range");if(n<0)throw new RangeError("Index out of range")}function O(t,e,n,r,i){return e=+e,n>>>=0,i||U(t,0,n,4),o.write(t,e,n,r,23,4),n+4}function X(t,e,n,r,i){return e=+e,n>>>=0,i||U(t,0,n,8),o.write(t,e,n,r,52,8),n+8}u.prototype.slice=function(t,e){const n=this.length;(t=~~t)<0?(t+=n)<0&&(t=0):t>n&&(t=n),(e=void 0===e?n:~~e)<0?(e+=n)<0&&(e=0):e>n&&(e=n),e>>=0,e>>>=0,n||B(t,e,this.length);let r=this[t],o=1,i=0;for(;++i>>=0,e>>>=0,n||B(t,e,this.length);let r=this[t+--e],o=1;for(;e>0&&(o*=256);)r+=this[t+--e]*o;return r},u.prototype.readUint8=u.prototype.readUInt8=function(t,e){return t>>>=0,e||B(t,1,this.length),this[t]},u.prototype.readUint16LE=u.prototype.readUInt16LE=function(t,e){return t>>>=0,e||B(t,2,this.length),this[t]|this[t+1]<<8},u.prototype.readUint16BE=u.prototype.readUInt16BE=function(t,e){return t>>>=0,e||B(t,2,this.length),this[t]<<8|this[t+1]},u.prototype.readUint32LE=u.prototype.readUInt32LE=function(t,e){return t>>>=0,e||B(t,4,this.length),(this[t]|this[t+1]<<8|this[t+2]<<16)+16777216*this[t+3]},u.prototype.readUint32BE=u.prototype.readUInt32BE=function(t,e){return t>>>=0,e||B(t,4,this.length),16777216*this[t]+(this[t+1]<<16|this[t+2]<<8|this[t+3])},u.prototype.readBigUInt64LE=Z((function(t){z(t>>>=0,"offset");const e=this[t],n=this[t+7];void 0!==e&&void 0!==n||V(t,this.length-8);const r=e+256*this[++t]+65536*this[++t]+this[++t]*2**24,o=this[++t]+256*this[++t]+65536*this[++t]+n*2**24;return BigInt(r)+(BigInt(o)<>>=0,"offset");const e=this[t],n=this[t+7];void 0!==e&&void 0!==n||V(t,this.length-8);const r=e*2**24+65536*this[++t]+256*this[++t]+this[++t],o=this[++t]*2**24+65536*this[++t]+256*this[++t]+n;return(BigInt(r)<>>=0,e>>>=0,n||B(t,e,this.length);let r=this[t],o=1,i=0;for(;++i=o&&(r-=Math.pow(2,8*e)),r},u.prototype.readIntBE=function(t,e,n){t>>>=0,e>>>=0,n||B(t,e,this.length);let r=e,o=1,i=this[t+--r];for(;r>0&&(o*=256);)i+=this[t+--r]*o;return o*=128,i>=o&&(i-=Math.pow(2,8*e)),i},u.prototype.readInt8=function(t,e){return t>>>=0,e||B(t,1,this.length),128&this[t]?-1*(255-this[t]+1):this[t]},u.prototype.readInt16LE=function(t,e){t>>>=0,e||B(t,2,this.length);const n=this[t]|this[t+1]<<8;return 32768&n?4294901760|n:n},u.prototype.readInt16BE=function(t,e){t>>>=0,e||B(t,2,this.length);const n=this[t+1]|this[t]<<8;return 32768&n?4294901760|n:n},u.prototype.readInt32LE=function(t,e){return t>>>=0,e||B(t,4,this.length),this[t]|this[t+1]<<8|this[t+2]<<16|this[t+3]<<24},u.prototype.readInt32BE=function(t,e){return t>>>=0,e||B(t,4,this.length),this[t]<<24|this[t+1]<<16|this[t+2]<<8|this[t+3]},u.prototype.readBigInt64LE=Z((function(t){z(t>>>=0,"offset");const e=this[t],n=this[t+7];void 0!==e&&void 0!==n||V(t,this.length-8);const r=this[t+4]+256*this[t+5]+65536*this[t+6]+(n<<24);return(BigInt(r)<>>=0,"offset");const e=this[t],n=this[t+7];void 0!==e&&void 0!==n||V(t,this.length-8);const r=(e<<24)+65536*this[++t]+256*this[++t]+this[++t];return(BigInt(r)<>>=0,e||B(t,4,this.length),o.read(this,t,!0,23,4)},u.prototype.readFloatBE=function(t,e){return t>>>=0,e||B(t,4,this.length),o.read(this,t,!1,23,4)},u.prototype.readDoubleLE=function(t,e){return t>>>=0,e||B(t,8,this.length),o.read(this,t,!0,52,8)},u.prototype.readDoubleBE=function(t,e){return t>>>=0,e||B(t,8,this.length),o.read(this,t,!1,52,8)},u.prototype.writeUintLE=u.prototype.writeUIntLE=function(t,e,n,r){t=+t,e>>>=0,n>>>=0,r||P(this,t,e,n,Math.pow(2,8*n)-1,0);let o=1,i=0;for(this[e]=255&t;++i>>=0,n>>>=0,r||P(this,t,e,n,Math.pow(2,8*n)-1,0);let o=n-1,i=1;for(this[e+o]=255&t;--o>=0&&(i*=256);)this[e+o]=t/i&255;return e+n},u.prototype.writeUint8=u.prototype.writeUInt8=function(t,e,n){return t=+t,e>>>=0,n||P(this,t,e,1,255,0),this[e]=255&t,e+1},u.prototype.writeUint16LE=u.prototype.writeUInt16LE=function(t,e,n){return t=+t,e>>>=0,n||P(this,t,e,2,65535,0),this[e]=255&t,this[e+1]=t>>>8,e+2},u.prototype.writeUint16BE=u.prototype.writeUInt16BE=function(t,e,n){return t=+t,e>>>=0,n||P(this,t,e,2,65535,0),this[e]=t>>>8,this[e+1]=255&t,e+2},u.prototype.writeUint32LE=u.prototype.writeUInt32LE=function(t,e,n){return t=+t,e>>>=0,n||P(this,t,e,4,4294967295,0),this[e+3]=t>>>24,this[e+2]=t>>>16,this[e+1]=t>>>8,this[e]=255&t,e+4},u.prototype.writeUint32BE=u.prototype.writeUInt32BE=function(t,e,n){return t=+t,e>>>=0,n||P(this,t,e,4,4294967295,0),this[e]=t>>>24,this[e+1]=t>>>16,this[e+2]=t>>>8,this[e+3]=255&t,e+4},u.prototype.writeBigUInt64LE=Z((function(t,e=0){return R(this,t,e,BigInt(0),BigInt("0xffffffffffffffff"))})),u.prototype.writeBigUInt64BE=Z((function(t,e=0){return C(this,t,e,BigInt(0),BigInt("0xffffffffffffffff"))})),u.prototype.writeIntLE=function(t,e,n,r){if(t=+t,e>>>=0,!r){const r=Math.pow(2,8*n-1);P(this,t,e,n,r-1,-r)}let o=0,i=1,s=0;for(this[e]=255&t;++o>>=0,!r){const r=Math.pow(2,8*n-1);P(this,t,e,n,r-1,-r)}let o=n-1,i=1,s=0;for(this[e+o]=255&t;--o>=0&&(i*=256);)t<0&&0===s&&0!==this[e+o+1]&&(s=1),this[e+o]=(t/i|0)-s&255;return e+n},u.prototype.writeInt8=function(t,e,n){return t=+t,e>>>=0,n||P(this,t,e,1,127,-128),t<0&&(t=255+t+1),this[e]=255&t,e+1},u.prototype.writeInt16LE=function(t,e,n){return t=+t,e>>>=0,n||P(this,t,e,2,32767,-32768),this[e]=255&t,this[e+1]=t>>>8,e+2},u.prototype.writeInt16BE=function(t,e,n){return t=+t,e>>>=0,n||P(this,t,e,2,32767,-32768),this[e]=t>>>8,this[e+1]=255&t,e+2},u.prototype.writeInt32LE=function(t,e,n){return t=+t,e>>>=0,n||P(this,t,e,4,2147483647,-2147483648),this[e]=255&t,this[e+1]=t>>>8,this[e+2]=t>>>16,this[e+3]=t>>>24,e+4},u.prototype.writeInt32BE=function(t,e,n){return t=+t,e>>>=0,n||P(this,t,e,4,2147483647,-2147483648),t<0&&(t=4294967295+t+1),this[e]=t>>>24,this[e+1]=t>>>16,this[e+2]=t>>>8,this[e+3]=255&t,e+4},u.prototype.writeBigInt64LE=Z((function(t,e=0){return R(this,t,e,-BigInt("0x8000000000000000"),BigInt("0x7fffffffffffffff"))})),u.prototype.writeBigInt64BE=Z((function(t,e=0){return C(this,t,e,-BigInt("0x8000000000000000"),BigInt("0x7fffffffffffffff"))})),u.prototype.writeFloatLE=function(t,e,n){return O(this,t,e,!0,n)},u.prototype.writeFloatBE=function(t,e,n){return O(this,t,e,!1,n)},u.prototype.writeDoubleLE=function(t,e,n){return X(this,t,e,!0,n)},u.prototype.writeDoubleBE=function(t,e,n){return X(this,t,e,!1,n)},u.prototype.copy=function(t,e,n,r){if(!u.isBuffer(t))throw new TypeError("argument should be a Buffer");if(n||(n=0),r||0===r||(r=this.length),e>=t.length&&(e=t.length),e||(e=0),r>0&&r=this.length)throw new RangeError("Index out of range");if(r<0)throw new RangeError("sourceEnd out of bounds");r>this.length&&(r=this.length),t.length-e>>=0,n=void 0===n?this.length:n>>>0,t||(t=0),"number"==typeof t)for(o=e;o=r+4;n-=3)e=`_${t.slice(n-3,n)}${e}`;return`${t.slice(0,n)}${e}`}function D(t,e,n,r,o,i){if(t>n||t3?0===e||e===BigInt(0)?`>= 0${r} and < 2${r} ** ${8*(i+1)}${r}`:`>= -(2${r} ** ${8*(i+1)-1}${r}) and < 2 ** ${8*(i+1)-1}${r}`:`>= ${e}${r} and <= ${n}${r}`,new Y.ERR_OUT_OF_RANGE("value",o,t)}!function(t,e,n){z(e,"offset"),void 0!==t[e]&&void 0!==t[e+n]||V(e,t.length-(n+1))}(r,o,i)}function z(t,e){if("number"!=typeof t)throw new Y.ERR_INVALID_ARG_TYPE(e,"number",t)}function V(t,e,n){if(Math.floor(t)!==t)throw z(t,n),new Y.ERR_OUT_OF_RANGE(n||"offset","an integer",t);if(e<0)throw new Y.ERR_BUFFER_OUT_OF_BOUNDS;throw new Y.ERR_OUT_OF_RANGE(n||"offset",`>= ${n?1:0} and <= ${e}`,t)}F("ERR_BUFFER_OUT_OF_BOUNDS",(function(t){return t?`${t} is outside of buffer bounds`:"Attempt to access memory outside buffer bounds"}),RangeError),F("ERR_INVALID_ARG_TYPE",(function(t,e){return`The "${t}" argument must be of type number. Received type ${typeof e}`}),TypeError),F("ERR_OUT_OF_RANGE",(function(t,e,n){let r=`The value of "${t}" is out of range.`,o=n;return Number.isInteger(n)&&Math.abs(n)>2**32?o=q(String(n)):"bigint"==typeof n&&(o=String(n),(n>BigInt(2)**BigInt(32)||n<-(BigInt(2)**BigInt(32)))&&(o=q(o)),o+="n"),r+=` It must be ${e}. Received ${o}`,r}),RangeError);const j=/[^+/0-9A-Za-z-_]/g;function $(t,e){let n;e=e||1/0;const r=t.length;let o=null;const i=[];for(let s=0;s55295&&n<57344){if(!o){if(n>56319){(e-=3)>-1&&i.push(239,191,189);continue}if(s+1===r){(e-=3)>-1&&i.push(239,191,189);continue}o=n;continue}if(n<56320){(e-=3)>-1&&i.push(239,191,189),o=n;continue}n=65536+(o-55296<<10|n-56320)}else o&&(e-=3)>-1&&i.push(239,191,189);if(o=null,n<128){if((e-=1)<0)break;i.push(n)}else if(n<2048){if((e-=2)<0)break;i.push(n>>6|192,63&n|128)}else if(n<65536){if((e-=3)<0)break;i.push(n>>12|224,n>>6&63|128,63&n|128)}else{if(!(n<1114112))throw new Error("Invalid code point");if((e-=4)<0)break;i.push(n>>18|240,n>>12&63|128,n>>6&63|128,63&n|128)}}return i}function W(t){return r.toByteArray(function(t){if((t=(t=t.split("=")[0]).trim().replace(j,"")).length<2)return"";for(;t.length%4!=0;)t+="=";return t}(t))}function G(t,e,n,r){let o;for(o=0;o=e.length||o>=t.length);++o)e[o+n]=t[o];return o}function J(t,e){return t instanceof e||null!=t&&null!=t.constructor&&null!=t.constructor.name&&t.constructor.name===e.name}function H(t){return t!=t}const K=function(){const t="0123456789abcdef",e=new Array(256);for(let n=0;n<16;++n){const r=16*n;for(let o=0;o<16;++o)e[r+o]=t[n]+t[o]}return e}();function Z(t){return"undefined"==typeof BigInt?Q:t}function Q(){throw new Error("BigInt not supported")}},722:t=>{t.exports={}},780:t=>{t.exports={nodeStrokeWidth:"0.8",directionArrowSize:"6",directionArrowWidth:"0.7",node:"fornac-node",directionArrow:"fornac-directionArrow",plot:"fornac-plot",selectedNode:"fornac-selectedNode",nodeLabel:"fornac-nodeLabel",link:"fornac-link",plotLabel:"fornac-plotLabel",transparent:"fornac-transparent",dragLine:"fornac-dragLine",mouseEventHelper:"fornac-mouseEventHelper"}},251:(t,e)=>{e.read=function(t,e,n,r,o){var i,s,a=8*o-r-1,u=(1<>1,c=-7,f=n?o-1:0,d=n?-1:1,h=t[e+f];for(f+=d,i=h&(1<<-c)-1,h>>=-c,c+=a;c>0;i=256*i+t[e+f],f+=d,c-=8);for(s=i&(1<<-c)-1,i>>=-c,c+=r;c>0;s=256*s+t[e+f],f+=d,c-=8);if(0===i)i=1-l;else{if(i===u)return s?NaN:1/0*(h?-1:1);s+=Math.pow(2,r),i-=l}return(h?-1:1)*s*Math.pow(2,i-r)},e.write=function(t,e,n,r,o,i){var s,a,u,l=8*i-o-1,c=(1<>1,d=23===o?Math.pow(2,-24)-Math.pow(2,-77):0,h=r?0:i-1,p=r?1:-1,g=e<0||0===e&&1/e<0?1:0;for(e=Math.abs(e),isNaN(e)||e===1/0?(a=isNaN(e)?1:0,s=c):(s=Math.floor(Math.log(e)/Math.LN2),e*(u=Math.pow(2,-s))<1&&(s--,u*=2),(e+=s+f>=1?d/u:d*Math.pow(2,1-f))*u>=2&&(s++,u/=2),s+f>=c?(a=0,s=c):s+f>=1?(a=(e*u-1)*Math.pow(2,o),s+=f):(a=e*Math.pow(2,f-1)*Math.pow(2,o),s=0));o>=8;t[n+h]=255&a,h+=p,a/=256,o-=8);for(s=s<0;t[n+h]=255&s,h+=p,s/=256,l-=8);t[n+h-p]|=128*g}},447:(t,e,n)=>{t.exports=n(845)},845:(t,e,n)=>{var r=n(287).hp,o=n(611),i=void 0!==r?t=>r.from(t).toString("base64"):t=>btoa(String.fromCharCode(...t)),s=void 0!==r?t=>r.from(t,"base64"):t=>Uint8Array.from(atob(t),(t=>t.charCodeAt(0)));e.encode=function(t){var e=o.parse(t);return i(e).replace(/\+/g,"-").replace(/\//g,"_").substring(0,22)},e.decode=function(t){var e=t.replace(/-/g,"+").replace(/_/g,"/")+"==";return o.stringify(s(e))},e.v4=function(){var t=o.v4(null,new Uint8Array(16));return i(t).replace(/\+/g,"-").replace(/\//g,"_").substring(0,22)},e.nice=function(){var t=o.v4(null,new Uint8Array(16));return t[0]=127&t[0],i(t).replace(/\+/g,"-").replace(/\//g,"_").substring(0,22)}},611:(t,e,n)=>{"use strict";var r;n.r(e),n.d(e,{NIL:()=>I,parse:()=>y,stringify:()=>c,v1:()=>g,v3:()=>N,v4:()=>L,v5:()=>M,validate:()=>a,version:()=>S});var o=new Uint8Array(16);function i(){if(!r&&!(r="undefined"!=typeof crypto&&crypto.getRandomValues&&crypto.getRandomValues.bind(crypto)||"undefined"!=typeof msCrypto&&"function"==typeof msCrypto.getRandomValues&&msCrypto.getRandomValues.bind(msCrypto)))throw new Error("crypto.getRandomValues() not supported. See https://github.com/uuidjs/uuid#getrandomvalues-not-supported");return r(o)}const s=/^(?:[0-9a-f]{8}-[0-9a-f]{4}-[1-5][0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}|00000000-0000-0000-0000-000000000000)$/i,a=function(t){return"string"==typeof t&&s.test(t)};for(var u=[],l=0;l<256;++l)u.push((l+256).toString(16).substr(1));const c=function(t){var e=arguments.length>1&&void 0!==arguments[1]?arguments[1]:0,n=(u[t[e+0]]+u[t[e+1]]+u[t[e+2]]+u[t[e+3]]+"-"+u[t[e+4]]+u[t[e+5]]+"-"+u[t[e+6]]+u[t[e+7]]+"-"+u[t[e+8]]+u[t[e+9]]+"-"+u[t[e+10]]+u[t[e+11]]+u[t[e+12]]+u[t[e+13]]+u[t[e+14]]+u[t[e+15]]).toLowerCase();if(!a(n))throw TypeError("Stringified UUID is invalid");return n};var f,d,h=0,p=0;const g=function(t,e,n){var r=e&&n||0,o=e||new Array(16),s=(t=t||{}).node||f,a=void 0!==t.clockseq?t.clockseq:d;if(null==s||null==a){var u=t.random||(t.rng||i)();null==s&&(s=f=[1|u[0],u[1],u[2],u[3],u[4],u[5]]),null==a&&(a=d=16383&(u[6]<<8|u[7]))}var l=void 0!==t.msecs?t.msecs:Date.now(),g=void 0!==t.nsecs?t.nsecs:p+1,y=l-h+(g-p)/1e4;if(y<0&&void 0===t.clockseq&&(a=a+1&16383),(y<0||l>h)&&void 0===t.nsecs&&(g=0),g>=1e4)throw new Error("uuid.v1(): Can't create more than 10M uuids/sec");h=l,p=g,d=a;var m=(1e4*(268435455&(l+=122192928e5))+g)%4294967296;o[r++]=m>>>24&255,o[r++]=m>>>16&255,o[r++]=m>>>8&255,o[r++]=255&m;var b=l/4294967296*1e4&268435455;o[r++]=b>>>8&255,o[r++]=255&b,o[r++]=b>>>24&15|16,o[r++]=b>>>16&255,o[r++]=a>>>8|128,o[r++]=255&a;for(var v=0;v<6;++v)o[r+v]=s[v];return e||c(o)},y=function(t){if(!a(t))throw TypeError("Invalid UUID");var e,n=new Uint8Array(16);return n[0]=(e=parseInt(t.slice(0,8),16))>>>24,n[1]=e>>>16&255,n[2]=e>>>8&255,n[3]=255&e,n[4]=(e=parseInt(t.slice(9,13),16))>>>8,n[5]=255&e,n[6]=(e=parseInt(t.slice(14,18),16))>>>8,n[7]=255&e,n[8]=(e=parseInt(t.slice(19,23),16))>>>8,n[9]=255&e,n[10]=(e=parseInt(t.slice(24,36),16))/1099511627776&255,n[11]=e/4294967296&255,n[12]=e>>>24&255,n[13]=e>>>16&255,n[14]=e>>>8&255,n[15]=255&e,n};function m(t,e,n){function r(t,r,o,i){if("string"==typeof t&&(t=function(t){t=unescape(encodeURIComponent(t));for(var e=[],n=0;n>>9<<4)+1}function v(t,e){var n=(65535&t)+(65535&e);return(t>>16)+(e>>16)+(n>>16)<<16|65535&n}function k(t,e,n,r,o,i){return v((s=v(v(e,t),v(r,i)))<<(a=o)|s>>>32-a,n);var s,a}function x(t,e,n,r,o,i,s){return k(e&n|~e&r,t,e,o,i,s)}function w(t,e,n,r,o,i,s){return k(e&r|n&~r,t,e,o,i,s)}function E(t,e,n,r,o,i,s){return k(e^n^r,t,e,o,i,s)}function A(t,e,n,r,o,i,s){return k(n^(e|~r),t,e,o,i,s)}const N=m("v3",48,(function(t){if("string"==typeof t){var e=unescape(encodeURIComponent(t));t=new Uint8Array(e.length);for(var n=0;n>5]>>>o%32&255,s=parseInt(r.charAt(i>>>4&15)+r.charAt(15&i),16);e.push(s)}return e}(function(t,e){t[e>>5]|=128<>5]|=(255&t[r/8])<>>32-e}const M=m("v5",80,(function(t){var e=[1518500249,1859775393,2400959708,3395469782],n=[1732584193,4023233417,2562383102,271733878,3285377520];if("string"==typeof t){var r=unescape(encodeURIComponent(t));t=[];for(var o=0;o>>0;v=b,b=m,m=_(y,30)>>>0,y=g,g=w}n[0]=n[0]+g>>>0,n[1]=n[1]+y>>>0,n[2]=n[2]+m>>>0,n[3]=n[3]+b>>>0,n[4]=n[4]+v>>>0}return[n[0]>>24&255,n[0]>>16&255,n[0]>>8&255,255&n[0],n[1]>>24&255,n[1]>>16&255,n[1]>>8&255,255&n[1],n[2]>>24&255,n[2]>>16&255,n[2]>>8&255,255&n[2],n[3]>>24&255,n[3]>>16&255,n[3]>>8&255,255&n[3],n[4]>>24&255,n[4]>>16&255,n[4]>>8&255,255&n[4]]})),I="00000000-0000-0000-0000-000000000000",S=function(t){if(!a(t))throw TypeError("Invalid UUID");return parseInt(t.substr(14,1),16)}},893:e=>{"use strict";e.exports=t}},n={};function o(t){var r=n[t];if(void 0!==r)return r.exports;var i=n[t]={exports:{}};return e[t](i,i.exports,o),i.exports}o.n=t=>{var e=t&&t.__esModule?()=>t.default:()=>t;return o.d(e,{a:e}),e},o.d=(t,e)=>{for(var n in e)o.o(e,n)&&!o.o(t,n)&&Object.defineProperty(t,n,{enumerable:!0,get:e[n]})},o.g=function(){if("object"==typeof globalThis)return globalThis;try{return this||new Function("return this")()}catch(t){if("object"==typeof window)return window}}(),o.o=(t,e)=>Object.prototype.hasOwnProperty.call(t,e),o.r=t=>{"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(t,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(t,"__esModule",{value:!0})},(()=>{var t;o.g.importScripts&&(t=o.g.location+"");var e=o.g.document;if(!t&&e&&(e.currentScript&&(t=e.currentScript.src),!t)){var n=e.getElementsByTagName("script");if(n.length)for(var r=n.length-1;r>-1&&(!t||!/^http(s?):/.test(t));)t=n[r--].src}if(!t)throw new Error("Automatic publicPath is not supported in this browser");t=t.replace(/#.*$/,"").replace(/\?.*$/,"").replace(/\/[^\/]+$/,"/"),o.p=t})();var i={};return(()=>{"use strict";o.r(i),o.d(i,{ColorScheme:()=>h,FornaContainer:()=>N,RNAUtilities:()=>f,rnaPlot:()=>L,rnaTreemap:()=>T});var t=o(780),e=o.n(t),n=o(893),s=o.n(n),a=o(447);o(722);const u=o.p+"02188894d5236b1517df3210b79c2a7f.svg";function l(t,e){var n,r,o=!1,i=a.nice(),c=null,f="right",d=null,h=null;return"function"==typeof e?n=e:(n=(e=e||{}).onOpen,r=e.onClose),"rootElement"in e&&(c=e.rootElement),"pos"in e&&(d=e.pos),"orientation"in e&&(f=e.orientation),"parentStart"in e&&(h=e.parentStart),s().selectAll(".d3-context-menu-"+i).data([1]).enter().append("div").classed("d3-context-menu",!0).classed("d3-context-menu-"+i,!0),s().select("body").on("click.d3-context-menu-"+i,(function(){o?o=!1:(console.log("body click close"),s().select(".d3-context-menu-"+i).style("display","none"),f="right",r&&r())})),function(e,a){var p,g=arguments.length>2&&void 0!==arguments[2]&&arguments[2],y=this,m=this;p=null==c?s().mouse(this):s().mouse(c);var b=null;o=g,s().selectAll(".d3-context-menu-"+i).html("");var v=s().selectAll(".d3-context-menu-"+i).on("contextmenu",(function(t){console.log("context-menu close"),s().select(".d3-context-menu-"+i).style("display","none"),f="right",s().event.preventDefault(),s().event.stopPropagation()})).append("ul");if(v.selectAll("li").data("function"==typeof t?t(e):t).enter().append("li").attr("class",(function(t){console.log("d:",t);var e="";return t.divider&&(e+=" is-divider"),t.disabled&&(e+=" is-disabled"),t.action||(e+=" is-header"),"children"in t&&(e+=" d3-context-menu-recursive"),e})).html((function(t){return t.divider?"
":(t.title||console.error("No title attribute set. Check the spelling of your options."),"string"==typeof t.title?t.title:t.title(e))})).on("click",(function(t,n){t.disabled||t.action&&(t.action(y,e,a,p),console.log("click close"),s().selectAll(".d3-context-menu").style("display","none"),f="right",r&&r())})).on("mouseenter",(function(t,n){if(s().select(this).classed("d3-context-menu-selected",!0),null!=b){if(s().select(".d3-context-menu-"+i).selectAll("li").classed("d3-context-menu-selected",!1),void 0===t.children)return console.log("no children close"),s().select(".d3-context-menu-"+b).style("display","none"),void(b=null);if(t.childUid==b)return;console.log("open different child menu close"),s().select(".d3-context-menu-"+b).style("display","none"),b=null}if(void 0!==t.children){var r=this.getBoundingClientRect(),o=null;o=l(t.children,"left"==f?{rootElement:m,pos:[r.left+window.pageXOffset,r.top-2+window.pageYOffset],orientation:"left"}:{pos:[r.left+r.width+window.pageXOffset,r.top-2+window.pageYOffset],rootElement:m,parentStart:[r.left+window.pageXOffset,r.top-2+window.pageYOffset]}),t.childUid=o.apply(this,[e,n,!0,function(){}]),b=t.childUid}s().select(this).classed("d3-context-menu-selected",!0)})).on("mouseleave",(function(t,e){null==b&&s().select(this).classed("d3-context-menu-selected",!1)})),v.selectAll(".d3-context-menu-recursive").append("img").attr("src",u).attr("width","14px").attr("height","14px").style("position","absolute").style("right","5px"),n&&!1===n(e,a))return i;var k=s().select(".d3-context-menu-"+i).style("display","block");null==d?s().select(".d3-context-menu-"+i).style("left",s().event.pageX-2+"px").style("top",s().event.pageY-2+"px"):s().select(".d3-context-menu-"+i).style("left",d[0]+"px").style("top",d[1]+"px");var x=k.node().getBoundingClientRect();return(x.left+x.width>window.innerWidth||"left"==f)&&(f="left",null==d?s().select(".d3-context-menu-"+i).style("left",s().event.pageX-2-x.width+"px").style("top",s().event.pageY-2+"px"):null!=h?s().select(".d3-context-menu-"+i).style("left",h[0]-x.width+"px").style("top",h[1]+"px"):s().select(".d3-context-menu-"+i).style("left",d[0]-x.width+"px").style("top",d[1]+"px")),o||(s().event.preventDefault(),s().event.stopPropagation()),i}}var c=function(t,e){return t-e};function f(){var t=this;t.bracketLeft="([{abcdefghijklmnopqrstuvwxyz".split(""),t.inverseBrackets=function(t){for(var e={},n=0;n0;r--)for(o=r+0+1;o<=e;o++){i=n[r][o-1];for(var s=o-0-1;s>=r;s--)t[s]===o&&(i=Math.max(i,(s>r?n[r][s-1]:0)+1+(o-s-1>0?n[s+1][o-1]:0)));n[r][o]=i}return i=n[1][e],n},t.backtrackMaximumMatching=function(e,n){var r=Array.apply(null,Array(e.length)).map((function(){return 0}));return t.mmBt(e,r,n,1,e.length-1),r},t.mmBt=function(e,n,r,o,i){var s=e[o][i];if(!(i-o-1<0))if(e[o][i-1]!=s){for(var a=i-0-1;a>=o;a--)if(r[i]===a&&(a>o?e[o][a-1]:0)+(i-a-1>0?e[a+1][i-1]:0)+1==s)return n[a]=i,n[i]=a,o0)throw"Unmatched base at position "+r[c][0];return n},t.insertIntoStack=function(t,e,n){for(var r=0;t[r].length>0&&t[r][t[r].length-1]r?i+=t.bracketLeft[t.insertIntoStack(n,r,e[r])]:i+=t.bracketRight[t.deleteFromStack(n,r)]}return i},t.findUnmatched=function(e,n,r){for(var o=[],i=[],s=n,a=r,u=n;u<=r;u++)0!==e[u]&&(e[u]r)&&i.push([u,e[u]]);for(u=s;u<=a;u++){for(;0===e[u]&&u<=a;)u++;for(r=e[u];e[u]===r;)u++,r--;o=o.concat(t.findUnmatched(e,u,r))}return i.length>0&&o.push(i),o},t.removePseudoknotsFromPairtable=function(e){for(var n=t.maximumMatching(e),r=t.backtrackMaximumMatching(n,e),o=[],i=1;io)return[];for(;0===e[r];r++)a.push(r);for(;0===e[o];o--)u.push(o);if(r>o){if(a.push(r),0===n)return[["e",n,a.sort(c)]];for(var l=!1,f=[],d=[],h=0;h=0&&(l=!0);return[["h",n,a.sort(c)]]}if(e[r]!=o){var p=a;for(h=r,p.push(h);h<=o;){for(s=s.concat(t.ptToElements(e,n,h,e[h],i)),p.push(e[h]),h=e[h]+1;0===e[h]&&h<=o;h++)p.push(h);p.push(h)}return p.pop(),(p=p.concat(u)).length>0&&(0===n?s.push(["e",n,p.sort(c)]):s.push(["m",n,p.sort(c)])),s}e[r]===o&&(a.push(r),u.push(o),a.concat(u).length>4&&(0===n?s.push(["e",n,a.concat(u).sort(c)]):s.push(["i",n,a.concat(u).sort(c)])));for(var g=[];e[r]===o&&r"!=n[a][0])for(var u=n[a].trim().split(/[\s]+/),l=0;lo&&(o=t));for(i in e.colorsJson.colorValues[n])"number"==typeof(t=e.colorsJson.colorValues[n][i])&&(e.colorsJson.colorValues[n][i]=(t-r)/(o-r))}return e},e.parseColorText(e.colorsText),e}var p=function(t,e){return t-e};function g(){var t=arguments.length>0&&void 0!==arguments[0]?arguments[0]:"",e=arguments.length>1&&void 0!==arguments[1]?arguments[1]:"",n=arguments.length>2&&void 0!==arguments[2]?arguments[2]:"",r=arguments.length>3&&void 0!==arguments[3]?arguments[3]:1,o=this;o.type="rna",o.circularizeExternal=!1,o.seq=t,o.dotbracket=e,o.structName=n,o.circular=!1,"*"==o.dotbracket.slice(-1)&&(o.dotbracket=o.dotbracket.slice(0,-1),o.circular=!0),o.uid=a.nice(),o.elements=[],o.pseudoknotPairs=[],o.nucsToNodes={},o.addUids=function(t){for(var e=o.nodes.filter((function(t){return"nucleotide"==t.nodeType})),n=0;n=0&&(t[e].nodeType="middle");for(var n,r=function(t){n=!1;for(var e=0;e=0&&(n=!0);n?o.elements[t][2].map((function(t){0!=t&&(o.nodes[t-1].elemType="e")})):o.elements[t][2].map((function(e){0!=e&&(o.nodes[e-1].elemType=o.elements[t][0])}))},i=0;i=4})),n=0;no.dotbracket.length)){o.links.push({source:o.nodes[t[f]-1],target:o.nodes[o.nodes.length-1],linkType:"fake",value:n,uid:a.nice()}),t.length>4&&o.links.push({source:o.nodes[t[f]-1],target:o.nodes[t[(f+Math.floor(t.length/2))%t.length]-1],linkType:"fake",value:2*n,uid:a.nice()});var d=3.14159*(t.length-2)/t.length,h=2*Math.cos(1.570795-d/2);o.links.push({source:o.nodes[t[f]-1],target:o.nodes[t[(f+2)%t.length]-1],linkType:"fake",value:h});var p=o.nodes[t[f]-1];"x"in p&&(u+=p.x,l+=p.y,c+=1)}return c>0&&(s.x=u/c,s.y=l/c,s.px=s.x,s.py=s.y),o},o.connectFakeNodes=function(){for(var t={},e=o.nodes.filter((function(t){return"middle"==t.nodeType})),n={},r=1;r<=o.nodes.length;r++)t[r]=[];for(r=0;r=0&&(l=""),o.nodes.push({name:l,num:r+u-1,radius:5,rna:o,nodeType:"nucleotide",structName:o.structName,elemType:e[u],uid:a.nice(),linked:!1})}for(var c=0;c1&&-1===o.dotBracketBreaks.indexOf(f-1)&&-1==o.dotBracketBreaks.indexOf(f-2)&&(o.links.push({source:o.nodes[f-2],target:o.nodes[f-1],linkType:"backbone",value:1,uid:a.nice()}),o.nodes[f-1].linked=!0);for(var d=0;dr)return[];for(;0===t[n];n++)s.push(n);for(;0===t[r];r--)a.push(r);if(n>r){if(s.push(n),0===e)return[["e",e,s.sort(p)]];for(var u=!1,l=[],c=[],f=0;f=0&&(u=!0);return[["h",e,s.sort(p)]]}if(t[n]!=r){var d=s;for(f=n,d.push(f);f<=r;){for(i=i.concat(o.ptToElements(t,e,f,t[f])),d.push(t[f]),f=t[f]+1;0===t[f]&&f<=r;f++)d.push(f);d.push(f)}return d.pop(),(d=d.concat(a)).length>0&&(0===e?i.push(["e",e,d.sort(p)]):i.push(["m",e,d.sort(p)])),i}t[n]===r&&(s.push(n),a.push(r),s.concat(a).length>4&&(0===e?i.push(["e",e,s.concat(a).sort(p)]):i.push(["i",e,s.concat(a).sort(p)])));for(var h=[];t[n]===r&&n0&&void 0!==arguments[0]?arguments[0]:1,e=arguments.length>1&&void 0!==arguments[1]?arguments[1]:10;if(0===e)return o;for(var n=1;n<=o.rnaLength;n++)if(n%e==0){var r,i,s=o.nodes[n-1],u=void 0,l=void 0,c=void 0,f=void 0;1==o.rnaLength?(f=[s.x-15,s.y],c=[s.x-15,s.y]):(u=1==n?o.nodes[o.rnaLength-1]:o.nodes[n-2],l=n==o.rnaLength?o.nodes[0]:o.nodes[n],0!==o.pairtable[l.num-t+1]&&0!==o.pairtable[u.num-t+1]&&0!==o.pairtable[s.num-t+1]&&(u=l=o.nodes[o.pairtable[s.num-t+1]-1]),0===o.pairtable[s.num-t+1]||0!==o.pairtable[l.num-t+1]&&0!==o.pairtable[u.num-t+1]?(f=[l.x-s.x,l.y-s.y],c=[u.x-s.x,u.y-s.y]):(f=[s.x-l.x,s.y-l.y],c=[s.x-u.x,s.y-u.y]));var d=[f[0]+c[0],f[1]+c[1]],h=Math.sqrt(d[0]*d[0]+d[1]*d[1]),p=[d[0]/h,d[1]/h],g=[-15*p[0],-15*p[1]];r=o.nodes[n-1].x+g[0],i=o.nodes[n-1].y+g[1];var y={name:n+t-1,num:-1,radius:6,rna:o,nodeType:"label",structName:o.structName,elemType:"l",x:r,y:i,px:r,py:i,uid:a.nice()},m={source:o.nodes[n-1],target:y,value:1,linkType:"label_link",uid:a.nice()};o.nodes.push(y),o.links.push(m)}return o},o.recalculateElements=function(){if(o.removePseudoknots(),o.elements=o.ptToElements(o.pairtable,0,1,o.dotbracket.length),o.circular){var t=o.elements.filter((function(t){if("e"==t[0])return!0}));if(t.length>0){eloop=t[0],nucs=eloop[2].sort(p),prev=nucs[0],hloop=!0,numGreater=0;for(var e=1;e1&&(numGreater+=1),prev=nucs[e];1==numGreater?eloop[0]="h":2==numGreater?eloop[0]="i":eloop[0]="m"}}return o},o.reassignLinkUids=function(){for(var t=0;t1&&(o.pseudoknotPairs=o.pseudoknotPairs.concat(d.removePseudoknotsFromPairtable(o.pairtable))),o},o.addPseudoknots=function(){for(var t=o.pairtable,e=o.pseudoknotPairs,n=0;n0&&o.recalculateElements(),o.getNodeFromNucleotides=function(t){if("[object Array]"===Object.prototype.toString.call(t)){for(var e=0;ed);if(y=m-2,m>=2&&(s[p+1+y]+=f,s[g-1-y]+=f,s[p]+=f,s[g]+=f,m>2))for(;y>=1;y--)s[p+y]=Math.PI,s[g-y]=Math.PI;u[++c]=m,d<=h&&t(d,h,r)}else e++,w++,A++;for(x=Math.PI*(w-2)/w,N[++E]=n,b=o<0?0:o,v=1;v<=E;v++){for(k=N[v]-b,y=0;y<=k;y++)s[b+y]+=x;if(v>E)break;b=N[++v]}a[++l]=A}(0,n+1,t),a[l]-=2,r=0,o[0]=100,i[0]=100;var d=[];for(d.push([o[0],i[0]]),e=1;e=0&&(1==++e||n>r)&&(n=r);return t.setMark(!1),n+1}function N(t){var n=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{},o=this;o.options=Object.assign({editable:!1,zoomable:!0,animation:!0,displayAllLinks:!1,labelInterval:10,chargeDistance:110,friction:.35,middleCharge:-30,otherCharge:-30,linkDistanceMultiplier:15,initialSize:null,layout:"standard-polygonal",transitionDuration:500,maxNodeRadius:80},n),null!==o.options.initialSize?(o.options.svgW=o.options.initialSize[0],o.options.svgH=o.options.initialSize[1]):(o.options.svgW=300,o.options.svgH=300),o.linkStrengths={pseudoknot:0,proteinChain:0,chainChain:0,intermolecule:10,external:0,other:10},o.displayParameters={displayNumbering:!0,displayNodeOutline:!0,displayNodeLabel:!0,displayLinks:!0,displayPseudoknotLinks:!0,displayProteinLinks:!0,displayDirectionArrows:!0},o.colorScheme="structure",o.customColors={},o.rnas={},o.extraLinks=[];var i=null,u=null,c=!1,f=function(){i=null,u=null},p=o.graph={nodes:[],links:[]};if(Array.prototype.equals=function(t){if(!t)return!1;if(this.length!=t.length)return!1;for(var e=0,n=this.length;e1&&void 0!==arguments[1]?arguments[1]:{},n={sequence:"",name:"empty",positions:[],labelInterval:o.options.labelInterval,avoidOthers:!0,uids:[],circularizeExternal:!0},r=new g((n=Object.assign(n,e)).sequence,t,n.name);r.circularizeExternal=n.circularizeExternal;var i=r.recalculateElements();if(0===n.positions.length)if("naview"==o.options.layout){var s=(new w).naview_xy_coordinates(r.pairtable);n.positions=[];for(var a=0;ar||ui||l0&&void 0!==arguments[0]?arguments[0]:0,e=function(){if(0===o.graph.nodes.length)return{translate:[0,0],scale:1};var t=s().min(o.graph.nodes.map((function(t){return t.x}))),e=s().min(o.graph.nodes.map((function(t){return t.y}))),n=s().max(o.graph.nodes.map((function(t){return t.x}))),r=s().max(o.graph.nodes.map((function(t){return t.y}))),i=s().max(o.graph.nodes.map((function(t){return t.radius}))),a=n-t,u=r-e,l=o.options.svgW/(a+1),c=o.options.svgH/(u+1),f=.8*Math.min(l,c,o.options.maxNodeRadius/i),d=a*f,h=u*f;return{translate:[-t*f+(o.options.svgW-d)/2,-e*f+(o.options.svgH-h)/2],scale:f}}();null!==e&&(A.transition().attr("transform","translate("+e.translate+") scale("+e.scale+")").duration(t),o.zoomer.translate(e.translate),o.zoomer.scale(e.scale))},o.setSize=function(){var e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:s().select(t).node().offsetWidth,n=arguments.length>1&&void 0!==arguments[1]?arguments[1]:s().select(t).node().offsetHeight;o.options.svgW=e,o.options.svgH=n,x.attr("viewBox","0 0 "+e+" "+n),_.range([0,e]).domain([0,e]),M.range([0,n]).domain([0,n]),o.zoomer.x(_).y(M),o.brusher.x(_).y(M),x.select(".background").attr("width",e).attr("height",n),o.centerView()},o.setOutlineColor=function(t){L.selectAll("g.gnode").select("[node_type=nucleotide]").style("fill",t)},o.addCustomColors=function(t){o.customColors=t,o.changeColorScheme("custom")},o.addCustomColorsText=function(t){var e=new h(t);o.customColors=e.colorsJson,o.changeColorScheme("custom")},o.changeColorScheme=function(t){L.selectAll("[node_type=protein]").classed(e().node,!0).attr("r",(function(t){return t.radius})),L.selectAll("g.gnode"),L.selectAll("g.gnode").selectAll("circle");var n=L.selectAll("g.gnode").select("[node_type=nucleotide]");if(o.colorScheme=t,"sequence"==t){var r=s().scale.ordinal().range(["#dbdb8d","#98df8a","#ff9896","#aec7e8","#aec7e8"]).domain(["A","C","G","U","T"]);n.style("fill",(function(t){return r(t.name)}))}else if("structure"==t)r=s().scale.category10().domain(["s","m","i","e","t","h","x"]).range(["lightgreen","#ff9896","#dbdb8d","lightsalmon","lightcyan","lightblue","transparent"]),n.style("fill",(function(t){return r(t.elemType)}));else if("positions"==t)n.style("fill",(function(t){return s().scale.linear().range(["#98df8a","#dbdb8d","#ff9896"]).interpolate(s().interpolateLab).domain([1,1+(t.rna.rnaLength-1)/2,t.rna.rnaLength])(t.num)}));else if("custom"==t){void 0!==o.customColors&&"domain"in o.customColors&&"range"in o.customColors&&(r=s().scale.linear().interpolate(s().interpolateLab).domain(o.customColors.domain).range(o.customColors.range));var i=function(t,e,n){if(t.hasOwnProperty(e.num)){var r=parseFloat(t[e.num]);return isNaN(r)?t[e.num]:n(r)}return"white"};n.style("fill",(function(t){if(void 0===o.customColors||!o.customColors.hasOwnProperty("colorValues"))return"white";if(o.customColors.colorValues.hasOwnProperty(t.structName)&&o.customColors.colorValues[t.structName].hasOwnProperty(t.num)){var e=o.customColors.colorValues[t.structName];return i(e,t,r)}if(o.customColors.colorValues.hasOwnProperty("")){var n=o.customColors.colorValues[""];return i(n,t,r)}return"white"}))}};var V=function(){L.selectAll("[node_type=label]").classed(e().transparent,!o.displayParameters.displayNumbering),L.selectAll("[label_type=label]").classed(e().transparent,!o.displayParameters.displayNumbering),N.selectAll("[link_type=label_link]").classed(e().transparent,!o.displayParameters.displayNumbering),x.selectAll("[node_type=nucleotide]").classed(e().transparent,!o.displayParameters.displayNodeOutline),L.selectAll("[label_type=nucleotide]").classed(e().transparent,!o.displayParameters.displayNodeLabel),x.selectAll("[link_type=real],[link_type=basepair],[link_type=backbone],[link_type=pseudoknot],[link_type=protein_chain],[link_type=chain_chain],[link_type=external]").classed(e().transparent,!o.displayParameters.displayLinks),x.selectAll("[link_type=pseudoknot]").classed(e().transparent,!o.displayParameters.displayPseudoknotLinks),x.selectAll("[link_type=protein_chain]").classed(e().transparent,!o.displayParameters.displayProteinLinks),N.selectAll("[link_type=fake]").classed(e().transparent,!o.options.displayAllLinks),N.selectAll("[link_type=fake_fake]").classed(e().transparent,!o.options.displayAllLinks),x.selectAll("."+e().directionArrow).classed(e().transparent,!o.displayParameters.displayDirectionArrows)},j=function(t,e){var n=e.rna,r=d.pairtableToDotbracket(n.pairtable),i=n.getPositions("nucleotide"),s=n.seq,u=n.getUids(),l=e.num,c=r,f=s.slice(0,l-1)+t+s.slice(l);console.log("newSequence:",f),console.log("uids:",u),u.splice(l-1,1,a.nice());var h=i;delete o.rnas[n.uid],o.addRNA(c,{sequence:f,positions:h,uids:u,centerView:!1})},$=function(t,e,n){var r=e.rna,i=d.pairtableToDotbracket(r.pairtable),s=r.getPositions("nucleotide"),u=r.seq,l=r.getUids(),c=e.num+n,f=i.slice(0,c)+"."+i.slice(c),h=u.slice(0,c)+t+u.slice(c);console.log("newSequence:",h),l.splice(c,0,a.nice()),s.splice(c,0,s[c-n-1]);var p=l,g=s;console.log("positions:",s),console.log("new node positions:",g),delete o.rnas[r.uid],o.addRNA(f,{sequence:h,positions:g,uids:p,centerView:!1})},W=function(t){console.log("deleting...",t);var e=t.rna,n=e.pairtable[t.num];0!=n&&(e.pairtable[t.num]=0,e.pairtable[n]=0);var r=d.pairtableToDotbracket(e.pairtable),i=e.getPositions("nucleotide"),s=e.seq,a=e.getUids(),u=r.slice(0,t.num-1)+r.slice(t.num),l=i.slice(0,t.num-1).concat(i.slice(t.num)),c=s.slice(0,t.num-1)+s.slice(t.num),f=a.slice(0,t.num-1).concat(a.slice(t.num));delete o.rnas[e.uid],o.addRNA(u,{sequence:c,positions:l,uids:f,centerView:!1}),console.log("new dotbracket:",u)},G=function(t){return t.uid},J=function(t){var e=t.getPositions("nucleotide"),n=t.getPositions("label"),r=t.getUids();t.recalculateElements().elementsToJson().addPseudoknots().addPositions("nucleotide",e).addUids(r).addLabels(1,o.options.labelInterval).addPositions("label",n).reinforceStems().reinforceLoops().updateLinkUids()},H=function(t,n){console.log("nodeMouseup");var r=!0;if(i){if("middle"==(u=t).nodeType||"middle"==i.nodeType||"label"==u.nodeType||"label"==i.nodeType)return;if(u==i)return void f();for(var s={source:i,target:u,linkType:"basepair",value:1,uid:a.nice()},h=0;h-1){if(t.source.rna==t.target.rna){if("backbone"==t.linkType)return console.log("trying to remove a backbone link",t.source.num,t.target.num),void function(t){if(t.target.num-t.source.num==1){for(var e=t.target.rna,n=[],r=0;r=t.target.num&&(console.log("crossing basepair",i),n.push(i))}console.log("toRemove:",n);for(var s=0;s1&&void 0!==arguments[1]?arguments[1]:{},n=X(t,e);if("extraLinks"in e){var r=o.addExternalLinks(n,e.extraLinks);o.extraLinks=o.extraLinks.concat(r)}return"centerPos"in e?o.addRNAJSON(n,{centerPos:e.centerPos,centerView:!1}):"avoidOthers"in e?o.addRNAJSON(n,{avoidOthers:e.avoidOthers}):o.addRNAJSON(n,{centerView:e.centerView}),n},o.addRNAJSON=function(t,e){var n,r,i=e.avoidOthers,a=void 0!==i&&i,u=e.centerPos,l=void 0===u?null:u,c=e.centerView,f=void 0===c||c;if(null!=l){var d=0,h=0,p=0;t.nodes.forEach((function(t){d+=t.x,h+=t.y,p+=1})),p>0&&t.nodes.forEach((function(t){t.x=t.x+l[0]-d/p,t.y=t.y+l[1]-h/p,t.px=t.x,t.py=t.y}))}return a&&(n=o.graph.nodes.length>0?s().max(o.graph.nodes.map((function(t){return t.x}))):0,r=s().min(t.nodes.map((function(t){return t.x}))),t.nodes.forEach((function(t){t.x+=n-r+20,t.px+=n-r}))),t.nodes.forEach((function(e){e.rna=t})),o.rnas[t.uid]=t,z(),o.update(),f&&o.centerView(),t},o.addNodes=function(t){t.links.forEach((function(e){"number"==typeof e.source&&(e.source=t.nodes[e.source]),"number"==typeof e.target&&(e.target=t.nodes[e.target])})),o.graph.nodes.length>0?(maxX=s().max(o.graph.nodes.map((function(t){return t.x}))),maxY=s().max(o.graph.nodes.map((function(t){return t.y})))):(maxX=0,maxY=0),t.nodes.forEach((function(t){t.rna.uid in o.rnas||(o.rnas[t.rna.uid]=t.rna),t.x+=maxX,t.px+=maxX})),r=new g("",""),r.nodes=t.nodes,r.links=t.links,z(),o.update(),o.centerView()},o.clearNodes=function(){o.graph.nodes=[],o.graph.links=[],o.rnas={},o.extraLinks=[],o.update()},o.addLink=function(t){if(console.log("adding new link"),t.source.rna==t.target.rna){var e=t.source.rna;e.pairtable[t.source.num]=t.target.num,e.pairtable[t.target.num]=t.source.num,J(e)}else console.log("intermolecule"),t.linkType="intermolecule",o.extraLinks.push(t);z(),o.update()},o.addExternalLinks=function(t,e){for(var n=[],r=0;r0&&void 0!==arguments[0]?arguments[0]:{},o={width:300,height:300,nucleotideRadius:5,rnaEdgePadding:1,labelInterval:10,showNucleotideLabels:!0,startNucleotideNumber:1,bundleExternalLinks:!1,rnaLayout:"simple",namePosition:"0 0"};function i(r){r.each((function(r){var i=d3.select(this).append("g").classed(e().plot,!0),s=new g(r.sequence,r.structure,r.name,o.startNucleotideNumber).recalculateElements().elementsToJson().addName(r.name);r.rnaGraph=s;var a=[];if("naview"===o.rnaLayout)for(var u=(new w).naview_xy_coordinates(s.pairtable),l=0;ll-o.height?(a=c(t=d3.scale.linear().domain(i).range([0,o.width]),s,[0,o.height]),n=a.scale):(a=c(n=d3.scale.linear().domain(s).range([0,o.height]),i,[0,o.width]),t=a.scale),t.range()[0],t.domain()[0],n.range()[0],n.domain()[0],"translate("+-(t.domain()[0]*a.scaleFactor-t.range()[0])+","+-(n.domain()[0]*a.scaleFactor-n.range()[0])+")scale("+a.scaleFactor+")"}(s.nodes.map((function(t){return t.x})),s.nodes.map((function(t){return t.y})));i.attr("transform",c);var f=s.nodes.filter((function(t){return"nucleotide"==t.nodeType})),d=s.nodes.filter((function(t){return"label"==t.nodeType})),h=s.links;!function(t,n){n=n.filter((function(t){return null!==t.source&&null!==t.target})),t.selectAll(".link").data(n).enter().append("svg:line").attr("x1",(function(t){return t.source.x})).attr("x2",(function(t){return t.target.x})).attr("y1",(function(t){return t.source.y})).attr("y2",(function(t){return t.target.y})).attr("link-type",(function(t){return t.linkType})).attr("extra-link-type",(function(t){return t.extraLinkType})).classed("link",!0).classed(e().link,!0)}(i,h),function(t,n){var r=t.selectAll(".gnode").data(n).enter().append("svg:g").classed("gnode",!0).attr("transform",(function(t){return"translate("+t.x+","+t.y+")"}));r.append("svg:circle").classed(e().node,!0).attr("node_type","nucleotide").attr("base_type",(function(t){if(t.name)return t.name.toLowerCase()})).attr("r",o.nucleotideRadius),o.showNucleotideLabels&&r.append("svg:text").text((function(t){return t.name})).classed(e().nodeLabel,!0).append("svg:title").text((function(t){return t.struct_name+":"+t.num}))}(i,f),function(t,n){var r=t.selectAll().data(n).enter().append("svg:g").classed("gnode",!0).attr("transform",(function(t){return"translate("+t.x+","+t.y+")"}));r.append("svg:circle").classed(e().node,!0).attr("node_type","label").attr("r",o.nucleotideRadius),r.append("svg:text").classed(e().nodeLabel,!0).text((function(t){return t.name}))}(i,d),function(t,n){var r=t.append("svg:text").classed(e().plotLabel,!0).text(n),i=o.namePosition.split(" ",2),s=[],a=r.node().getBBox(),u=[a.width,a.height],l=[o.width,o.height];for(var c in[0,1])switch(i[c]){case"0":s[c]=u[c]/2;break;case"1":s[c]=l[c]-u[c]/2;break;case"0.5":s[c]=l[c]/2}r.attr("x",s[0]).attr("y",s[1])}(d3.select(this),r.name),o.bundleExternalLinks&&function(t,e){var n={},r=[];e=e.filter((function(t){return"correct"==t.linkType||"incorrect"==t.linkType||"extra"==t.linkType})),t.selectAll("[link-type=extra]").remove();for(var o=0;o0&&void 0!==arguments[0]?arguments[0]:{},e={width:300,height:300,nucleotideRadius:5,rnaEdgePadding:1,labelInterval:10,showNucleotideLabels:!0,startNucleotideNumber:1,bundleExternalLinks:!1,rnaLayout:"simple",namePosition:"0 0"};function n(t){t.each((function(t){d3.select(this).attr("transform",(function(t){return"translate("+t.x+","+t.y+")"})).append("rect").attr("fill","transparent").attr("width",(function(t){return Math.max(0,t.dx)})).attr("height",(function(t){return Math.max(0,t.dy)}));var n=L(e).width(Math.max(0,t.dx)).height(Math.max(0,t.dy));"structure"in t&&d3.select(this).call(n)}))}e=Object.assign(e,t);var r=function(t){t.each((function(t){console.log("data:",t);var r=d3.layout.treemap().size([e.width,e.height]).sticky(!1).value((function(t){return t.size}));d3.select(this).append("g").classed("rnatreemap",!0).datum(t).selectAll(".treemapnode").data(r.nodes).enter().append("g").classed("treemapnode",!0).call(n)}))};return r.width=function(t){return arguments.length?(e.width=t,r):e.width},r.height=function(t){return arguments.length?(e.height=t,r):e.height},r.showNucleotideLabels=function(t){return arguments.length?(e.showNucleotideLabels=t,r):e.showNucleotideLabels},r.rnaEdgePadding=function(t){return arguments.length?(e.rnaEdgePadding=t,r):e.rnaEdgePadding},r.nucleotideRadius=function(t){return arguments.length?(e.nucleotideRadius=t,r):e.nucleotideRadius},r.labelInterval=function(t){return arguments.length?(e.labelInterval=t,r):e.labelInterval},r.showNucleotideLabels=function(t){return arguments.length?(e.showNucleotideLabels=t,r):e.showNucleotideLabels},r.startNucleotideNumber=function(t){return arguments.length?(e.startNucleotideNumber=t,r):e.startNucleotideNumber},r.bundleExternalLinks=function(t){return arguments.length?(e.bundleExternalLinks=t,r):e.bundleExternalLinks},r.rnaLayout=function(t){return arguments.length?(e.rnaLayout=t,r):e.rnaLayout},r.namePosition=function(t){return arguments.length?(e.namePosition=t,r):e.namePosition},r.zoom=function(t){return arguments.length?(e.zoom=t,r):e.zoom},r}w.prototype.naview_xy_coordinates=function(t){var e,n=[],r=[];if(0===t.length||0===t[0])return 0;this.nbase=t[0],this.bases=[];for(var o=0;oe&&n++;0==n&&(this.bases[1].setMate(this.nbase),this.bases[this.nbase].setMate(1))},w.prototype.find_regions=function(){var t,e=null,n=null;t=this.nbase+1;var r=[];for(e=0;ethis.nbase&&(e=0)}while(e!=t);return r},w.prototype.find_central_loop=function(){var t=new x.F,e=null,n=null,r=null;for(E.bind(this)(),e=0,n=-1,r=0;re?(n=t.getDepth(),e=t.getNconnection(),this.root=t):t.getDepth()>n&&t.getNconnection()==e&&(n=t.getDepth(),this.root=t)},w.prototype.traverse_loop=function(t,e){var n,r,o,i,s,a,u,l,c,f,d,h,p,g,y,m,b,v,k,x,w,E,A,N,L,T,_,M,I,S,B,P,R,C,U,O,X,Y,F,q,D,z,V,j,$,W,G,J,H,K,Z,Q,tt,et,nt,rt,ot,it,st,at,ut,lt,ct,ft,dt,ht,pt,gt,yt,mt=0;a=2*Math.PI/(this.nbase+1),v=null,S=-1;var bt=0;for(A=0;null!=(m=t.getConnection(bt));bt++,A++)n=-Math.sin(a*m.getStart()),r=Math.cos(a*m.getStart()),o=-Math.sin(a*m.getEnd()),i=Math.cos(a*m.getEnd())-r,s=n-o,u=Math.sqrt(i*i+s*s),m.setXrad(i/u),m.setYrad(s/u),m.setAngle(Math.atan2(s,i)),m.getAngle()<0&&m.setAngle(m.getAngle()+2*Math.PI),null!=e&&e.getRegion()==m.getRegion()&&(v=m,S=A);t:for(;;){this.determine_radius(t,this.lencut),l=t.getRadius()/this.RADIUS_REDUCTION_FACTOR,null==e?c=f=0:(d=(this.bases[v.getStart()].getX()+this.bases[v.getEnd()].getX())/2,h=(this.bases[v.getStart()].getY()+this.bases[v.getEnd()].getY())/2,c=d-l*v.getXrad(),f=h-l*v.getYrad()),_=-1==S?0:S,m=t.getConnection(_),T=0,B=!1;do{if((w=_-1)<0&&(w=t.getNconnection()-1),k=t.getConnection(w),this.connected_connection(k,m)?(_=w,m=k):B=!0,++T>t.getNconnection()){for(L=-1,A=0;A=t.getNconnection()&&(w=0),m=t.getConnection(A),(dt=(b=t.getConnection(w)).getAngle()-m.getAngle())<0&&(dt+=2*Math.PI),dt>L&&(L=dt,mt=A);M=mt,(_=mt+1)>=t.getNconnection()&&(_=0),(m=t.getConnection(M)).setBroken(!0),B=!0}}while(!B);for(P=!1,W=_;!P;){for(T=0,B=!1,M=_,R=!1;!B;)if(m=t.getConnection(M),M==S&&(R=!0),(w=M+1)>=t.getNconnection()&&(w=0),b=t.getConnection(w),this.connected_connection(m,b)){if(++T>=t.getNconnection())break;M=w}else B=!0;for(A=G=J=I=this.find_ic_middle(_,M,e,v,t),B=!1,K=0;!B;)(A=K<0?G:0==K?I:J)>=0&&(m=t.getConnection(A),null!=e&&v==m||(0==K?(p=m.getAngle()-Math.asin(.5/l),g=m.getAngle()+Math.asin(.5/l),this.bases[m.getStart()].setX(c+l*Math.cos(p)),this.bases[m.getStart()].setY(f+l*Math.sin(p)),this.bases[m.getEnd()].setX(c+l*Math.cos(g)),this.bases[m.getEnd()].setY(f+l*Math.sin(g))):K<0?((w=A+1)>=t.getNconnection()&&(w=0),m=t.getConnection(A),b=t.getConnection(w),nt=m.getXrad(),rt=m.getYrad(),dt=(m.getAngle()+b.getAngle())/2,m.getAngle()>b.getAngle()&&(dt-=Math.PI),st=Math.cos(dt),lt=Math.sin(dt),ct=-st,(N=b.getAngle()-m.getAngle())<0&&(N+=2*Math.PI),ft=m.isExtruded()?N<=Math.PI/2?2:1.5:1,this.bases[m.getEnd()].setX(this.bases[b.getStart()].getX()+ft*lt),this.bases[m.getEnd()].setY(this.bases[b.getStart()].getY()+ft*ct),this.bases[m.getStart()].setX(this.bases[m.getEnd()].getX()+rt),this.bases[m.getStart()].setY(this.bases[m.getEnd()].getY()-nt)):((w=A-1)<0&&(w=t.getNconnection()-1),m=t.getConnection(w),ot=(b=t.getConnection(A)).getXrad(),it=b.getYrad(),dt=(m.getAngle()+b.getAngle())/2,m.getAngle()>b.getAngle()&&(dt-=Math.PI),st=Math.cos(dt),lt=-Math.sin(dt),ct=st,(N=b.getAngle()-m.getAngle())<0&&(N+=2*Math.PI),ft=m.isExtruded()?N<=Math.PI/2?2:1.5:1,this.bases[b.getStart()].setX(this.bases[m.getEnd()].getX()+ft*lt),this.bases[b.getStart()].setY(this.bases[m.getEnd()].getY()+ft*ct),this.bases[b.getEnd()].setX(this.bases[b.getStart()].getX()-it),this.bases[b.getEnd()].setY(this.bases[b.getStart()].getY()+ot)))),K<0?(J==M?J=-1:J>=0&&++J>=t.getNconnection()&&(J=0),K=1):(G==_?G=-1:G>=0&&--G<0&&(G=t.getNconnection()-1),K=-1),B=-1==G&&-1==J;if((H=M+1)>=t.getNconnection()&&(H=0),M!=_&&(_!=W||H!=W))if(m=t.getConnection(_),b=t.getConnection(M),Q=this.bases[b.getEnd()].getX()-this.bases[m.getStart()].getX(),tt=this.bases[b.getEnd()].getY()-this.bases[m.getStart()].getY(),U=this.bases[m.getStart()].getX()+Q/2,O=this.bases[m.getStart()].getY()+tt/2,F=Q/(et=Math.sqrt(Q*Q+tt*tt)),q=tt/et,D=c-U,z=f-O,X=(V=(D/=et=Math.sqrt(Q*Q+tt*tt))*F+(z/=et)*q)*F-D,Y=V*q-z,X/=et=Math.sqrt(X*X+Y*Y),Y/=et,Q=this.bases[m.getStart()].getX()-c,tt=this.bases[m.getStart()].getY()-f,(dt=Math.atan2(tt,Q))<0&&(dt+=2*Math.PI),Q=this.bases[b.getEnd()].getX()-c,tt=this.bases[b.getEnd()].getY()-f,(ht=Math.atan2(tt,Q))<0&&(ht+=2*Math.PI),htMath.PI?-1:1)*l*X,$=f+C*l*Y,R)c-=j-U,f-=$-O;else for(A=_;x=(m=t.getConnection(A)).getStart(),this.bases[x].setX(this.bases[x].getX()+j-U),this.bases[x].setY(this.bases[x].getY()+$-O),x=m.getEnd(),this.bases[x].setX(this.bases[x].getX()+j-U),this.bases[x].setY(this.bases[x].getY()+$-O),A!=M;)++A>=t.getNconnection()&&(A=0);P=(_=H)==W}for(A=0;A=t.getNconnection()&&(w=0),b=t.getConnection(w),Q=this.bases[m.getEnd()].getX()-c,tt=this.bases[m.getEnd()].getY()-f,ut=Math.sqrt(Q*Q+tt*tt),(dt=Math.atan2(tt,Q))<0&&(dt+=2*Math.PI),Q=this.bases[b.getStart()].getX()-c,tt=this.bases[b.getStart()].getY()-f,at=Math.sqrt(Q*Q+tt*tt),(ht=Math.atan2(tt,Q))<0&&(ht+=2*Math.PI),htMath.PI)if(m.isExtruded())console.log("Warning from traverse_loop. Loop "+t.getNumber()+" has crossed regions\n");else if(b.getStart()-m.getEnd()!=1){m.setExtruded(!0);continue t}if(m.isExtruded())this.construct_extruded_segment(m,b);else for((E=b.getStart()-m.getEnd())<0&&(E+=this.nbase+1),a=Z/E,w=1;wthis.nbase&&(x-=this.nbase+1),et=ut+(at-ut)*((y=dt+w*a)-dt)/Z,this.bases[x].setX(c+et*Math.cos(y)),this.bases[x].setY(f+et*Math.sin(y))}break}for(A=0;A=t.getNconnection()&&(w=0),m=t.getConnection(A),b=t.getConnection(w),E+=2,pt+=this.bases[m.getStart()].getX()+this.bases[m.getEnd()].getX(),gt+=this.bases[m.getStart()].getY()+this.bases[m.getEnd()].getY(),!m.isExtruded())for(w=m.getEnd()+1;w!=b.getStart();w++)w>this.nbase&&(w-=this.nbase+1),E++,pt+=this.bases[w].getX(),gt+=this.bases[w].getY();t.setX(pt/E),t.setY(gt/E)},w.prototype.determine_radius=function(t,e){var n,r,o,i,s,a,u,l,c,f,d,h=0,p=new b.Connection,g=new b.Connection,y=.7071068;do{for(n=1e10,s=0,i=0,l=0;l=t.getNconnection()&&(c=0),g=t.getConnection(c),f=p.getEnd(),(d=g.getStart())1&&(n=u,h=l);(a=i/s)0?a=t.getRadius():t.setRadius(a)},w.prototype.find_ic_middle=function(t,e,n,r,o){var i,s,a,u,l;for(i=0,s=-1,a=t,l=!1;!l;)i++>2*o.getNconnection()&&console.log("Infinite loop in 'find_ic_middle'"),null!=n&&o.getConnection(a)==r&&(s=a),l=a==e,++a>=o.getNconnection()&&(a=0);if(-1==s){for(u=1,a=t;u<(i+1)/2;u++)++a>=o.getNconnection()&&(a=0);s=a}return s},w.prototype.construct_extruded_segment=function(t,e){var n,r,o,i,s,a,u,l,c,f,d,h,p,g,y,m,b,v;if(n=t.getAngle(),(o=r=e.getAngle())=1.5&&d<=Math.PI/2&&((m=p+1)>this.nbase&&(m-=this.nbase+1),(b=g-1)<0&&(b+=this.nbase+1),this.bases[m].setX(this.bases[p].getX()+.5*s),this.bases[m].setY(this.bases[p].getY()+.5*a),this.bases[b].setX(this.bases[g].getX()-.5*s),this.bases[b].setY(this.bases[g].getY()-.5*a),p=m,g=b);do{v=!1,this.construct_circle_segment(p,g),(m=p+1)>this.nbase&&(m-=this.nbase+1),s=this.bases[m].getX()-this.bases[p].getX(),a=this.bases[m].getY()-this.bases[p].getY(),(u=Math.atan2(a,s))<0&&(u+=2*Math.PI),(h=u-n)<0&&(h+=2*Math.PI),h>Math.PI&&(v=!0),(b=g-1)<0&&(b+=this.nbase+1),s=this.bases[b].getX()-this.bases[g].getX(),a=this.bases[b].getY()-this.bases[g].getY(),(l=Math.atan2(a,s))<0&&(l+=2*Math.PI),(h=r-l)<0&&(h+=2*Math.PI),h>Math.PI&&(v=!0),v&&(c=this.minf2(i,n+.5),this.bases[m].setX(this.bases[p].getX()+Math.cos(c)),this.bases[m].setY(this.bases[p].getY()+Math.sin(c)),p=m,c=this.maxf2(i,o-.5),this.bases[b].setX(this.bases[g].getX()+Math.cos(c)),this.bases[b].setY(this.bases[g].getY()+Math.sin(c)),g=b,y-=2)}while(v&&y>1)}},w.prototype.construct_circle_segment=function(t,e){var n,r,o,i,s,a,u,l,c,f,d,h,p,g,y;if(n=this.bases[e].getX()-this.bases[t].getX(),r=this.bases[e].getY()-this.bases[t].getY(),o=Math.sqrt(n*n+r*r),(p=e-t)<0&&(p+=this.nbase+1),o>=p)for(n/=o,r/=o,g=1;gthis.nbase&&(y-=this.nbase+1),this.bases[y].setX(this.bases[t].getX()+n*g/p),this.bases[y].setY(this.bases[t].getY()+r*g/p);else for(this.find_center_for_arc(p-1,o),n/=o,r/=o,i=this.bases[t].getX()+n*o/2,s=this.bases[t].getY()+r*o/2,a=r,u=-n,l=i+this._h*a,c=s+this._h*u,f=this.bases[t].getX()-l,d=this.bases[t].getY()-c,o=Math.sqrt(f*f+d*d),h=Math.atan2(d,f),g=1;gthis.nbase&&(y-=this.nbase+1),this.bases[y].setX(l+o*Math.cos(h+g*this.angleinc)),this.bases[y].setY(c+o*Math.sin(h+g*this.angleinc))},w.prototype.find_center_for_arc=function(t,e){var n,r,o,i,s,a,u,l;o=-(r=(t+1)/Math.PI)-e/(t+1.000001-e),e<1&&(o=0),l=0;do{n=(r+o)/2,s=1-.5/((i=Math.sqrt(n*n+e*e/4))*i),Math.abs(s)>1&&console.log("Unexpected large magnitude discriminant = "+s+" "+i),(u=(a=Math.acos(s))*(t+1)+2*Math.acos(n/i)-2*Math.PI)>0?o=n:r=n}while(Math.abs(u)>1e-4&&++l=this.MAXITER&&(noIterationFailureYet&&(console.log("Iteration failed in find_center_for_arc"),noIterationFailureYet=!1),n=0,a=0),this._h=n,this.angleinc=a},w.prototype.generate_region=function(t){var e,n,r,o,i,s;for(s=t.getRegion(),e=0,t.getStart()==s.getStart1()?(n=s.getStart1(),r=s.getEnd1()):(n=s.getStart2(),r=s.getEnd2()),(this.bases[t.getStart()].getX()>this.ANUM-100||this.bases[t.getEnd()].getX()>this.ANUM-100)&&console.log("Bad region passed to generate_region. Coordinates not defined."),o=n+1;o<=r;o++)e++,this.bases[o].setX(this.bases[t.getStart()].getX()+this.HELIX_FACTOR*e*t.getXrad()),this.bases[o].setY(this.bases[t.getStart()].getY()+this.HELIX_FACTOR*e*t.getYrad()),i=this.bases[o].getMate(),this.bases[i].setX(this.bases[t.getEnd()].getX()+this.HELIX_FACTOR*e*t.getXrad()),this.bases[i].setY(this.bases[t.getEnd()].getY()+this.HELIX_FACTOR*e*t.getYrad())},w.prototype.minf2=function(t,e){return te?t:e},w.prototype.connected_connection=function(t,e){return!!t.isExtruded()||t.getEnd()+1==e.getStart()}})(),i})())); +!function(t,e){"object"==typeof exports&&"object"==typeof module?module.exports=e(require("d3")):"function"==typeof define&&define.amd?define(["d3"],e):"object"==typeof exports?exports.fornac=e(require("d3")):t.fornac=e(t.d3)}(self,(t=>(()=>{var e={332:(t,e,n)=>{"use strict";n.r(e),n.d(e,{Connection:()=>i});var r=n(326),o=n(980);function i(){this.loop=new r.F,this.region=new o.T,this.start=null,this.end=null,this.xrad=null,this.yrad=null,this.angle=null,this.extruded=null,this.broken=null,this._isNull=!1}i.prototype.isNull=function(){return this._isNull},i.prototype.setNull=function(t){this._isNull=t},i.prototype.getLoop=function(){return this.loop},i.prototype.setLoop=function(t){this.loop=t},i.prototype.getRegion=function(){return this.region},i.prototype.setRegion=function(t){this.region=t},i.prototype.getStart=function(){return this.start},i.prototype.setStart=function(t){this.start=t},i.prototype.getEnd=function(){return this.end},i.prototype.setEnd=function(t){this.end=t},i.prototype.getXrad=function(){return this.xrad},i.prototype.setXrad=function(t){this.xrad=t},i.prototype.getYrad=function(){return this.yrad},i.prototype.setYrad=function(t){this.yrad=t},i.prototype.getAngle=function(){return this.angle},i.prototype.setAngle=function(t){this.angle=t},i.prototype.isExtruded=function(){return this.extruded},i.prototype.setExtruded=function(t){this.extruded=t},i.prototype.isBroken=function(){return this.broken},i.prototype.setBroken=function(t){this.broken=t}},326:(t,e,n)=>{"use strict";n.d(e,{F:()=>o});var r=n(332);function o(){this.nconnection=null,this.connections=[],this._connections=[],this.number=null,this.depth=null,this.mark=null,this.x=null,this.y=null,this.radius=null}o.prototype.getNconnection=function(){return this.nconnection},o.prototype.setNconnection=function(t){this.nconnection=t},o.prototype.setConnection=function(t,e){null!=e?this._connections[t]=e:(this._connections[t]||(this._connections[t]=new r.Connection),this._connections[t].setNull(!0))},o.prototype.getConnection=function(t){var e=n(332);this._connections[t]||(this._connections[t]=new e);var r=this._connections[t];return r.isNull()?null:r},o.prototype.addConnection=function(t,e){this._connections.push(e)},o.prototype.getNumber=function(){return this.number},o.prototype.setNumber=function(t){this.number=t},o.prototype.getDepth=function(){return this.depth},o.prototype.setDepth=function(t){this.depth=t},o.prototype.isMark=function(){return this.mark},o.prototype.setMark=function(t){this.mark=t},o.prototype.getX=function(){return this.x},o.prototype.setX=function(t){this.x=t},o.prototype.getY=function(){return this.y},o.prototype.setY=function(t){this.y=t},o.prototype.getRadius=function(){return this.radius},o.prototype.setRadius=function(t){this.radius=t}},980:(t,e,n)=>{"use strict";function r(){this._start1=null,this._end1=null,this._start2=null,this._end2=null}n.d(e,{T:()=>r}),r.prototype.getStart1=function(){return this._start1},r.prototype.setStart1=function(t){this._start1=t},r.prototype.getEnd1=function(){return this._end1},r.prototype.setEnd1=function(t){this._end1=t},r.prototype.getStart2=function(){return this._start2},r.prototype.setStart2=function(t){this._start2=t},r.prototype.getEnd2=function(){return this._end2},r.prototype.setEnd2=function(t){this._end2=t}},526:(t,e)=>{"use strict";e.byteLength=function(t){var e=a(t),n=e[0],r=e[1];return 3*(n+r)/4-r},e.toByteArray=function(t){var e,n,i=a(t),s=i[0],u=i[1],l=new o(function(t,e,n){return 3*(e+n)/4-n}(0,s,u)),c=0,f=u>0?s-4:s;for(n=0;n>16&255,l[c++]=e>>8&255,l[c++]=255&e;return 2===u&&(e=r[t.charCodeAt(n)]<<2|r[t.charCodeAt(n+1)]>>4,l[c++]=255&e),1===u&&(e=r[t.charCodeAt(n)]<<10|r[t.charCodeAt(n+1)]<<4|r[t.charCodeAt(n+2)]>>2,l[c++]=e>>8&255,l[c++]=255&e),l},e.fromByteArray=function(t){for(var e,r=t.length,o=r%3,i=[],s=16383,a=0,l=r-o;al?l:a+s));return 1===o?(e=t[r-1],i.push(n[e>>2]+n[e<<4&63]+"==")):2===o&&(e=(t[r-2]<<8)+t[r-1],i.push(n[e>>10]+n[e>>4&63]+n[e<<2&63]+"=")),i.join("")};for(var n=[],r=[],o="undefined"!=typeof Uint8Array?Uint8Array:Array,i="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/",s=0;s<64;++s)n[s]=i[s],r[i.charCodeAt(s)]=s;function a(t){var e=t.length;if(e%4>0)throw new Error("Invalid string. Length must be a multiple of 4");var n=t.indexOf("=");return-1===n&&(n=e),[n,n===e?0:4-n%4]}function u(t,e,r){for(var o,i,s=[],a=e;a>18&63]+n[i>>12&63]+n[i>>6&63]+n[63&i]);return s.join("")}r["-".charCodeAt(0)]=62,r["_".charCodeAt(0)]=63},287:(t,e,n)=>{"use strict";const r=n(526),o=n(251),i="function"==typeof Symbol&&"function"==typeof Symbol.for?Symbol.for("nodejs.util.inspect.custom"):null;e.hp=u,e.IS=50;const s=2147483647;function a(t){if(t>s)throw new RangeError('The value "'+t+'" is invalid for option "size"');const e=new Uint8Array(t);return Object.setPrototypeOf(e,u.prototype),e}function u(t,e,n){if("number"==typeof t){if("string"==typeof e)throw new TypeError('The "string" argument must be of type string. Received type number');return f(t)}return l(t,e,n)}function l(t,e,n){if("string"==typeof t)return function(t,e){if("string"==typeof e&&""!==e||(e="utf8"),!u.isEncoding(e))throw new TypeError("Unknown encoding: "+e);const n=0|g(t,e);let r=a(n);const o=r.write(t,e);return o!==n&&(r=r.slice(0,o)),r}(t,e);if(ArrayBuffer.isView(t))return function(t){if(W(t,Uint8Array)){const e=new Uint8Array(t);return h(e.buffer,e.byteOffset,e.byteLength)}return d(t)}(t);if(null==t)throw new TypeError("The first argument must be one of type string, Buffer, ArrayBuffer, Array, or Array-like Object. Received type "+typeof t);if(W(t,ArrayBuffer)||t&&W(t.buffer,ArrayBuffer))return h(t,e,n);if("undefined"!=typeof SharedArrayBuffer&&(W(t,SharedArrayBuffer)||t&&W(t.buffer,SharedArrayBuffer)))return h(t,e,n);if("number"==typeof t)throw new TypeError('The "value" argument must not be of type number. Received type number');const r=t.valueOf&&t.valueOf();if(null!=r&&r!==t)return u.from(r,e,n);const o=function(t){if(u.isBuffer(t)){const e=0|p(t.length),n=a(e);return 0===n.length||t.copy(n,0,0,e),n}return void 0!==t.length?"number"!=typeof t.length||G(t.length)?a(0):d(t):"Buffer"===t.type&&Array.isArray(t.data)?d(t.data):void 0}(t);if(o)return o;if("undefined"!=typeof Symbol&&null!=Symbol.toPrimitive&&"function"==typeof t[Symbol.toPrimitive])return u.from(t[Symbol.toPrimitive]("string"),e,n);throw new TypeError("The first argument must be one of type string, Buffer, ArrayBuffer, Array, or Array-like Object. Received type "+typeof t)}function c(t){if("number"!=typeof t)throw new TypeError('"size" argument must be of type number');if(t<0)throw new RangeError('The value "'+t+'" is invalid for option "size"')}function f(t){return c(t),a(t<0?0:0|p(t))}function d(t){const e=t.length<0?0:0|p(t.length),n=a(e);for(let r=0;r=s)throw new RangeError("Attempt to allocate Buffer larger than maximum size: 0x"+s.toString(16)+" bytes");return 0|t}function g(t,e){if(u.isBuffer(t))return t.length;if(ArrayBuffer.isView(t)||W(t,ArrayBuffer))return t.byteLength;if("string"!=typeof t)throw new TypeError('The "string" argument must be one of type string, Buffer, or ArrayBuffer. Received type '+typeof t);const n=t.length,r=arguments.length>2&&!0===arguments[2];if(!r&&0===n)return 0;let o=!1;for(;;)switch(e){case"ascii":case"latin1":case"binary":return n;case"utf8":case"utf-8":return $(t).length;case"ucs2":case"ucs-2":case"utf16le":case"utf-16le":return 2*n;case"hex":return n>>>1;case"base64":return J(t).length;default:if(o)return r?-1:$(t).length;e=(""+e).toLowerCase(),o=!0}}function y(t,e,n){let r=!1;if((void 0===e||e<0)&&(e=0),e>this.length)return"";if((void 0===n||n>this.length)&&(n=this.length),n<=0)return"";if((n>>>=0)<=(e>>>=0))return"";for(t||(t="utf8");;)switch(t){case"hex":return I(this,e,n);case"utf8":case"utf-8":return N(this,e,n);case"ascii":return _(this,e,n);case"latin1":case"binary":return M(this,e,n);case"base64":return L(this,e,n);case"ucs2":case"ucs-2":case"utf16le":case"utf-16le":return S(this,e,n);default:if(r)throw new TypeError("Unknown encoding: "+t);t=(t+"").toLowerCase(),r=!0}}function m(t,e,n){const r=t[e];t[e]=t[n],t[n]=r}function b(t,e,n,r,o){if(0===t.length)return-1;if("string"==typeof n?(r=n,n=0):n>2147483647?n=2147483647:n<-2147483648&&(n=-2147483648),G(n=+n)&&(n=o?0:t.length-1),n<0&&(n=t.length+n),n>=t.length){if(o)return-1;n=t.length-1}else if(n<0){if(!o)return-1;n=0}if("string"==typeof e&&(e=u.from(e,r)),u.isBuffer(e))return 0===e.length?-1:v(t,e,n,r,o);if("number"==typeof e)return e&=255,"function"==typeof Uint8Array.prototype.indexOf?o?Uint8Array.prototype.indexOf.call(t,e,n):Uint8Array.prototype.lastIndexOf.call(t,e,n):v(t,[e],n,r,o);throw new TypeError("val must be string, number or Buffer")}function v(t,e,n,r,o){let i,s=1,a=t.length,u=e.length;if(void 0!==r&&("ucs2"===(r=String(r).toLowerCase())||"ucs-2"===r||"utf16le"===r||"utf-16le"===r)){if(t.length<2||e.length<2)return-1;s=2,a/=2,u/=2,n/=2}function l(t,e){return 1===s?t[e]:t.readUInt16BE(e*s)}if(o){let r=-1;for(i=n;ia&&(n=a-u),i=n;i>=0;i--){let n=!0;for(let r=0;ro&&(r=o):r=o;const i=e.length;let s;for(r>i/2&&(r=i/2),s=0;s>8,o=n%256,i.push(o),i.push(r);return i}(e,t.length-n),t,n,r)}function L(t,e,n){return 0===e&&n===t.length?r.fromByteArray(t):r.fromByteArray(t.slice(e,n))}function N(t,e,n){n=Math.min(t.length,n);const r=[];let o=e;for(;o239?4:e>223?3:e>191?2:1;if(o+s<=n){let n,r,a,u;switch(s){case 1:e<128&&(i=e);break;case 2:n=t[o+1],128==(192&n)&&(u=(31&e)<<6|63&n,u>127&&(i=u));break;case 3:n=t[o+1],r=t[o+2],128==(192&n)&&128==(192&r)&&(u=(15&e)<<12|(63&n)<<6|63&r,u>2047&&(u<55296||u>57343)&&(i=u));break;case 4:n=t[o+1],r=t[o+2],a=t[o+3],128==(192&n)&&128==(192&r)&&128==(192&a)&&(u=(15&e)<<18|(63&n)<<12|(63&r)<<6|63&a,u>65535&&u<1114112&&(i=u))}}null===i?(i=65533,s=1):i>65535&&(i-=65536,r.push(i>>>10&1023|55296),i=56320|1023&i),r.push(i),o+=s}return function(t){const e=t.length;if(e<=T)return String.fromCharCode.apply(String,t);let n="",r=0;for(;rr.length?(u.isBuffer(e)||(e=u.from(e)),e.copy(r,o)):Uint8Array.prototype.set.call(r,e,o);else{if(!u.isBuffer(e))throw new TypeError('"list" argument must be an Array of Buffers');e.copy(r,o)}o+=e.length}return r},u.byteLength=g,u.prototype._isBuffer=!0,u.prototype.swap16=function(){const t=this.length;if(t%2!=0)throw new RangeError("Buffer size must be a multiple of 16-bits");for(let e=0;en&&(t+=" ... "),""},i&&(u.prototype[i]=u.prototype.inspect),u.prototype.compare=function(t,e,n,r,o){if(W(t,Uint8Array)&&(t=u.from(t,t.offset,t.byteLength)),!u.isBuffer(t))throw new TypeError('The "target" argument must be one of type Buffer or Uint8Array. Received type '+typeof t);if(void 0===e&&(e=0),void 0===n&&(n=t?t.length:0),void 0===r&&(r=0),void 0===o&&(o=this.length),e<0||n>t.length||r<0||o>this.length)throw new RangeError("out of range index");if(r>=o&&e>=n)return 0;if(r>=o)return-1;if(e>=n)return 1;if(this===t)return 0;let i=(o>>>=0)-(r>>>=0),s=(n>>>=0)-(e>>>=0);const a=Math.min(i,s),l=this.slice(r,o),c=t.slice(e,n);for(let t=0;t>>=0,isFinite(n)?(n>>>=0,void 0===r&&(r="utf8")):(r=n,n=void 0)}const o=this.length-e;if((void 0===n||n>o)&&(n=o),t.length>0&&(n<0||e<0)||e>this.length)throw new RangeError("Attempt to write outside buffer bounds");r||(r="utf8");let i=!1;for(;;)switch(r){case"hex":return k(this,t,e,n);case"utf8":case"utf-8":return x(this,t,e,n);case"ascii":case"latin1":case"binary":return w(this,t,e,n);case"base64":return E(this,t,e,n);case"ucs2":case"ucs-2":case"utf16le":case"utf-16le":return A(this,t,e,n);default:if(i)throw new TypeError("Unknown encoding: "+r);r=(""+r).toLowerCase(),i=!0}},u.prototype.toJSON=function(){return{type:"Buffer",data:Array.prototype.slice.call(this._arr||this,0)}};const T=4096;function _(t,e,n){let r="";n=Math.min(t.length,n);for(let o=e;or)&&(n=r);let o="";for(let r=e;rn)throw new RangeError("Trying to access beyond buffer length")}function R(t,e,n,r,o,i){if(!u.isBuffer(t))throw new TypeError('"buffer" argument must be a Buffer instance');if(e>o||et.length)throw new RangeError("Index out of range")}function C(t,e,n,r,o){D(e,r,o,t,n,7);let i=Number(e&BigInt(4294967295));t[n++]=i,i>>=8,t[n++]=i,i>>=8,t[n++]=i,i>>=8,t[n++]=i;let s=Number(e>>BigInt(32)&BigInt(4294967295));return t[n++]=s,s>>=8,t[n++]=s,s>>=8,t[n++]=s,s>>=8,t[n++]=s,n}function B(t,e,n,r,o){D(e,r,o,t,n,7);let i=Number(e&BigInt(4294967295));t[n+7]=i,i>>=8,t[n+6]=i,i>>=8,t[n+5]=i,i>>=8,t[n+4]=i;let s=Number(e>>BigInt(32)&BigInt(4294967295));return t[n+3]=s,s>>=8,t[n+2]=s,s>>=8,t[n+1]=s,s>>=8,t[n]=s,n+8}function U(t,e,n,r,o,i){if(n+r>t.length)throw new RangeError("Index out of range");if(n<0)throw new RangeError("Index out of range")}function O(t,e,n,r,i){return e=+e,n>>>=0,i||U(t,0,n,4),o.write(t,e,n,r,23,4),n+4}function X(t,e,n,r,i){return e=+e,n>>>=0,i||U(t,0,n,8),o.write(t,e,n,r,52,8),n+8}u.prototype.slice=function(t,e){const n=this.length;(t=~~t)<0?(t+=n)<0&&(t=0):t>n&&(t=n),(e=void 0===e?n:~~e)<0?(e+=n)<0&&(e=0):e>n&&(e=n),e>>=0,e>>>=0,n||P(t,e,this.length);let r=this[t],o=1,i=0;for(;++i>>=0,e>>>=0,n||P(t,e,this.length);let r=this[t+--e],o=1;for(;e>0&&(o*=256);)r+=this[t+--e]*o;return r},u.prototype.readUint8=u.prototype.readUInt8=function(t,e){return t>>>=0,e||P(t,1,this.length),this[t]},u.prototype.readUint16LE=u.prototype.readUInt16LE=function(t,e){return t>>>=0,e||P(t,2,this.length),this[t]|this[t+1]<<8},u.prototype.readUint16BE=u.prototype.readUInt16BE=function(t,e){return t>>>=0,e||P(t,2,this.length),this[t]<<8|this[t+1]},u.prototype.readUint32LE=u.prototype.readUInt32LE=function(t,e){return t>>>=0,e||P(t,4,this.length),(this[t]|this[t+1]<<8|this[t+2]<<16)+16777216*this[t+3]},u.prototype.readUint32BE=u.prototype.readUInt32BE=function(t,e){return t>>>=0,e||P(t,4,this.length),16777216*this[t]+(this[t+1]<<16|this[t+2]<<8|this[t+3])},u.prototype.readBigUInt64LE=Z((function(t){z(t>>>=0,"offset");const e=this[t],n=this[t+7];void 0!==e&&void 0!==n||V(t,this.length-8);const r=e+256*this[++t]+65536*this[++t]+this[++t]*2**24,o=this[++t]+256*this[++t]+65536*this[++t]+n*2**24;return BigInt(r)+(BigInt(o)<>>=0,"offset");const e=this[t],n=this[t+7];void 0!==e&&void 0!==n||V(t,this.length-8);const r=e*2**24+65536*this[++t]+256*this[++t]+this[++t],o=this[++t]*2**24+65536*this[++t]+256*this[++t]+n;return(BigInt(r)<>>=0,e>>>=0,n||P(t,e,this.length);let r=this[t],o=1,i=0;for(;++i=o&&(r-=Math.pow(2,8*e)),r},u.prototype.readIntBE=function(t,e,n){t>>>=0,e>>>=0,n||P(t,e,this.length);let r=e,o=1,i=this[t+--r];for(;r>0&&(o*=256);)i+=this[t+--r]*o;return o*=128,i>=o&&(i-=Math.pow(2,8*e)),i},u.prototype.readInt8=function(t,e){return t>>>=0,e||P(t,1,this.length),128&this[t]?-1*(255-this[t]+1):this[t]},u.prototype.readInt16LE=function(t,e){t>>>=0,e||P(t,2,this.length);const n=this[t]|this[t+1]<<8;return 32768&n?4294901760|n:n},u.prototype.readInt16BE=function(t,e){t>>>=0,e||P(t,2,this.length);const n=this[t+1]|this[t]<<8;return 32768&n?4294901760|n:n},u.prototype.readInt32LE=function(t,e){return t>>>=0,e||P(t,4,this.length),this[t]|this[t+1]<<8|this[t+2]<<16|this[t+3]<<24},u.prototype.readInt32BE=function(t,e){return t>>>=0,e||P(t,4,this.length),this[t]<<24|this[t+1]<<16|this[t+2]<<8|this[t+3]},u.prototype.readBigInt64LE=Z((function(t){z(t>>>=0,"offset");const e=this[t],n=this[t+7];void 0!==e&&void 0!==n||V(t,this.length-8);const r=this[t+4]+256*this[t+5]+65536*this[t+6]+(n<<24);return(BigInt(r)<>>=0,"offset");const e=this[t],n=this[t+7];void 0!==e&&void 0!==n||V(t,this.length-8);const r=(e<<24)+65536*this[++t]+256*this[++t]+this[++t];return(BigInt(r)<>>=0,e||P(t,4,this.length),o.read(this,t,!0,23,4)},u.prototype.readFloatBE=function(t,e){return t>>>=0,e||P(t,4,this.length),o.read(this,t,!1,23,4)},u.prototype.readDoubleLE=function(t,e){return t>>>=0,e||P(t,8,this.length),o.read(this,t,!0,52,8)},u.prototype.readDoubleBE=function(t,e){return t>>>=0,e||P(t,8,this.length),o.read(this,t,!1,52,8)},u.prototype.writeUintLE=u.prototype.writeUIntLE=function(t,e,n,r){t=+t,e>>>=0,n>>>=0,r||R(this,t,e,n,Math.pow(2,8*n)-1,0);let o=1,i=0;for(this[e]=255&t;++i>>=0,n>>>=0,r||R(this,t,e,n,Math.pow(2,8*n)-1,0);let o=n-1,i=1;for(this[e+o]=255&t;--o>=0&&(i*=256);)this[e+o]=t/i&255;return e+n},u.prototype.writeUint8=u.prototype.writeUInt8=function(t,e,n){return t=+t,e>>>=0,n||R(this,t,e,1,255,0),this[e]=255&t,e+1},u.prototype.writeUint16LE=u.prototype.writeUInt16LE=function(t,e,n){return t=+t,e>>>=0,n||R(this,t,e,2,65535,0),this[e]=255&t,this[e+1]=t>>>8,e+2},u.prototype.writeUint16BE=u.prototype.writeUInt16BE=function(t,e,n){return t=+t,e>>>=0,n||R(this,t,e,2,65535,0),this[e]=t>>>8,this[e+1]=255&t,e+2},u.prototype.writeUint32LE=u.prototype.writeUInt32LE=function(t,e,n){return t=+t,e>>>=0,n||R(this,t,e,4,4294967295,0),this[e+3]=t>>>24,this[e+2]=t>>>16,this[e+1]=t>>>8,this[e]=255&t,e+4},u.prototype.writeUint32BE=u.prototype.writeUInt32BE=function(t,e,n){return t=+t,e>>>=0,n||R(this,t,e,4,4294967295,0),this[e]=t>>>24,this[e+1]=t>>>16,this[e+2]=t>>>8,this[e+3]=255&t,e+4},u.prototype.writeBigUInt64LE=Z((function(t,e=0){return C(this,t,e,BigInt(0),BigInt("0xffffffffffffffff"))})),u.prototype.writeBigUInt64BE=Z((function(t,e=0){return B(this,t,e,BigInt(0),BigInt("0xffffffffffffffff"))})),u.prototype.writeIntLE=function(t,e,n,r){if(t=+t,e>>>=0,!r){const r=Math.pow(2,8*n-1);R(this,t,e,n,r-1,-r)}let o=0,i=1,s=0;for(this[e]=255&t;++o>>=0,!r){const r=Math.pow(2,8*n-1);R(this,t,e,n,r-1,-r)}let o=n-1,i=1,s=0;for(this[e+o]=255&t;--o>=0&&(i*=256);)t<0&&0===s&&0!==this[e+o+1]&&(s=1),this[e+o]=(t/i|0)-s&255;return e+n},u.prototype.writeInt8=function(t,e,n){return t=+t,e>>>=0,n||R(this,t,e,1,127,-128),t<0&&(t=255+t+1),this[e]=255&t,e+1},u.prototype.writeInt16LE=function(t,e,n){return t=+t,e>>>=0,n||R(this,t,e,2,32767,-32768),this[e]=255&t,this[e+1]=t>>>8,e+2},u.prototype.writeInt16BE=function(t,e,n){return t=+t,e>>>=0,n||R(this,t,e,2,32767,-32768),this[e]=t>>>8,this[e+1]=255&t,e+2},u.prototype.writeInt32LE=function(t,e,n){return t=+t,e>>>=0,n||R(this,t,e,4,2147483647,-2147483648),this[e]=255&t,this[e+1]=t>>>8,this[e+2]=t>>>16,this[e+3]=t>>>24,e+4},u.prototype.writeInt32BE=function(t,e,n){return t=+t,e>>>=0,n||R(this,t,e,4,2147483647,-2147483648),t<0&&(t=4294967295+t+1),this[e]=t>>>24,this[e+1]=t>>>16,this[e+2]=t>>>8,this[e+3]=255&t,e+4},u.prototype.writeBigInt64LE=Z((function(t,e=0){return C(this,t,e,-BigInt("0x8000000000000000"),BigInt("0x7fffffffffffffff"))})),u.prototype.writeBigInt64BE=Z((function(t,e=0){return B(this,t,e,-BigInt("0x8000000000000000"),BigInt("0x7fffffffffffffff"))})),u.prototype.writeFloatLE=function(t,e,n){return O(this,t,e,!0,n)},u.prototype.writeFloatBE=function(t,e,n){return O(this,t,e,!1,n)},u.prototype.writeDoubleLE=function(t,e,n){return X(this,t,e,!0,n)},u.prototype.writeDoubleBE=function(t,e,n){return X(this,t,e,!1,n)},u.prototype.copy=function(t,e,n,r){if(!u.isBuffer(t))throw new TypeError("argument should be a Buffer");if(n||(n=0),r||0===r||(r=this.length),e>=t.length&&(e=t.length),e||(e=0),r>0&&r=this.length)throw new RangeError("Index out of range");if(r<0)throw new RangeError("sourceEnd out of bounds");r>this.length&&(r=this.length),t.length-e>>=0,n=void 0===n?this.length:n>>>0,t||(t=0),"number"==typeof t)for(o=e;o=r+4;n-=3)e=`_${t.slice(n-3,n)}${e}`;return`${t.slice(0,n)}${e}`}function D(t,e,n,r,o,i){if(t>n||t3?0===e||e===BigInt(0)?`>= 0${r} and < 2${r} ** ${8*(i+1)}${r}`:`>= -(2${r} ** ${8*(i+1)-1}${r}) and < 2 ** ${8*(i+1)-1}${r}`:`>= ${e}${r} and <= ${n}${r}`,new Y.ERR_OUT_OF_RANGE("value",o,t)}!function(t,e,n){z(e,"offset"),void 0!==t[e]&&void 0!==t[e+n]||V(e,t.length-(n+1))}(r,o,i)}function z(t,e){if("number"!=typeof t)throw new Y.ERR_INVALID_ARG_TYPE(e,"number",t)}function V(t,e,n){if(Math.floor(t)!==t)throw z(t,n),new Y.ERR_OUT_OF_RANGE(n||"offset","an integer",t);if(e<0)throw new Y.ERR_BUFFER_OUT_OF_BOUNDS;throw new Y.ERR_OUT_OF_RANGE(n||"offset",`>= ${n?1:0} and <= ${e}`,t)}F("ERR_BUFFER_OUT_OF_BOUNDS",(function(t){return t?`${t} is outside of buffer bounds`:"Attempt to access memory outside buffer bounds"}),RangeError),F("ERR_INVALID_ARG_TYPE",(function(t,e){return`The "${t}" argument must be of type number. Received type ${typeof e}`}),TypeError),F("ERR_OUT_OF_RANGE",(function(t,e,n){let r=`The value of "${t}" is out of range.`,o=n;return Number.isInteger(n)&&Math.abs(n)>2**32?o=q(String(n)):"bigint"==typeof n&&(o=String(n),(n>BigInt(2)**BigInt(32)||n<-(BigInt(2)**BigInt(32)))&&(o=q(o)),o+="n"),r+=` It must be ${e}. Received ${o}`,r}),RangeError);const j=/[^+/0-9A-Za-z-_]/g;function $(t,e){let n;e=e||1/0;const r=t.length;let o=null;const i=[];for(let s=0;s55295&&n<57344){if(!o){if(n>56319){(e-=3)>-1&&i.push(239,191,189);continue}if(s+1===r){(e-=3)>-1&&i.push(239,191,189);continue}o=n;continue}if(n<56320){(e-=3)>-1&&i.push(239,191,189),o=n;continue}n=65536+(o-55296<<10|n-56320)}else o&&(e-=3)>-1&&i.push(239,191,189);if(o=null,n<128){if((e-=1)<0)break;i.push(n)}else if(n<2048){if((e-=2)<0)break;i.push(n>>6|192,63&n|128)}else if(n<65536){if((e-=3)<0)break;i.push(n>>12|224,n>>6&63|128,63&n|128)}else{if(!(n<1114112))throw new Error("Invalid code point");if((e-=4)<0)break;i.push(n>>18|240,n>>12&63|128,n>>6&63|128,63&n|128)}}return i}function J(t){return r.toByteArray(function(t){if((t=(t=t.split("=")[0]).trim().replace(j,"")).length<2)return"";for(;t.length%4!=0;)t+="=";return t}(t))}function H(t,e,n,r){let o;for(o=0;o=e.length||o>=t.length);++o)e[o+n]=t[o];return o}function W(t,e){return t instanceof e||null!=t&&null!=t.constructor&&null!=t.constructor.name&&t.constructor.name===e.name}function G(t){return t!=t}const K=function(){const t="0123456789abcdef",e=new Array(256);for(let n=0;n<16;++n){const r=16*n;for(let o=0;o<16;++o)e[r+o]=t[n]+t[o]}return e}();function Z(t){return"undefined"==typeof BigInt?Q:t}function Q(){throw new Error("BigInt not supported")}},722:t=>{t.exports={}},780:t=>{t.exports={nodeStrokeWidth:"0.8",directionArrowSize:"6",directionArrowWidth:"0.7",node:"fornac-node",directionArrow:"fornac-directionArrow",plot:"fornac-plot",selectedNode:"fornac-selectedNode",nodeLabel:"fornac-nodeLabel",link:"fornac-link",plotLabel:"fornac-plotLabel",transparent:"fornac-transparent",dragLine:"fornac-dragLine",mouseEventHelper:"fornac-mouseEventHelper"}},251:(t,e)=>{e.read=function(t,e,n,r,o){var i,s,a=8*o-r-1,u=(1<>1,c=-7,f=n?o-1:0,d=n?-1:1,h=t[e+f];for(f+=d,i=h&(1<<-c)-1,h>>=-c,c+=a;c>0;i=256*i+t[e+f],f+=d,c-=8);for(s=i&(1<<-c)-1,i>>=-c,c+=r;c>0;s=256*s+t[e+f],f+=d,c-=8);if(0===i)i=1-l;else{if(i===u)return s?NaN:1/0*(h?-1:1);s+=Math.pow(2,r),i-=l}return(h?-1:1)*s*Math.pow(2,i-r)},e.write=function(t,e,n,r,o,i){var s,a,u,l=8*i-o-1,c=(1<>1,d=23===o?Math.pow(2,-24)-Math.pow(2,-77):0,h=r?0:i-1,p=r?1:-1,g=e<0||0===e&&1/e<0?1:0;for(e=Math.abs(e),isNaN(e)||e===1/0?(a=isNaN(e)?1:0,s=c):(s=Math.floor(Math.log(e)/Math.LN2),e*(u=Math.pow(2,-s))<1&&(s--,u*=2),(e+=s+f>=1?d/u:d*Math.pow(2,1-f))*u>=2&&(s++,u/=2),s+f>=c?(a=0,s=c):s+f>=1?(a=(e*u-1)*Math.pow(2,o),s+=f):(a=e*Math.pow(2,f-1)*Math.pow(2,o),s=0));o>=8;t[n+h]=255&a,h+=p,a/=256,o-=8);for(s=s<0;t[n+h]=255&s,h+=p,s/=256,l-=8);t[n+h-p]|=128*g}},447:(t,e,n)=>{t.exports=n(845)},845:(t,e,n)=>{var r=n(287).hp,o=n(611),i=void 0!==r?t=>r.from(t).toString("base64"):t=>btoa(String.fromCharCode(...t)),s=void 0!==r?t=>r.from(t,"base64"):t=>Uint8Array.from(atob(t),(t=>t.charCodeAt(0)));e.encode=function(t){var e=o.parse(t);return i(e).replace(/\+/g,"-").replace(/\//g,"_").substring(0,22)},e.decode=function(t){var e=t.replace(/-/g,"+").replace(/_/g,"/")+"==";return o.stringify(s(e))},e.v4=function(){var t=o.v4(null,new Uint8Array(16));return i(t).replace(/\+/g,"-").replace(/\//g,"_").substring(0,22)},e.nice=function(){var t=o.v4(null,new Uint8Array(16));return t[0]=127&t[0],i(t).replace(/\+/g,"-").replace(/\//g,"_").substring(0,22)}},611:(t,e,n)=>{"use strict";var r;n.r(e),n.d(e,{NIL:()=>I,parse:()=>y,stringify:()=>c,v1:()=>g,v3:()=>L,v4:()=>N,v5:()=>M,validate:()=>a,version:()=>S});var o=new Uint8Array(16);function i(){if(!r&&!(r="undefined"!=typeof crypto&&crypto.getRandomValues&&crypto.getRandomValues.bind(crypto)||"undefined"!=typeof msCrypto&&"function"==typeof msCrypto.getRandomValues&&msCrypto.getRandomValues.bind(msCrypto)))throw new Error("crypto.getRandomValues() not supported. See https://github.com/uuidjs/uuid#getrandomvalues-not-supported");return r(o)}const s=/^(?:[0-9a-f]{8}-[0-9a-f]{4}-[1-5][0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}|00000000-0000-0000-0000-000000000000)$/i,a=function(t){return"string"==typeof t&&s.test(t)};for(var u=[],l=0;l<256;++l)u.push((l+256).toString(16).substr(1));const c=function(t){var e=arguments.length>1&&void 0!==arguments[1]?arguments[1]:0,n=(u[t[e+0]]+u[t[e+1]]+u[t[e+2]]+u[t[e+3]]+"-"+u[t[e+4]]+u[t[e+5]]+"-"+u[t[e+6]]+u[t[e+7]]+"-"+u[t[e+8]]+u[t[e+9]]+"-"+u[t[e+10]]+u[t[e+11]]+u[t[e+12]]+u[t[e+13]]+u[t[e+14]]+u[t[e+15]]).toLowerCase();if(!a(n))throw TypeError("Stringified UUID is invalid");return n};var f,d,h=0,p=0;const g=function(t,e,n){var r=e&&n||0,o=e||new Array(16),s=(t=t||{}).node||f,a=void 0!==t.clockseq?t.clockseq:d;if(null==s||null==a){var u=t.random||(t.rng||i)();null==s&&(s=f=[1|u[0],u[1],u[2],u[3],u[4],u[5]]),null==a&&(a=d=16383&(u[6]<<8|u[7]))}var l=void 0!==t.msecs?t.msecs:Date.now(),g=void 0!==t.nsecs?t.nsecs:p+1,y=l-h+(g-p)/1e4;if(y<0&&void 0===t.clockseq&&(a=a+1&16383),(y<0||l>h)&&void 0===t.nsecs&&(g=0),g>=1e4)throw new Error("uuid.v1(): Can't create more than 10M uuids/sec");h=l,p=g,d=a;var m=(1e4*(268435455&(l+=122192928e5))+g)%4294967296;o[r++]=m>>>24&255,o[r++]=m>>>16&255,o[r++]=m>>>8&255,o[r++]=255&m;var b=l/4294967296*1e4&268435455;o[r++]=b>>>8&255,o[r++]=255&b,o[r++]=b>>>24&15|16,o[r++]=b>>>16&255,o[r++]=a>>>8|128,o[r++]=255&a;for(var v=0;v<6;++v)o[r+v]=s[v];return e||c(o)},y=function(t){if(!a(t))throw TypeError("Invalid UUID");var e,n=new Uint8Array(16);return n[0]=(e=parseInt(t.slice(0,8),16))>>>24,n[1]=e>>>16&255,n[2]=e>>>8&255,n[3]=255&e,n[4]=(e=parseInt(t.slice(9,13),16))>>>8,n[5]=255&e,n[6]=(e=parseInt(t.slice(14,18),16))>>>8,n[7]=255&e,n[8]=(e=parseInt(t.slice(19,23),16))>>>8,n[9]=255&e,n[10]=(e=parseInt(t.slice(24,36),16))/1099511627776&255,n[11]=e/4294967296&255,n[12]=e>>>24&255,n[13]=e>>>16&255,n[14]=e>>>8&255,n[15]=255&e,n};function m(t,e,n){function r(t,r,o,i){if("string"==typeof t&&(t=function(t){t=unescape(encodeURIComponent(t));for(var e=[],n=0;n>>9<<4)+1}function v(t,e){var n=(65535&t)+(65535&e);return(t>>16)+(e>>16)+(n>>16)<<16|65535&n}function k(t,e,n,r,o,i){return v((s=v(v(e,t),v(r,i)))<<(a=o)|s>>>32-a,n);var s,a}function x(t,e,n,r,o,i,s){return k(e&n|~e&r,t,e,o,i,s)}function w(t,e,n,r,o,i,s){return k(e&r|n&~r,t,e,o,i,s)}function E(t,e,n,r,o,i,s){return k(e^n^r,t,e,o,i,s)}function A(t,e,n,r,o,i,s){return k(n^(e|~r),t,e,o,i,s)}const L=m("v3",48,(function(t){if("string"==typeof t){var e=unescape(encodeURIComponent(t));t=new Uint8Array(e.length);for(var n=0;n>5]>>>o%32&255,s=parseInt(r.charAt(i>>>4&15)+r.charAt(15&i),16);e.push(s)}return e}(function(t,e){t[e>>5]|=128<>5]|=(255&t[r/8])<>>32-e}const M=m("v5",80,(function(t){var e=[1518500249,1859775393,2400959708,3395469782],n=[1732584193,4023233417,2562383102,271733878,3285377520];if("string"==typeof t){var r=unescape(encodeURIComponent(t));t=[];for(var o=0;o>>0;v=b,b=m,m=_(y,30)>>>0,y=g,g=w}n[0]=n[0]+g>>>0,n[1]=n[1]+y>>>0,n[2]=n[2]+m>>>0,n[3]=n[3]+b>>>0,n[4]=n[4]+v>>>0}return[n[0]>>24&255,n[0]>>16&255,n[0]>>8&255,255&n[0],n[1]>>24&255,n[1]>>16&255,n[1]>>8&255,255&n[1],n[2]>>24&255,n[2]>>16&255,n[2]>>8&255,255&n[2],n[3]>>24&255,n[3]>>16&255,n[3]>>8&255,255&n[3],n[4]>>24&255,n[4]>>16&255,n[4]>>8&255,255&n[4]]})),I="00000000-0000-0000-0000-000000000000",S=function(t){if(!a(t))throw TypeError("Invalid UUID");return parseInt(t.substr(14,1),16)}},893:e=>{"use strict";e.exports=t}},n={};function o(t){var r=n[t];if(void 0!==r)return r.exports;var i=n[t]={exports:{}};return e[t](i,i.exports,o),i.exports}o.n=t=>{var e=t&&t.__esModule?()=>t.default:()=>t;return o.d(e,{a:e}),e},o.d=(t,e)=>{for(var n in e)o.o(e,n)&&!o.o(t,n)&&Object.defineProperty(t,n,{enumerable:!0,get:e[n]})},o.g=function(){if("object"==typeof globalThis)return globalThis;try{return this||new Function("return this")()}catch(t){if("object"==typeof window)return window}}(),o.o=(t,e)=>Object.prototype.hasOwnProperty.call(t,e),o.r=t=>{"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(t,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(t,"__esModule",{value:!0})},(()=>{var t;o.g.importScripts&&(t=o.g.location+"");var e=o.g.document;if(!t&&e&&(e.currentScript&&(t=e.currentScript.src),!t)){var n=e.getElementsByTagName("script");if(n.length)for(var r=n.length-1;r>-1&&(!t||!/^http(s?):/.test(t));)t=n[r--].src}if(!t)throw new Error("Automatic publicPath is not supported in this browser");t=t.replace(/#.*$/,"").replace(/\?.*$/,"").replace(/\/[^\/]+$/,"/"),o.p=t})();var i={};return(()=>{"use strict";o.r(i),o.d(i,{ColorScheme:()=>h,FornaContainer:()=>L,RNAUtilities:()=>f,rnaPlot:()=>N,rnaTreemap:()=>T});var t=o(780),e=o.n(t),n=o(893),s=o.n(n),a=o(447);o(722);const u=o.p+"02188894d5236b1517df3210b79c2a7f.svg";function l(t,e){var n,r,o=!1,i=a.nice(),c=null,f="right",d=null,h=null;return"function"==typeof e?n=e:(n=(e=e||{}).onOpen,r=e.onClose),"rootElement"in e&&(c=e.rootElement),"pos"in e&&(d=e.pos),"orientation"in e&&(f=e.orientation),"parentStart"in e&&(h=e.parentStart),s().selectAll(".d3-context-menu-"+i).data([1]).enter().append("div").classed("d3-context-menu",!0).classed("d3-context-menu-"+i,!0),s().select("body").on("click.d3-context-menu-"+i,(function(){o?o=!1:(console.log("body click close"),s().select(".d3-context-menu-"+i).style("display","none"),f="right",r&&r())})),function(e,a){var p,g=arguments.length>2&&void 0!==arguments[2]&&arguments[2],y=this,m=this;p=null==c?s().mouse(this):s().mouse(c);var b=null;o=g,s().selectAll(".d3-context-menu-"+i).html("");var v=s().selectAll(".d3-context-menu-"+i).on("contextmenu",(function(t){console.log("context-menu close"),s().select(".d3-context-menu-"+i).style("display","none"),f="right",s().event.preventDefault(),s().event.stopPropagation()})).append("ul");if(v.selectAll("li").data("function"==typeof t?t(e):t).enter().append("li").attr("class",(function(t){console.log("d:",t);var e="";return t.divider&&(e+=" is-divider"),t.disabled&&(e+=" is-disabled"),t.action||(e+=" is-header"),"children"in t&&(e+=" d3-context-menu-recursive"),e})).html((function(t){return t.divider?"
":(t.title||console.error("No title attribute set. Check the spelling of your options."),"string"==typeof t.title?t.title:t.title(e))})).on("click",(function(t,n){t.disabled||t.action&&(t.action(y,e,a,p),console.log("click close"),s().selectAll(".d3-context-menu").style("display","none"),f="right",r&&r())})).on("mouseenter",(function(t,n){if(s().select(this).classed("d3-context-menu-selected",!0),null!=b){if(s().select(".d3-context-menu-"+i).selectAll("li").classed("d3-context-menu-selected",!1),void 0===t.children)return console.log("no children close"),s().select(".d3-context-menu-"+b).style("display","none"),void(b=null);if(t.childUid==b)return;console.log("open different child menu close"),s().select(".d3-context-menu-"+b).style("display","none"),b=null}if(void 0!==t.children){var r=this.getBoundingClientRect(),o=null;o=l(t.children,"left"==f?{rootElement:m,pos:[r.left+window.pageXOffset,r.top-2+window.pageYOffset],orientation:"left"}:{pos:[r.left+r.width+window.pageXOffset,r.top-2+window.pageYOffset],rootElement:m,parentStart:[r.left+window.pageXOffset,r.top-2+window.pageYOffset]}),t.childUid=o.apply(this,[e,n,!0,function(){}]),b=t.childUid}s().select(this).classed("d3-context-menu-selected",!0)})).on("mouseleave",(function(t,e){null==b&&s().select(this).classed("d3-context-menu-selected",!1)})),v.selectAll(".d3-context-menu-recursive").append("img").attr("src",u).attr("width","14px").attr("height","14px").style("position","absolute").style("right","5px"),n&&!1===n(e,a))return i;var k=s().select(".d3-context-menu-"+i).style("display","block");null==d?s().select(".d3-context-menu-"+i).style("left",s().event.pageX-2+"px").style("top",s().event.pageY-2+"px"):s().select(".d3-context-menu-"+i).style("left",d[0]+"px").style("top",d[1]+"px");var x=k.node().getBoundingClientRect();return(x.left+x.width>window.innerWidth||"left"==f)&&(f="left",null==d?s().select(".d3-context-menu-"+i).style("left",s().event.pageX-2-x.width+"px").style("top",s().event.pageY-2+"px"):null!=h?s().select(".d3-context-menu-"+i).style("left",h[0]-x.width+"px").style("top",h[1]+"px"):s().select(".d3-context-menu-"+i).style("left",d[0]-x.width+"px").style("top",d[1]+"px")),o||(s().event.preventDefault(),s().event.stopPropagation()),i}}var c=function(t,e){return t-e};function f(){var t=this;t.bracketLeft="([{abcdefghijklmnopqrstuvwxyz".split(""),t.inverseBrackets=function(t){for(var e={},n=0;n0;r--)for(o=r+0+1;o<=e;o++){i=n[r][o-1];for(var s=o-0-1;s>=r;s--)t[s]===o&&(i=Math.max(i,(s>r?n[r][s-1]:0)+1+(o-s-1>0?n[s+1][o-1]:0)));n[r][o]=i}return i=n[1][e],n},t.backtrackMaximumMatching=function(e,n){var r=Array.apply(null,Array(e.length)).map((function(){return 0}));return t.mmBt(e,r,n,1,e.length-1),r},t.mmBt=function(e,n,r,o,i){var s=e[o][i];if(!(i-o-1<0))if(e[o][i-1]!=s){for(var a=i-0-1;a>=o;a--)if(r[i]===a&&(a>o?e[o][a-1]:0)+(i-a-1>0?e[a+1][i-1]:0)+1==s)return n[a]=i,n[i]=a,o0)throw"Unmatched base at position "+r[c][0];return n},t.insertIntoStack=function(t,e,n){for(var r=0;t[r].length>0&&t[r][t[r].length-1]r?i+=t.bracketLeft[t.insertIntoStack(n,r,e[r])]:i+=t.bracketRight[t.deleteFromStack(n,r)]}return i},t.findUnmatched=function(e,n,r){for(var o=[],i=[],s=n,a=r,u=n;u<=r;u++)0!==e[u]&&(e[u]r)&&i.push([u,e[u]]);for(u=s;u<=a;u++){for(;0===e[u]&&u<=a;)u++;for(r=e[u];e[u]===r;)u++,r--;o=o.concat(t.findUnmatched(e,u,r))}return i.length>0&&o.push(i),o},t.removePseudoknotsFromPairtable=function(e){for(var n=t.maximumMatching(e),r=t.backtrackMaximumMatching(n,e),o=[],i=1;io)return[];for(;0===e[r];r++)a.push(r);for(;0===e[o];o--)u.push(o);if(r>o){if(a.push(r),0===n)return[["e",n,a.sort(c)]];for(var l=!1,f=[],d=[],h=0;h=0&&(l=!0);return[["h",n,a.sort(c)]]}if(e[r]!=o){var p=a;for(h=r,p.push(h);h<=o;){for(s=s.concat(t.ptToElements(e,n,h,e[h],i)),p.push(e[h]),h=e[h]+1;0===e[h]&&h<=o;h++)p.push(h);p.push(h)}return p.pop(),(p=p.concat(u)).length>0&&(0===n?s.push(["e",n,p.sort(c)]):s.push(["m",n,p.sort(c)])),s}e[r]===o&&(a.push(r),u.push(o),a.concat(u).length>4&&(0===n?s.push(["e",n,a.concat(u).sort(c)]):s.push(["i",n,a.concat(u).sort(c)])));for(var g=[];e[r]===o&&r"!=n[a][0])for(var u=n[a].trim().split(/[\s]+/),l=0;lo&&(o=t));for(i in e.colorsJson.colorValues[n])"number"==typeof(t=e.colorsJson.colorValues[n][i])&&(e.colorsJson.colorValues[n][i]=(t-r)/(o-r))}return e},e.parseColorText(e.colorsText),e}var p=function(t,e){return t-e};function g(){var t=arguments.length>0&&void 0!==arguments[0]?arguments[0]:"",e=arguments.length>1&&void 0!==arguments[1]?arguments[1]:"",n=arguments.length>2&&void 0!==arguments[2]?arguments[2]:"",r=arguments.length>3&&void 0!==arguments[3]?arguments[3]:1,o=this;o.type="rna",o.circularizeExternal=!1,o.seq=t,o.dotbracket=e,o.structName=n,o.circular=!1,"*"==o.dotbracket.slice(-1)&&(o.dotbracket=o.dotbracket.slice(0,-1),o.circular=!0),o.uid=a.nice(),o.elements=[],o.pseudoknotPairs=[],o.nucsToNodes={},o.addUids=function(t){for(var e=o.nodes.filter((function(t){return"nucleotide"==t.nodeType})),n=0;n=4})),n=0;no.dotbracket.length)){o.links.push({source:o.nodes[t[f]-1],target:o.nodes[o.nodes.length-1],linkType:"fake",value:n,uid:a.nice()}),t.length>4&&o.links.push({source:o.nodes[t[f]-1],target:o.nodes[t[(f+Math.floor(t.length/2))%t.length]-1],linkType:"fake",value:2*n,uid:a.nice()});var d=3.14159*(t.length-2)/t.length,h=2*Math.cos(1.570795-d/2);o.links.push({source:o.nodes[t[f]-1],target:o.nodes[t[(f+2)%t.length]-1],linkType:"fake",value:h});var p=o.nodes[t[f]-1];"x"in p&&(u+=p.x,l+=p.y,c+=1)}return c>0&&(s.x=u/c,s.y=l/c,s.px=s.x,s.py=s.y),o},o.connectFakeNodes=function(){for(var t={},e=o.nodes.filter((function(t){return"middle"==t.nodeType})),n={},r=1;r<=o.nodes.length;r++)t[r]=[];for(r=0;r1&&(o.links.push({source:o.nodes[f-2],target:o.nodes[f-1],linkType:"backbone",value:1,uid:a.nice()}),o.nodes[f-1].linked=!0);for(var d=0;dr)return[];for(;0===t[n];n++)s.push(n);for(;0===t[r];r--)a.push(r);if(n>r)return s.push(n),[["e",e,s.sort(p)]];if(t[n]!=r){var u=s,l=n;for(u.push(l);l<=r;){for(i=i.concat(o.ptToElements(t,e,l,t[l])),u.push(t[l]),l=t[l]+1;0===t[l]&&l<=r;l++)u.push(l);u.push(l)}return u.pop(),(u=u.concat(a)).length>0&&(0===e?i.push(["e",e,u.sort(p)]):i.push(["m",e,u.sort(p)])),i}t[n]===r&&(s.push(n),a.push(r),s.concat(a).length>4&&(0===e?i.push(["e",e,s.concat(a).sort(p)]):i.push(["i",e,s.concat(a).sort(p)])));for(var c=[];t[n]===r&&n0&&void 0!==arguments[0]?arguments[0]:1,e=arguments.length>1&&void 0!==arguments[1]?arguments[1]:10;if(0===e)return o;for(var n=1;n<=o.rnaLength;n++)if(n%e==0){var r,i,s=o.nodes[n-1],u=void 0,l=void 0,c=void 0,f=void 0;1==o.rnaLength?(f=[s.x-15,s.y],c=[s.x-15,s.y]):(u=1==n?o.nodes[o.rnaLength-1]:o.nodes[n-2],l=n==o.rnaLength?o.nodes[0]:o.nodes[n],0!==o.pairtable[l.num-t+1]&&0!==o.pairtable[u.num-t+1]&&0!==o.pairtable[s.num-t+1]&&(u=l=o.nodes[o.pairtable[s.num-t+1]-1]),0===o.pairtable[s.num-t+1]||0!==o.pairtable[l.num-t+1]&&0!==o.pairtable[u.num-t+1]?(f=[l.x-s.x,l.y-s.y],c=[u.x-s.x,u.y-s.y]):(f=[s.x-l.x,s.y-l.y],c=[s.x-u.x,s.y-u.y]));var d=[f[0]+c[0],f[1]+c[1]],h=Math.sqrt(d[0]*d[0]+d[1]*d[1]),p=[d[0]/h,d[1]/h],g=[-15*p[0],-15*p[1]];r=o.nodes[n-1].x+g[0],i=o.nodes[n-1].y+g[1];var y={name:n+t-1,num:-1,radius:6,rna:o,nodeType:"label",structName:o.structName,elemType:"l",x:r,y:i,px:r,py:i,uid:a.nice()},m={source:o.nodes[n-1],target:y,value:1,linkType:"label_link",uid:a.nice()};o.nodes.push(y),o.links.push(m)}return o},o.recalculateElements=function(){if(o.removePseudoknots(),o.elements=o.ptToElements(o.pairtable,0,1,o.dotbracket.length),o.circular){var t=o.elements.filter((function(t){if("e"==t[0])return!0}));if(t.length>0){eloop=t[0],nucs=eloop[2].sort(p),prev=nucs[0],hloop=!0,numGreater=0;for(var e=1;e1&&(numGreater+=1),prev=nucs[e];1==numGreater?eloop[0]="h":2==numGreater?eloop[0]="i":eloop[0]="m"}}return o},o.reassignLinkUids=function(){for(var t=0;t1&&(o.pseudoknotPairs=o.pseudoknotPairs.concat(d.removePseudoknotsFromPairtable(o.pairtable))),o},o.addPseudoknots=function(){for(var t=o.pairtable,e=o.pseudoknotPairs,n=0;n0&&o.recalculateElements(),o.getNodeFromNucleotides=function(t){if("[object Array]"===Object.prototype.toString.call(t)){for(var e=0;ed);if(y=m-2,m>=2&&(s[p+1+y]+=f,s[g-1-y]+=f,s[p]+=f,s[g]+=f,m>2))for(;y>=1;y--)s[p+y]=Math.PI,s[g-y]=Math.PI;u[++c]=m,d<=h&&t(d,h,r)}else e++,w++,A++;for(x=Math.PI*(w-2)/w,L[++E]=n,b=o<0?0:o,v=1;v<=E;v++){for(k=L[v]-b,y=0;y<=k;y++)s[b+y]+=x;if(v>E)break;b=L[++v]}a[++l]=A}(0,n+1,t),a[l]-=2,r=0,o[0]=100,i[0]=100;var d=[];for(d.push([o[0],i[0]]),e=1;e=0&&(1==++e||n>r)&&(n=r);return t.setMark(!1),n+1}function L(t){var n=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{},o=this;o.options=Object.assign({editable:!1,zoomable:!0,animation:!0,displayAllLinks:!1,labelInterval:10,chargeDistance:110,friction:.35,middleCharge:-30,otherCharge:-30,linkDistanceMultiplier:15,initialSize:null,layout:"standard-polygonal",transitionDuration:500,maxNodeRadius:80},n),null!==o.options.initialSize?(o.options.svgW=o.options.initialSize[0],o.options.svgH=o.options.initialSize[1]):(o.options.svgW=300,o.options.svgH=300),o.linkStrengths={pseudoknot:0,proteinChain:0,chainChain:0,intermolecule:10,external:0,other:10},o.displayParameters={displayNumbering:!0,displayNodeOutline:!0,displayNodeLabel:!0,displayLinks:!0,displayPseudoknotLinks:!0,displayProteinLinks:!0,displayDirectionArrows:!0},o.colorScheme="structure",o.customColors={},o.rnas={},o.extraLinks=[];var i=null,u=null,c=!1,f=function(){i=null,u=null},p=o.graph={nodes:[],links:[]};if(Array.prototype.equals=function(t){if(!t)return!1;if(this.length!=t.length)return!1;for(var e=0,n=this.length;e1&&void 0!==arguments[1]?arguments[1]:{},n={sequence:"",name:"empty",positions:[],labelInterval:o.options.labelInterval,avoidOthers:!0,uids:[],circularizeExternal:!0},r=new g((n=Object.assign(n,e)).sequence,t,n.name);r.circularizeExternal=n.circularizeExternal;var i=r.recalculateElements();if(0===n.positions.length)if("naview"==o.options.layout){var s=(new w).naview_xy_coordinates(r.pairtable);n.positions=[];for(var a=0;ar||ui||l0&&void 0!==arguments[0]?arguments[0]:0,e=function(){if(0===o.graph.nodes.length)return{translate:[0,0],scale:1};var t=s().min(o.graph.nodes.map((function(t){return t.x}))),e=s().min(o.graph.nodes.map((function(t){return t.y}))),n=s().max(o.graph.nodes.map((function(t){return t.x}))),r=s().max(o.graph.nodes.map((function(t){return t.y}))),i=s().max(o.graph.nodes.map((function(t){return t.radius}))),a=n-t,u=r-e,l=o.options.svgW/(a+1),c=o.options.svgH/(u+1),f=.8*Math.min(l,c,o.options.maxNodeRadius/i),d=a*f,h=u*f;return{translate:[-t*f+(o.options.svgW-d)/2,-e*f+(o.options.svgH-h)/2],scale:f}}();null!==e&&(A.transition().attr("transform","translate("+e.translate+") scale("+e.scale+")").duration(t),o.zoomer.translate(e.translate),o.zoomer.scale(e.scale))},o.setSize=function(){var e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:s().select(t).node().offsetWidth,n=arguments.length>1&&void 0!==arguments[1]?arguments[1]:s().select(t).node().offsetHeight;o.options.svgW=e,o.options.svgH=n,x.attr("viewBox","0 0 "+e+" "+n),_.range([0,e]).domain([0,e]),M.range([0,n]).domain([0,n]),o.zoomer.x(_).y(M),o.brusher.x(_).y(M),x.select(".background").attr("width",e).attr("height",n),o.centerView()},o.setOutlineColor=function(t){N.selectAll("g.gnode").select("[node_type=nucleotide]").style("fill",t)},o.addCustomColors=function(t){o.customColors=t,o.changeColorScheme("custom")},o.addCustomColorsText=function(t){var e=new h(t);o.customColors=e.colorsJson,o.changeColorScheme("custom")},o.changeColorScheme=function(t){N.selectAll("[node_type=protein]").classed(e().node,!0).attr("r",(function(t){return t.radius})),N.selectAll("g.gnode"),N.selectAll("g.gnode").selectAll("circle");var n=N.selectAll("g.gnode").select("[node_type=nucleotide]");if(o.colorScheme=t,"sequence"==t){var r=s().scale.ordinal().range(["#dbdb8d","#98df8a","#ff9896","#aec7e8","#aec7e8"]).domain(["A","C","G","U","T"]);n.style("fill",(function(t){return r(t.name)}))}else if("structure"==t)r=s().scale.category10().domain(["s","m","i","e","t","h","x"]).range(["lightgreen","#ff9896","#dbdb8d","lightsalmon","lightcyan","lightblue","transparent"]),n.style("fill",(function(t){return r(t.elemType)}));else if("positions"==t)n.style("fill",(function(t){return s().scale.linear().range(["#98df8a","#dbdb8d","#ff9896"]).interpolate(s().interpolateLab).domain([1,1+(t.rna.rnaLength-1)/2,t.rna.rnaLength])(t.num)}));else if("custom"==t){void 0!==o.customColors&&"domain"in o.customColors&&"range"in o.customColors&&(r=s().scale.linear().interpolate(s().interpolateLab).domain(o.customColors.domain).range(o.customColors.range));var i=function(t,e,n){if(t.hasOwnProperty(e.num)){var r=parseFloat(t[e.num]);return isNaN(r)?t[e.num]:n(r)}return"white"};n.style("fill",(function(t){if(void 0===o.customColors||!o.customColors.hasOwnProperty("colorValues"))return"white";if(o.customColors.colorValues.hasOwnProperty(t.structName)&&o.customColors.colorValues[t.structName].hasOwnProperty(t.num)){var e=o.customColors.colorValues[t.structName];return i(e,t,r)}if(o.customColors.colorValues.hasOwnProperty("")){var n=o.customColors.colorValues[""];return i(n,t,r)}return"white"}))}};var V=function(){N.selectAll("[node_type=label]").classed(e().transparent,!o.displayParameters.displayNumbering),N.selectAll("[label_type=label]").classed(e().transparent,!o.displayParameters.displayNumbering),L.selectAll("[link_type=label_link]").classed(e().transparent,!o.displayParameters.displayNumbering),x.selectAll("[node_type=nucleotide]").classed(e().transparent,!o.displayParameters.displayNodeOutline),N.selectAll("[label_type=nucleotide]").classed(e().transparent,!o.displayParameters.displayNodeLabel),x.selectAll("[link_type=real],[link_type=basepair],[link_type=backbone],[link_type=pseudoknot],[link_type=protein_chain],[link_type=chain_chain],[link_type=external]").classed(e().transparent,!o.displayParameters.displayLinks),x.selectAll("[link_type=pseudoknot]").classed(e().transparent,!o.displayParameters.displayPseudoknotLinks),x.selectAll("[link_type=protein_chain]").classed(e().transparent,!o.displayParameters.displayProteinLinks),L.selectAll("[link_type=fake]").classed(e().transparent,!o.options.displayAllLinks),L.selectAll("[link_type=fake_fake]").classed(e().transparent,!o.options.displayAllLinks),x.selectAll("."+e().directionArrow).classed(e().transparent,!o.displayParameters.displayDirectionArrows)},j=function(t,e){var n=e.rna,r=d.pairtableToDotbracket(n.pairtable),i=n.getPositions("nucleotide"),s=n.seq,u=n.getUids(),l=e.num,c=r,f=s.slice(0,l-1)+t+s.slice(l);console.log("newSequence:",f),console.log("uids:",u),u.splice(l-1,1,a.nice());var h=i;delete o.rnas[n.uid],o.addRNA(c,{sequence:f,positions:h,uids:u,centerView:!1})},$=function(t,e,n){var r=e.rna,i=d.pairtableToDotbracket(r.pairtable),s=r.getPositions("nucleotide"),u=r.seq,l=r.getUids(),c=e.num+n,f=i.slice(0,c)+"."+i.slice(c),h=u.slice(0,c)+t+u.slice(c);console.log("newSequence:",h),l.splice(c,0,a.nice()),s.splice(c,0,s[c-n-1]);var p=l,g=s;console.log("positions:",s),console.log("new node positions:",g),delete o.rnas[r.uid],o.addRNA(f,{sequence:h,positions:g,uids:p,centerView:!1})},J=function(t){console.log("deleting...",t);var e=t.rna,n=e.pairtable[t.num];0!=n&&(e.pairtable[t.num]=0,e.pairtable[n]=0);var r=d.pairtableToDotbracket(e.pairtable),i=e.getPositions("nucleotide"),s=e.seq,a=e.getUids(),u=r.slice(0,t.num-1)+r.slice(t.num),l=i.slice(0,t.num-1).concat(i.slice(t.num)),c=s.slice(0,t.num-1)+s.slice(t.num),f=a.slice(0,t.num-1).concat(a.slice(t.num));delete o.rnas[e.uid],o.addRNA(u,{sequence:c,positions:l,uids:f,centerView:!1}),console.log("new dotbracket:",u)},H=function(t){return t.uid},W=function(t){var e=t.getPositions("nucleotide"),n=t.getPositions("label"),r=t.getUids();t.recalculateElements().elementsToJson().addPseudoknots().addPositions("nucleotide",e).addUids(r).addLabels(1,o.options.labelInterval).addPositions("label",n).reinforceStems().reinforceLoops().updateLinkUids()},G=function(t,n){console.log("nodeMouseup");var r=!0;if(i){if("middle"==(u=t).nodeType||"middle"==i.nodeType||"label"==u.nodeType||"label"==i.nodeType)return;if(u==i)return void f();for(var s={source:i,target:u,linkType:"basepair",value:1,uid:a.nice()},h=0;h-1){if(t.source.rna==t.target.rna){if("backbone"==t.linkType)return console.log("trying to remove a backbone link",t.source.num,t.target.num),void function(t){if(t.target.num-t.source.num==1){for(var e=t.target.rna,n=[],r=0;r=t.target.num&&(console.log("crossing basepair",i),n.push(i))}console.log("toRemove:",n);for(var s=0;s1&&void 0!==arguments[1]?arguments[1]:{},n=X(t,e);if("extraLinks"in e){var r=o.addExternalLinks(n,e.extraLinks);o.extraLinks=o.extraLinks.concat(r)}return"centerPos"in e?o.addRNAJSON(n,{centerPos:e.centerPos,centerView:!1}):"avoidOthers"in e?o.addRNAJSON(n,{avoidOthers:e.avoidOthers}):o.addRNAJSON(n,{centerView:e.centerView}),console.log("structure:",t),-1!==t.indexOf("&")&&"&"!=t&&0!==t.indexOf("&")?(console.log("splitting multistrand"),void function(t){for(var e=[],n=0;n=i.target.num){console.log("crossing basepair",s),s.breakFrom=0;for(var a=0;ae[a]&&s.source.num0&&(s.from-=e[s.breakFrom-1]+s.breakFrom),s.to=s.target.num-i.target.num,r.push(s)}},l=0;l0&&t.nodes.forEach((function(t){t.x=t.x+l[0]-d/p,t.y=t.y+l[1]-h/p,t.px=t.x,t.py=t.y}))}return a&&(n=o.graph.nodes.length>0?s().max(o.graph.nodes.map((function(t){return t.x}))):0,r=s().min(t.nodes.map((function(t){return t.x}))),t.nodes.forEach((function(t){t.x+=n-r+20,t.px+=n-r}))),t.nodes.forEach((function(e){e.rna=t})),o.rnas[t.uid]=t,z(),o.update(),f&&o.centerView(),t},o.addNodes=function(t){t.links.forEach((function(e){"number"==typeof e.source&&(e.source=t.nodes[e.source]),"number"==typeof e.target&&(e.target=t.nodes[e.target])})),o.graph.nodes.length>0?(maxX=s().max(o.graph.nodes.map((function(t){return t.x}))),maxY=s().max(o.graph.nodes.map((function(t){return t.y})))):(maxX=0,maxY=0),t.nodes.forEach((function(t){t.rna.uid in o.rnas||(o.rnas[t.rna.uid]=t.rna),t.x+=maxX,t.px+=maxX})),r=new g("",""),r.nodes=t.nodes,r.links=t.links,z(),o.update(),o.centerView()},o.clearNodes=function(){o.graph.nodes=[],o.graph.links=[],o.rnas={},o.extraLinks=[],o.update()},o.addLink=function(t){if(console.log("adding new link"),t.source.rna==t.target.rna){var e=t.source.rna;e.pairtable[t.source.num]=t.target.num,e.pairtable[t.target.num]=t.source.num,W(e)}else console.log("intermolecule"),t.linkType="intermolecule",o.extraLinks.push(t);z(),o.update()},o.addExternalLinks=function(t,e){for(var n=[],r=0;r0&&void 0!==arguments[0]?arguments[0]:{},o={width:300,height:300,nucleotideRadius:5,rnaEdgePadding:1,labelInterval:10,showNucleotideLabels:!0,startNucleotideNumber:1,bundleExternalLinks:!1,rnaLayout:"simple",namePosition:"0 0"};function i(r){r.each((function(r){var i=d3.select(this).append("g").classed(e().plot,!0),s=new g(r.sequence,r.structure,r.name,o.startNucleotideNumber).recalculateElements().elementsToJson().addName(r.name);r.rnaGraph=s;var a=[];if("naview"===o.rnaLayout)for(var u=(new w).naview_xy_coordinates(s.pairtable),l=0;ll-o.height?(a=c(t=d3.scale.linear().domain(i).range([0,o.width]),s,[0,o.height]),n=a.scale):(a=c(n=d3.scale.linear().domain(s).range([0,o.height]),i,[0,o.width]),t=a.scale),t.range()[0],t.domain()[0],n.range()[0],n.domain()[0],"translate("+-(t.domain()[0]*a.scaleFactor-t.range()[0])+","+-(n.domain()[0]*a.scaleFactor-n.range()[0])+")scale("+a.scaleFactor+")"}(s.nodes.map((function(t){return t.x})),s.nodes.map((function(t){return t.y})));i.attr("transform",c);var f=s.nodes.filter((function(t){return"nucleotide"==t.nodeType})),d=s.nodes.filter((function(t){return"label"==t.nodeType})),h=s.links;!function(t,n){n=n.filter((function(t){return null!==t.source&&null!==t.target})),t.selectAll(".link").data(n).enter().append("svg:line").attr("x1",(function(t){return t.source.x})).attr("x2",(function(t){return t.target.x})).attr("y1",(function(t){return t.source.y})).attr("y2",(function(t){return t.target.y})).attr("link-type",(function(t){return t.linkType})).attr("extra-link-type",(function(t){return t.extraLinkType})).classed("link",!0).classed(e().link,!0)}(i,h),function(t,n){var r=t.selectAll(".gnode").data(n).enter().append("svg:g").classed("gnode",!0).attr("transform",(function(t){return"translate("+t.x+","+t.y+")"}));r.append("svg:circle").classed(e().node,!0).attr("node_type","nucleotide").attr("base_type",(function(t){if(t.name)return t.name.toLowerCase()})).attr("r",o.nucleotideRadius),o.showNucleotideLabels&&r.append("svg:text").text((function(t){return t.name})).classed(e().nodeLabel,!0).append("svg:title").text((function(t){return t.struct_name+":"+t.num}))}(i,f),function(t,n){var r=t.selectAll().data(n).enter().append("svg:g").classed("gnode",!0).attr("transform",(function(t){return"translate("+t.x+","+t.y+")"}));r.append("svg:circle").classed(e().node,!0).attr("node_type","label").attr("r",o.nucleotideRadius),r.append("svg:text").classed(e().nodeLabel,!0).text((function(t){return t.name}))}(i,d),function(t,n){var r=t.append("svg:text").classed(e().plotLabel,!0).text(n),i=o.namePosition.split(" ",2),s=[],a=r.node().getBBox(),u=[a.width,a.height],l=[o.width,o.height];for(var c in[0,1])switch(i[c]){case"0":s[c]=u[c]/2;break;case"1":s[c]=l[c]-u[c]/2;break;case"0.5":s[c]=l[c]/2}r.attr("x",s[0]).attr("y",s[1])}(d3.select(this),r.name),o.bundleExternalLinks&&function(t,e){var n={},r=[];e=e.filter((function(t){return"correct"==t.linkType||"incorrect"==t.linkType||"extra"==t.linkType})),t.selectAll("[link-type=extra]").remove();for(var o=0;o0&&void 0!==arguments[0]?arguments[0]:{},e={width:300,height:300,nucleotideRadius:5,rnaEdgePadding:1,labelInterval:10,showNucleotideLabels:!0,startNucleotideNumber:1,bundleExternalLinks:!1,rnaLayout:"simple",namePosition:"0 0"};function n(t){t.each((function(t){d3.select(this).attr("transform",(function(t){return"translate("+t.x+","+t.y+")"})).append("rect").attr("fill","transparent").attr("width",(function(t){return Math.max(0,t.dx)})).attr("height",(function(t){return Math.max(0,t.dy)}));var n=N(e).width(Math.max(0,t.dx)).height(Math.max(0,t.dy));"structure"in t&&d3.select(this).call(n)}))}e=Object.assign(e,t);var r=function(t){t.each((function(t){console.log("data:",t);var r=d3.layout.treemap().size([e.width,e.height]).sticky(!1).value((function(t){return t.size}));d3.select(this).append("g").classed("rnatreemap",!0).datum(t).selectAll(".treemapnode").data(r.nodes).enter().append("g").classed("treemapnode",!0).call(n)}))};return r.width=function(t){return arguments.length?(e.width=t,r):e.width},r.height=function(t){return arguments.length?(e.height=t,r):e.height},r.showNucleotideLabels=function(t){return arguments.length?(e.showNucleotideLabels=t,r):e.showNucleotideLabels},r.rnaEdgePadding=function(t){return arguments.length?(e.rnaEdgePadding=t,r):e.rnaEdgePadding},r.nucleotideRadius=function(t){return arguments.length?(e.nucleotideRadius=t,r):e.nucleotideRadius},r.labelInterval=function(t){return arguments.length?(e.labelInterval=t,r):e.labelInterval},r.showNucleotideLabels=function(t){return arguments.length?(e.showNucleotideLabels=t,r):e.showNucleotideLabels},r.startNucleotideNumber=function(t){return arguments.length?(e.startNucleotideNumber=t,r):e.startNucleotideNumber},r.bundleExternalLinks=function(t){return arguments.length?(e.bundleExternalLinks=t,r):e.bundleExternalLinks},r.rnaLayout=function(t){return arguments.length?(e.rnaLayout=t,r):e.rnaLayout},r.namePosition=function(t){return arguments.length?(e.namePosition=t,r):e.namePosition},r.zoom=function(t){return arguments.length?(e.zoom=t,r):e.zoom},r}w.prototype.naview_xy_coordinates=function(t){var e,n=[],r=[];if(0===t.length||0===t[0])return 0;this.nbase=t[0],this.bases=[];for(var o=0;oe&&n++;0==n&&(this.bases[1].setMate(this.nbase),this.bases[this.nbase].setMate(1))},w.prototype.find_regions=function(){var t,e=null,n=null;t=this.nbase+1;var r=[];for(e=0;ethis.nbase&&(e=0)}while(e!=t);return r},w.prototype.find_central_loop=function(){var t=new x.F,e=null,n=null,r=null;for(E.bind(this)(),e=0,n=-1,r=0;re?(n=t.getDepth(),e=t.getNconnection(),this.root=t):t.getDepth()>n&&t.getNconnection()==e&&(n=t.getDepth(),this.root=t)},w.prototype.traverse_loop=function(t,e){var n,r,o,i,s,a,u,l,c,f,d,h,p,g,y,m,b,v,k,x,w,E,A,L,N,T,_,M,I,S,P,R,C,B,U,O,X,Y,F,q,D,z,V,j,$,J,H,W,G,K,Z,Q,tt,et,nt,rt,ot,it,st,at,ut,lt,ct,ft,dt,ht,pt,gt,yt,mt=0;a=2*Math.PI/(this.nbase+1),v=null,S=-1;var bt=0;for(A=0;null!=(m=t.getConnection(bt));bt++,A++)n=-Math.sin(a*m.getStart()),r=Math.cos(a*m.getStart()),o=-Math.sin(a*m.getEnd()),i=Math.cos(a*m.getEnd())-r,s=n-o,u=Math.sqrt(i*i+s*s),m.setXrad(i/u),m.setYrad(s/u),m.setAngle(Math.atan2(s,i)),m.getAngle()<0&&m.setAngle(m.getAngle()+2*Math.PI),null!=e&&e.getRegion()==m.getRegion()&&(v=m,S=A);t:for(;;){this.determine_radius(t,this.lencut),l=t.getRadius()/this.RADIUS_REDUCTION_FACTOR,null==e?c=f=0:(d=(this.bases[v.getStart()].getX()+this.bases[v.getEnd()].getX())/2,h=(this.bases[v.getStart()].getY()+this.bases[v.getEnd()].getY())/2,c=d-l*v.getXrad(),f=h-l*v.getYrad()),_=-1==S?0:S,m=t.getConnection(_),T=0,P=!1;do{if((w=_-1)<0&&(w=t.getNconnection()-1),k=t.getConnection(w),this.connected_connection(k,m)?(_=w,m=k):P=!0,++T>t.getNconnection()){for(N=-1,A=0;A=t.getNconnection()&&(w=0),m=t.getConnection(A),(dt=(b=t.getConnection(w)).getAngle()-m.getAngle())<0&&(dt+=2*Math.PI),dt>N&&(N=dt,mt=A);M=mt,(_=mt+1)>=t.getNconnection()&&(_=0),(m=t.getConnection(M)).setBroken(!0),P=!0}}while(!P);for(R=!1,J=_;!R;){for(T=0,P=!1,M=_,C=!1;!P;)if(m=t.getConnection(M),M==S&&(C=!0),(w=M+1)>=t.getNconnection()&&(w=0),b=t.getConnection(w),this.connected_connection(m,b)){if(++T>=t.getNconnection())break;M=w}else P=!0;for(A=H=W=I=this.find_ic_middle(_,M,e,v,t),P=!1,K=0;!P;)(A=K<0?H:0==K?I:W)>=0&&(m=t.getConnection(A),null!=e&&v==m||(0==K?(p=m.getAngle()-Math.asin(.5/l),g=m.getAngle()+Math.asin(.5/l),this.bases[m.getStart()].setX(c+l*Math.cos(p)),this.bases[m.getStart()].setY(f+l*Math.sin(p)),this.bases[m.getEnd()].setX(c+l*Math.cos(g)),this.bases[m.getEnd()].setY(f+l*Math.sin(g))):K<0?((w=A+1)>=t.getNconnection()&&(w=0),m=t.getConnection(A),b=t.getConnection(w),nt=m.getXrad(),rt=m.getYrad(),dt=(m.getAngle()+b.getAngle())/2,m.getAngle()>b.getAngle()&&(dt-=Math.PI),st=Math.cos(dt),lt=Math.sin(dt),ct=-st,(L=b.getAngle()-m.getAngle())<0&&(L+=2*Math.PI),ft=m.isExtruded()?L<=Math.PI/2?2:1.5:1,this.bases[m.getEnd()].setX(this.bases[b.getStart()].getX()+ft*lt),this.bases[m.getEnd()].setY(this.bases[b.getStart()].getY()+ft*ct),this.bases[m.getStart()].setX(this.bases[m.getEnd()].getX()+rt),this.bases[m.getStart()].setY(this.bases[m.getEnd()].getY()-nt)):((w=A-1)<0&&(w=t.getNconnection()-1),m=t.getConnection(w),ot=(b=t.getConnection(A)).getXrad(),it=b.getYrad(),dt=(m.getAngle()+b.getAngle())/2,m.getAngle()>b.getAngle()&&(dt-=Math.PI),st=Math.cos(dt),lt=-Math.sin(dt),ct=st,(L=b.getAngle()-m.getAngle())<0&&(L+=2*Math.PI),ft=m.isExtruded()?L<=Math.PI/2?2:1.5:1,this.bases[b.getStart()].setX(this.bases[m.getEnd()].getX()+ft*lt),this.bases[b.getStart()].setY(this.bases[m.getEnd()].getY()+ft*ct),this.bases[b.getEnd()].setX(this.bases[b.getStart()].getX()-it),this.bases[b.getEnd()].setY(this.bases[b.getStart()].getY()+ot)))),K<0?(W==M?W=-1:W>=0&&++W>=t.getNconnection()&&(W=0),K=1):(H==_?H=-1:H>=0&&--H<0&&(H=t.getNconnection()-1),K=-1),P=-1==H&&-1==W;if((G=M+1)>=t.getNconnection()&&(G=0),M!=_&&(_!=J||G!=J))if(m=t.getConnection(_),b=t.getConnection(M),Q=this.bases[b.getEnd()].getX()-this.bases[m.getStart()].getX(),tt=this.bases[b.getEnd()].getY()-this.bases[m.getStart()].getY(),U=this.bases[m.getStart()].getX()+Q/2,O=this.bases[m.getStart()].getY()+tt/2,F=Q/(et=Math.sqrt(Q*Q+tt*tt)),q=tt/et,D=c-U,z=f-O,X=(V=(D/=et=Math.sqrt(Q*Q+tt*tt))*F+(z/=et)*q)*F-D,Y=V*q-z,X/=et=Math.sqrt(X*X+Y*Y),Y/=et,Q=this.bases[m.getStart()].getX()-c,tt=this.bases[m.getStart()].getY()-f,(dt=Math.atan2(tt,Q))<0&&(dt+=2*Math.PI),Q=this.bases[b.getEnd()].getX()-c,tt=this.bases[b.getEnd()].getY()-f,(ht=Math.atan2(tt,Q))<0&&(ht+=2*Math.PI),htMath.PI?-1:1)*l*X,$=f+B*l*Y,C)c-=j-U,f-=$-O;else for(A=_;x=(m=t.getConnection(A)).getStart(),this.bases[x].setX(this.bases[x].getX()+j-U),this.bases[x].setY(this.bases[x].getY()+$-O),x=m.getEnd(),this.bases[x].setX(this.bases[x].getX()+j-U),this.bases[x].setY(this.bases[x].getY()+$-O),A!=M;)++A>=t.getNconnection()&&(A=0);R=(_=G)==J}for(A=0;A=t.getNconnection()&&(w=0),b=t.getConnection(w),Q=this.bases[m.getEnd()].getX()-c,tt=this.bases[m.getEnd()].getY()-f,ut=Math.sqrt(Q*Q+tt*tt),(dt=Math.atan2(tt,Q))<0&&(dt+=2*Math.PI),Q=this.bases[b.getStart()].getX()-c,tt=this.bases[b.getStart()].getY()-f,at=Math.sqrt(Q*Q+tt*tt),(ht=Math.atan2(tt,Q))<0&&(ht+=2*Math.PI),htMath.PI)if(m.isExtruded())console.log("Warning from traverse_loop. Loop "+t.getNumber()+" has crossed regions\n");else if(b.getStart()-m.getEnd()!=1){m.setExtruded(!0);continue t}if(m.isExtruded())this.construct_extruded_segment(m,b);else for((E=b.getStart()-m.getEnd())<0&&(E+=this.nbase+1),a=Z/E,w=1;wthis.nbase&&(x-=this.nbase+1),et=ut+(at-ut)*((y=dt+w*a)-dt)/Z,this.bases[x].setX(c+et*Math.cos(y)),this.bases[x].setY(f+et*Math.sin(y))}break}for(A=0;A=t.getNconnection()&&(w=0),m=t.getConnection(A),b=t.getConnection(w),E+=2,pt+=this.bases[m.getStart()].getX()+this.bases[m.getEnd()].getX(),gt+=this.bases[m.getStart()].getY()+this.bases[m.getEnd()].getY(),!m.isExtruded())for(w=m.getEnd()+1;w!=b.getStart();w++)w>this.nbase&&(w-=this.nbase+1),E++,pt+=this.bases[w].getX(),gt+=this.bases[w].getY();t.setX(pt/E),t.setY(gt/E)},w.prototype.determine_radius=function(t,e){var n,r,o,i,s,a,u,l,c,f,d,h=0,p=new b.Connection,g=new b.Connection,y=.7071068;do{for(n=1e10,s=0,i=0,l=0;l=t.getNconnection()&&(c=0),g=t.getConnection(c),f=p.getEnd(),(d=g.getStart())1&&(n=u,h=l);(a=i/s)0?a=t.getRadius():t.setRadius(a)},w.prototype.find_ic_middle=function(t,e,n,r,o){var i,s,a,u,l;for(i=0,s=-1,a=t,l=!1;!l;)i++>2*o.getNconnection()&&console.log("Infinite loop in 'find_ic_middle'"),null!=n&&o.getConnection(a)==r&&(s=a),l=a==e,++a>=o.getNconnection()&&(a=0);if(-1==s){for(u=1,a=t;u<(i+1)/2;u++)++a>=o.getNconnection()&&(a=0);s=a}return s},w.prototype.construct_extruded_segment=function(t,e){var n,r,o,i,s,a,u,l,c,f,d,h,p,g,y,m,b,v;if(n=t.getAngle(),(o=r=e.getAngle())=1.5&&d<=Math.PI/2&&((m=p+1)>this.nbase&&(m-=this.nbase+1),(b=g-1)<0&&(b+=this.nbase+1),this.bases[m].setX(this.bases[p].getX()+.5*s),this.bases[m].setY(this.bases[p].getY()+.5*a),this.bases[b].setX(this.bases[g].getX()-.5*s),this.bases[b].setY(this.bases[g].getY()-.5*a),p=m,g=b);do{v=!1,this.construct_circle_segment(p,g),(m=p+1)>this.nbase&&(m-=this.nbase+1),s=this.bases[m].getX()-this.bases[p].getX(),a=this.bases[m].getY()-this.bases[p].getY(),(u=Math.atan2(a,s))<0&&(u+=2*Math.PI),(h=u-n)<0&&(h+=2*Math.PI),h>Math.PI&&(v=!0),(b=g-1)<0&&(b+=this.nbase+1),s=this.bases[b].getX()-this.bases[g].getX(),a=this.bases[b].getY()-this.bases[g].getY(),(l=Math.atan2(a,s))<0&&(l+=2*Math.PI),(h=r-l)<0&&(h+=2*Math.PI),h>Math.PI&&(v=!0),v&&(c=this.minf2(i,n+.5),this.bases[m].setX(this.bases[p].getX()+Math.cos(c)),this.bases[m].setY(this.bases[p].getY()+Math.sin(c)),p=m,c=this.maxf2(i,o-.5),this.bases[b].setX(this.bases[g].getX()+Math.cos(c)),this.bases[b].setY(this.bases[g].getY()+Math.sin(c)),g=b,y-=2)}while(v&&y>1)}},w.prototype.construct_circle_segment=function(t,e){var n,r,o,i,s,a,u,l,c,f,d,h,p,g,y;if(n=this.bases[e].getX()-this.bases[t].getX(),r=this.bases[e].getY()-this.bases[t].getY(),o=Math.sqrt(n*n+r*r),(p=e-t)<0&&(p+=this.nbase+1),o>=p)for(n/=o,r/=o,g=1;gthis.nbase&&(y-=this.nbase+1),this.bases[y].setX(this.bases[t].getX()+n*g/p),this.bases[y].setY(this.bases[t].getY()+r*g/p);else for(this.find_center_for_arc(p-1,o),n/=o,r/=o,i=this.bases[t].getX()+n*o/2,s=this.bases[t].getY()+r*o/2,a=r,u=-n,l=i+this._h*a,c=s+this._h*u,f=this.bases[t].getX()-l,d=this.bases[t].getY()-c,o=Math.sqrt(f*f+d*d),h=Math.atan2(d,f),g=1;gthis.nbase&&(y-=this.nbase+1),this.bases[y].setX(l+o*Math.cos(h+g*this.angleinc)),this.bases[y].setY(c+o*Math.sin(h+g*this.angleinc))},w.prototype.find_center_for_arc=function(t,e){var n,r,o,i,s,a,u,l;o=-(r=(t+1)/Math.PI)-e/(t+1.000001-e),e<1&&(o=0),l=0;do{n=(r+o)/2,s=1-.5/((i=Math.sqrt(n*n+e*e/4))*i),Math.abs(s)>1&&console.log("Unexpected large magnitude discriminant = "+s+" "+i),(u=(a=Math.acos(s))*(t+1)+2*Math.acos(n/i)-2*Math.PI)>0?o=n:r=n}while(Math.abs(u)>1e-4&&++l=this.MAXITER&&(noIterationFailureYet&&(console.log("Iteration failed in find_center_for_arc"),noIterationFailureYet=!1),n=0,a=0),this._h=n,this.angleinc=a},w.prototype.generate_region=function(t){var e,n,r,o,i,s;for(s=t.getRegion(),e=0,t.getStart()==s.getStart1()?(n=s.getStart1(),r=s.getEnd1()):(n=s.getStart2(),r=s.getEnd2()),(this.bases[t.getStart()].getX()>this.ANUM-100||this.bases[t.getEnd()].getX()>this.ANUM-100)&&console.log("Bad region passed to generate_region. Coordinates not defined."),o=n+1;o<=r;o++)e++,this.bases[o].setX(this.bases[t.getStart()].getX()+this.HELIX_FACTOR*e*t.getXrad()),this.bases[o].setY(this.bases[t.getStart()].getY()+this.HELIX_FACTOR*e*t.getYrad()),i=this.bases[o].getMate(),this.bases[i].setX(this.bases[t.getEnd()].getX()+this.HELIX_FACTOR*e*t.getXrad()),this.bases[i].setY(this.bases[t.getEnd()].getY()+this.HELIX_FACTOR*e*t.getYrad())},w.prototype.minf2=function(t,e){return te?t:e},w.prototype.connected_connection=function(t,e){return!!t.isExtruded()||t.getEnd()+1==e.getStart()}})(),i})())); //# sourceMappingURL=fornac.js.map \ No newline at end of file diff --git a/dist/fornac.js.map b/dist/fornac.js.map index 4224636..37ffdbf 100644 --- a/dist/fornac.js.map +++ b/dist/fornac.js.map @@ -1 +1 @@ -{"version":3,"file":"fornac.js","mappings":"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","sources":["webpack://fornac/webpack/universalModuleDefinition","webpack://fornac/./src/naview/connection.js","webpack://fornac/./src/naview/loop.js","webpack://fornac/./src/naview/region.js","webpack://fornac/./node_modules/base64-js/index.js","webpack://fornac/./node_modules/buffer/index.js","webpack://fornac/./src/d3-context-menu.css?fe1f","webpack://fornac/./src/fornac.css?7f8e","webpack://fornac/./node_modules/ieee754/index.js","webpack://fornac/./node_modules/slugid/index.js","webpack://fornac/./node_modules/slugid/slugid.js","webpack://fornac/./node_modules/uuid/dist/esm-browser/rng.js","webpack://fornac/./node_modules/uuid/dist/esm-browser/regex.js","webpack://fornac/./node_modules/uuid/dist/esm-browser/validate.js","webpack://fornac/./node_modules/uuid/dist/esm-browser/stringify.js","webpack://fornac/./node_modules/uuid/dist/esm-browser/v1.js","webpack://fornac/./node_modules/uuid/dist/esm-browser/parse.js","webpack://fornac/./node_modules/uuid/dist/esm-browser/v35.js","webpack://fornac/./node_modules/uuid/dist/esm-browser/md5.js","webpack://fornac/./node_modules/uuid/dist/esm-browser/v3.js","webpack://fornac/./node_modules/uuid/dist/esm-browser/v4.js","webpack://fornac/./node_modules/uuid/dist/esm-browser/sha1.js","webpack://fornac/./node_modules/uuid/dist/esm-browser/v5.js","webpack://fornac/./node_modules/uuid/dist/esm-browser/nil.js","webpack://fornac/./node_modules/uuid/dist/esm-browser/version.js","webpack://fornac/external umd \"d3\"","webpack://fornac/webpack/bootstrap","webpack://fornac/webpack/runtime/compat get default export","webpack://fornac/webpack/runtime/define property getters","webpack://fornac/webpack/runtime/global","webpack://fornac/webpack/runtime/hasOwnProperty shorthand","webpack://fornac/webpack/runtime/make namespace object","webpack://fornac/webpack/runtime/publicPath","webpack://fornac/./src/img/play.svg","webpack://fornac/./src/d3-context-menu.js","webpack://fornac/./src/rnautils.js","webpack://fornac/./src/rnagraph.js","webpack://fornac/./src/simplernaplot.js","webpack://fornac/./src/naview/radloop.js","webpack://fornac/./src/naview/base.js","webpack://fornac/./src/naview/naview.js","webpack://fornac/./src/fornac.js","webpack://fornac/./src/rnaplot.js","webpack://fornac/./src/rnatreemap.js"],"sourcesContent":["(function webpackUniversalModuleDefinition(root, factory) {\n\tif(typeof exports === 'object' && typeof module === 'object')\n\t\tmodule.exports = factory(require(\"d3\"));\n\telse if(typeof define === 'function' && define.amd)\n\t\tdefine([\"d3\"], factory);\n\telse if(typeof exports === 'object')\n\t\texports[\"fornac\"] = factory(require(\"d3\"));\n\telse\n\t\troot[\"fornac\"] = factory(root[\"d3\"]);\n})(self, (__WEBPACK_EXTERNAL_MODULE__893__) => {\nreturn ","import {Loop} from './loop.js';\nimport {Region} from './region.js';\n\nexport function Connection() {\n\tthis.loop = new Loop();\n\tthis.region = new Region();\n\t// Start and end form the 1st base pair of the region.\n\tthis.start = null;\n this.end = null;\n\tthis.xrad = null;\n this.yrad = null;\n this.angle = null;\n\t// True if segment between this connection and the\n\t// next must be extruded out of the circle\n\tthis.extruded = null;\n\t// True if the extruded segment must be drawn long.\n\tthis.broken = null;\n\n\tthis._isNull = false;\n}\n\nConnection.prototype.isNull = function(){\n\treturn this._isNull;\n}\n\nConnection.prototype.setNull = function(isNull){\n\tthis._isNull = isNull;\n}\n\nConnection.prototype.getLoop = function(){\n\treturn this.loop;\n}\n\nConnection.prototype.setLoop = function(loop) {\n\tthis.loop = loop;\n}\n\nConnection.prototype.getRegion = function(){\n\treturn this.region;\n}\n\nConnection.prototype.setRegion = function(region){\n\tthis.region = region;\n}\n\nConnection.prototype.getStart = function(){\n\treturn this.start;\n}\n\nConnection.prototype.setStart = function(start) {\n\tthis.start = start;\n}\n\nConnection.prototype.getEnd = function(){\n\treturn this.end;\n}\n\nConnection.prototype.setEnd = function(end){\n\tthis.end = end;\n}\n\nConnection.prototype.getXrad = function(){\n\treturn this.xrad;\n}\n\nConnection.prototype.setXrad = function(xrad){\n\tthis.xrad = xrad;\n}\n\nConnection.prototype.getYrad = function(){\n\treturn this.yrad;\n}\n\nConnection.prototype.setYrad = function(yrad) {\n\tthis.yrad = yrad;\n}\n\nConnection.prototype.getAngle = function(){\n\treturn this.angle;\n}\n\nConnection.prototype.setAngle = function(angle){\n\tthis.angle = angle;\n}\n\nConnection.prototype.isExtruded = function(){\n\treturn this.extruded;\n}\n\nConnection.prototype.setExtruded = function(extruded){\n\tthis.extruded = extruded;\n}\n\nConnection.prototype.isBroken = function(){\n\treturn this.broken;\n}\n\nConnection.prototype.setBroken = function(broken){\n\tthis.broken = broken;\n}\n","import {Connection} from './connection.js';\n\nexport function Loop() {\n\tthis.nconnection = null;\n\tthis.connections = [];\n\tthis._connections = [];\n\tthis.number = null;\n\tthis.depth = null;\n\tthis.mark = null;\n\tthis.x = null;\n this.y = null;\n this.radius = null;\n}\n\nLoop.prototype.getNconnection = function() {\n\treturn this.nconnection;\n}\n\nLoop.prototype.setNconnection = function(nconnection) {\n\tthis.nconnection = nconnection;\n}\n\nLoop.prototype.setConnection = function(i, c){\n\tif (c != null){\n\t\tthis._connections[i] = c;\n }\n\telse {\n\t\tif (!this._connections[i]){\n\t\t\tthis._connections[i] = new Connection();\n\t\t}\n\t\tthis._connections[i].setNull(true);\n\t}\n}\n\nLoop.prototype.getConnection = function(i){\n\tvar Connection = require(\"./connection\");\n\tif (!this._connections[i]){\n this._connections[i] = new Connection();\n }\n\tvar c = this._connections[i];\n\tif (c.isNull()){\n\t\treturn null;\n }\n\telse {\n\t\treturn c;\n }\n}\n\nLoop.prototype.addConnection = function(i, c){\n\tthis._connections.push(c);\n}\n\nLoop.prototype.getNumber = function(){\n\treturn this.number;\n}\n\nLoop.prototype.setNumber = function(number){\n\tthis.number = number;\n}\n\nLoop.prototype.getDepth = function(){\n\treturn this.depth;\n}\n\nLoop.prototype.setDepth = function(depth){\n\tthis.depth = depth;\n}\n\nLoop.prototype.isMark = function(){\n\treturn this.mark;\n}\n\nLoop.prototype.setMark = function(mark){\n\tthis.mark = mark;\n}\n\nLoop.prototype.getX = function(){\n\treturn this.x;\n}\n\nLoop.prototype.setX = function(x){\n\tthis.x = x;\n}\n\nLoop.prototype.getY = function(){\n\treturn this.y;\n}\n\nLoop.prototype.setY = function(y){\n\tthis.y = y;\n}\n\nLoop.prototype.getRadius = function(){\n\treturn this.radius;\n}\n\nLoop.prototype.setRadius = function(radius){\n\tthis.radius = radius;\n}\n","export function Region() {\n\tthis._start1 = null;\n this._end1 = null;\n this._start2 = null;\n this._end2 = null;\n}\n\nRegion.prototype.getStart1 = function(){\n\treturn this._start1;\n}\n\nRegion.prototype.setStart1 = function(start1){\n\tthis._start1 = start1;\n}\n\nRegion.prototype.getEnd1 = function(){\n\treturn this._end1;\n}\n\nRegion.prototype.setEnd1 = function(end1){\n\tthis._end1 = end1;\n}\n\nRegion.prototype.getStart2 = function(){\n\treturn this._start2;\n}\n\nRegion.prototype.setStart2 = function(start2){\n\tthis._start2 = start2;\n}\n\nRegion.prototype.getEnd2 = function(){\n\treturn this._end2;\n}\n\nRegion.prototype.setEnd2 = function(end2){\n\tthis._end2 = end2;\n}\n","'use strict'\n\nexports.byteLength = byteLength\nexports.toByteArray = toByteArray\nexports.fromByteArray = fromByteArray\n\nvar lookup = []\nvar revLookup = []\nvar Arr = typeof Uint8Array !== 'undefined' ? Uint8Array : Array\n\nvar code = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/'\nfor (var i = 0, len = code.length; i < len; ++i) {\n lookup[i] = code[i]\n revLookup[code.charCodeAt(i)] = i\n}\n\n// Support decoding URL-safe base64 strings, as Node.js does.\n// See: https://en.wikipedia.org/wiki/Base64#URL_applications\nrevLookup['-'.charCodeAt(0)] = 62\nrevLookup['_'.charCodeAt(0)] = 63\n\nfunction getLens (b64) {\n var len = b64.length\n\n if (len % 4 > 0) {\n throw new Error('Invalid string. Length must be a multiple of 4')\n }\n\n // Trim off extra bytes after placeholder bytes are found\n // See: https://github.com/beatgammit/base64-js/issues/42\n var validLen = b64.indexOf('=')\n if (validLen === -1) validLen = len\n\n var placeHoldersLen = validLen === len\n ? 0\n : 4 - (validLen % 4)\n\n return [validLen, placeHoldersLen]\n}\n\n// base64 is 4/3 + up to two characters of the original data\nfunction byteLength (b64) {\n var lens = getLens(b64)\n var validLen = lens[0]\n var placeHoldersLen = lens[1]\n return ((validLen + placeHoldersLen) * 3 / 4) - placeHoldersLen\n}\n\nfunction _byteLength (b64, validLen, placeHoldersLen) {\n return ((validLen + placeHoldersLen) * 3 / 4) - placeHoldersLen\n}\n\nfunction toByteArray (b64) {\n var tmp\n var lens = getLens(b64)\n var validLen = lens[0]\n var placeHoldersLen = lens[1]\n\n var arr = new Arr(_byteLength(b64, validLen, placeHoldersLen))\n\n var curByte = 0\n\n // if there are placeholders, only get up to the last complete 4 chars\n var len = placeHoldersLen > 0\n ? validLen - 4\n : validLen\n\n var i\n for (i = 0; i < len; i += 4) {\n tmp =\n (revLookup[b64.charCodeAt(i)] << 18) |\n (revLookup[b64.charCodeAt(i + 1)] << 12) |\n (revLookup[b64.charCodeAt(i + 2)] << 6) |\n revLookup[b64.charCodeAt(i + 3)]\n arr[curByte++] = (tmp >> 16) & 0xFF\n arr[curByte++] = (tmp >> 8) & 0xFF\n arr[curByte++] = tmp & 0xFF\n }\n\n if (placeHoldersLen === 2) {\n tmp =\n (revLookup[b64.charCodeAt(i)] << 2) |\n (revLookup[b64.charCodeAt(i + 1)] >> 4)\n arr[curByte++] = tmp & 0xFF\n }\n\n if (placeHoldersLen === 1) {\n tmp =\n (revLookup[b64.charCodeAt(i)] << 10) |\n (revLookup[b64.charCodeAt(i + 1)] << 4) |\n (revLookup[b64.charCodeAt(i + 2)] >> 2)\n arr[curByte++] = (tmp >> 8) & 0xFF\n arr[curByte++] = tmp & 0xFF\n }\n\n return arr\n}\n\nfunction tripletToBase64 (num) {\n return lookup[num >> 18 & 0x3F] +\n lookup[num >> 12 & 0x3F] +\n lookup[num >> 6 & 0x3F] +\n lookup[num & 0x3F]\n}\n\nfunction encodeChunk (uint8, start, end) {\n var tmp\n var output = []\n for (var i = start; i < end; i += 3) {\n tmp =\n ((uint8[i] << 16) & 0xFF0000) +\n ((uint8[i + 1] << 8) & 0xFF00) +\n (uint8[i + 2] & 0xFF)\n output.push(tripletToBase64(tmp))\n }\n return output.join('')\n}\n\nfunction fromByteArray (uint8) {\n var tmp\n var len = uint8.length\n var extraBytes = len % 3 // if we have 1 byte left, pad 2 bytes\n var parts = []\n var maxChunkLength = 16383 // must be multiple of 3\n\n // go through the array every three bytes, we'll deal with trailing stuff later\n for (var i = 0, len2 = len - extraBytes; i < len2; i += maxChunkLength) {\n parts.push(encodeChunk(uint8, i, (i + maxChunkLength) > len2 ? len2 : (i + maxChunkLength)))\n }\n\n // pad the end with zeros, but make sure to not forget the extra bytes\n if (extraBytes === 1) {\n tmp = uint8[len - 1]\n parts.push(\n lookup[tmp >> 2] +\n lookup[(tmp << 4) & 0x3F] +\n '=='\n )\n } else if (extraBytes === 2) {\n tmp = (uint8[len - 2] << 8) + uint8[len - 1]\n parts.push(\n lookup[tmp >> 10] +\n lookup[(tmp >> 4) & 0x3F] +\n lookup[(tmp << 2) & 0x3F] +\n '='\n )\n }\n\n return parts.join('')\n}\n","/*!\n * The buffer module from node.js, for the browser.\n *\n * @author Feross Aboukhadijeh \n * @license MIT\n */\n/* eslint-disable no-proto */\n\n'use strict'\n\nconst base64 = require('base64-js')\nconst ieee754 = require('ieee754')\nconst customInspectSymbol =\n (typeof Symbol === 'function' && typeof Symbol['for'] === 'function') // eslint-disable-line dot-notation\n ? Symbol['for']('nodejs.util.inspect.custom') // eslint-disable-line dot-notation\n : null\n\nexports.Buffer = Buffer\nexports.SlowBuffer = SlowBuffer\nexports.INSPECT_MAX_BYTES = 50\n\nconst K_MAX_LENGTH = 0x7fffffff\nexports.kMaxLength = K_MAX_LENGTH\n\n/**\n * If `Buffer.TYPED_ARRAY_SUPPORT`:\n * === true Use Uint8Array implementation (fastest)\n * === false Print warning and recommend using `buffer` v4.x which has an Object\n * implementation (most compatible, even IE6)\n *\n * Browsers that support typed arrays are IE 10+, Firefox 4+, Chrome 7+, Safari 5.1+,\n * Opera 11.6+, iOS 4.2+.\n *\n * We report that the browser does not support typed arrays if the are not subclassable\n * using __proto__. Firefox 4-29 lacks support for adding new properties to `Uint8Array`\n * (See: https://bugzilla.mozilla.org/show_bug.cgi?id=695438). IE 10 lacks support\n * for __proto__ and has a buggy typed array implementation.\n */\nBuffer.TYPED_ARRAY_SUPPORT = typedArraySupport()\n\nif (!Buffer.TYPED_ARRAY_SUPPORT && typeof console !== 'undefined' &&\n typeof console.error === 'function') {\n console.error(\n 'This browser lacks typed array (Uint8Array) support which is required by ' +\n '`buffer` v5.x. Use `buffer` v4.x if you require old browser support.'\n )\n}\n\nfunction typedArraySupport () {\n // Can typed array instances can be augmented?\n try {\n const arr = new Uint8Array(1)\n const proto = { foo: function () { return 42 } }\n Object.setPrototypeOf(proto, Uint8Array.prototype)\n Object.setPrototypeOf(arr, proto)\n return arr.foo() === 42\n } catch (e) {\n return false\n }\n}\n\nObject.defineProperty(Buffer.prototype, 'parent', {\n enumerable: true,\n get: function () {\n if (!Buffer.isBuffer(this)) return undefined\n return this.buffer\n }\n})\n\nObject.defineProperty(Buffer.prototype, 'offset', {\n enumerable: true,\n get: function () {\n if (!Buffer.isBuffer(this)) return undefined\n return this.byteOffset\n }\n})\n\nfunction createBuffer (length) {\n if (length > K_MAX_LENGTH) {\n throw new RangeError('The value \"' + length + '\" is invalid for option \"size\"')\n }\n // Return an augmented `Uint8Array` instance\n const buf = new Uint8Array(length)\n Object.setPrototypeOf(buf, Buffer.prototype)\n return buf\n}\n\n/**\n * The Buffer constructor returns instances of `Uint8Array` that have their\n * prototype changed to `Buffer.prototype`. Furthermore, `Buffer` is a subclass of\n * `Uint8Array`, so the returned instances will have all the node `Buffer` methods\n * and the `Uint8Array` methods. Square bracket notation works as expected -- it\n * returns a single octet.\n *\n * The `Uint8Array` prototype remains unmodified.\n */\n\nfunction Buffer (arg, encodingOrOffset, length) {\n // Common case.\n if (typeof arg === 'number') {\n if (typeof encodingOrOffset === 'string') {\n throw new TypeError(\n 'The \"string\" argument must be of type string. Received type number'\n )\n }\n return allocUnsafe(arg)\n }\n return from(arg, encodingOrOffset, length)\n}\n\nBuffer.poolSize = 8192 // not used by this implementation\n\nfunction from (value, encodingOrOffset, length) {\n if (typeof value === 'string') {\n return fromString(value, encodingOrOffset)\n }\n\n if (ArrayBuffer.isView(value)) {\n return fromArrayView(value)\n }\n\n if (value == null) {\n throw new TypeError(\n 'The first argument must be one of type string, Buffer, ArrayBuffer, Array, ' +\n 'or Array-like Object. Received type ' + (typeof value)\n )\n }\n\n if (isInstance(value, ArrayBuffer) ||\n (value && isInstance(value.buffer, ArrayBuffer))) {\n return fromArrayBuffer(value, encodingOrOffset, length)\n }\n\n if (typeof SharedArrayBuffer !== 'undefined' &&\n (isInstance(value, SharedArrayBuffer) ||\n (value && isInstance(value.buffer, SharedArrayBuffer)))) {\n return fromArrayBuffer(value, encodingOrOffset, length)\n }\n\n if (typeof value === 'number') {\n throw new TypeError(\n 'The \"value\" argument must not be of type number. Received type number'\n )\n }\n\n const valueOf = value.valueOf && value.valueOf()\n if (valueOf != null && valueOf !== value) {\n return Buffer.from(valueOf, encodingOrOffset, length)\n }\n\n const b = fromObject(value)\n if (b) return b\n\n if (typeof Symbol !== 'undefined' && Symbol.toPrimitive != null &&\n typeof value[Symbol.toPrimitive] === 'function') {\n return Buffer.from(value[Symbol.toPrimitive]('string'), encodingOrOffset, length)\n }\n\n throw new TypeError(\n 'The first argument must be one of type string, Buffer, ArrayBuffer, Array, ' +\n 'or Array-like Object. Received type ' + (typeof value)\n )\n}\n\n/**\n * Functionally equivalent to Buffer(arg, encoding) but throws a TypeError\n * if value is a number.\n * Buffer.from(str[, encoding])\n * Buffer.from(array)\n * Buffer.from(buffer)\n * Buffer.from(arrayBuffer[, byteOffset[, length]])\n **/\nBuffer.from = function (value, encodingOrOffset, length) {\n return from(value, encodingOrOffset, length)\n}\n\n// Note: Change prototype *after* Buffer.from is defined to workaround Chrome bug:\n// https://github.com/feross/buffer/pull/148\nObject.setPrototypeOf(Buffer.prototype, Uint8Array.prototype)\nObject.setPrototypeOf(Buffer, Uint8Array)\n\nfunction assertSize (size) {\n if (typeof size !== 'number') {\n throw new TypeError('\"size\" argument must be of type number')\n } else if (size < 0) {\n throw new RangeError('The value \"' + size + '\" is invalid for option \"size\"')\n }\n}\n\nfunction alloc (size, fill, encoding) {\n assertSize(size)\n if (size <= 0) {\n return createBuffer(size)\n }\n if (fill !== undefined) {\n // Only pay attention to encoding if it's a string. This\n // prevents accidentally sending in a number that would\n // be interpreted as a start offset.\n return typeof encoding === 'string'\n ? createBuffer(size).fill(fill, encoding)\n : createBuffer(size).fill(fill)\n }\n return createBuffer(size)\n}\n\n/**\n * Creates a new filled Buffer instance.\n * alloc(size[, fill[, encoding]])\n **/\nBuffer.alloc = function (size, fill, encoding) {\n return alloc(size, fill, encoding)\n}\n\nfunction allocUnsafe (size) {\n assertSize(size)\n return createBuffer(size < 0 ? 0 : checked(size) | 0)\n}\n\n/**\n * Equivalent to Buffer(num), by default creates a non-zero-filled Buffer instance.\n * */\nBuffer.allocUnsafe = function (size) {\n return allocUnsafe(size)\n}\n/**\n * Equivalent to SlowBuffer(num), by default creates a non-zero-filled Buffer instance.\n */\nBuffer.allocUnsafeSlow = function (size) {\n return allocUnsafe(size)\n}\n\nfunction fromString (string, encoding) {\n if (typeof encoding !== 'string' || encoding === '') {\n encoding = 'utf8'\n }\n\n if (!Buffer.isEncoding(encoding)) {\n throw new TypeError('Unknown encoding: ' + encoding)\n }\n\n const length = byteLength(string, encoding) | 0\n let buf = createBuffer(length)\n\n const actual = buf.write(string, encoding)\n\n if (actual !== length) {\n // Writing a hex string, for example, that contains invalid characters will\n // cause everything after the first invalid character to be ignored. (e.g.\n // 'abxxcd' will be treated as 'ab')\n buf = buf.slice(0, actual)\n }\n\n return buf\n}\n\nfunction fromArrayLike (array) {\n const length = array.length < 0 ? 0 : checked(array.length) | 0\n const buf = createBuffer(length)\n for (let i = 0; i < length; i += 1) {\n buf[i] = array[i] & 255\n }\n return buf\n}\n\nfunction fromArrayView (arrayView) {\n if (isInstance(arrayView, Uint8Array)) {\n const copy = new Uint8Array(arrayView)\n return fromArrayBuffer(copy.buffer, copy.byteOffset, copy.byteLength)\n }\n return fromArrayLike(arrayView)\n}\n\nfunction fromArrayBuffer (array, byteOffset, length) {\n if (byteOffset < 0 || array.byteLength < byteOffset) {\n throw new RangeError('\"offset\" is outside of buffer bounds')\n }\n\n if (array.byteLength < byteOffset + (length || 0)) {\n throw new RangeError('\"length\" is outside of buffer bounds')\n }\n\n let buf\n if (byteOffset === undefined && length === undefined) {\n buf = new Uint8Array(array)\n } else if (length === undefined) {\n buf = new Uint8Array(array, byteOffset)\n } else {\n buf = new Uint8Array(array, byteOffset, length)\n }\n\n // Return an augmented `Uint8Array` instance\n Object.setPrototypeOf(buf, Buffer.prototype)\n\n return buf\n}\n\nfunction fromObject (obj) {\n if (Buffer.isBuffer(obj)) {\n const len = checked(obj.length) | 0\n const buf = createBuffer(len)\n\n if (buf.length === 0) {\n return buf\n }\n\n obj.copy(buf, 0, 0, len)\n return buf\n }\n\n if (obj.length !== undefined) {\n if (typeof obj.length !== 'number' || numberIsNaN(obj.length)) {\n return createBuffer(0)\n }\n return fromArrayLike(obj)\n }\n\n if (obj.type === 'Buffer' && Array.isArray(obj.data)) {\n return fromArrayLike(obj.data)\n }\n}\n\nfunction checked (length) {\n // Note: cannot use `length < K_MAX_LENGTH` here because that fails when\n // length is NaN (which is otherwise coerced to zero.)\n if (length >= K_MAX_LENGTH) {\n throw new RangeError('Attempt to allocate Buffer larger than maximum ' +\n 'size: 0x' + K_MAX_LENGTH.toString(16) + ' bytes')\n }\n return length | 0\n}\n\nfunction SlowBuffer (length) {\n if (+length != length) { // eslint-disable-line eqeqeq\n length = 0\n }\n return Buffer.alloc(+length)\n}\n\nBuffer.isBuffer = function isBuffer (b) {\n return b != null && b._isBuffer === true &&\n b !== Buffer.prototype // so Buffer.isBuffer(Buffer.prototype) will be false\n}\n\nBuffer.compare = function compare (a, b) {\n if (isInstance(a, Uint8Array)) a = Buffer.from(a, a.offset, a.byteLength)\n if (isInstance(b, Uint8Array)) b = Buffer.from(b, b.offset, b.byteLength)\n if (!Buffer.isBuffer(a) || !Buffer.isBuffer(b)) {\n throw new TypeError(\n 'The \"buf1\", \"buf2\" arguments must be one of type Buffer or Uint8Array'\n )\n }\n\n if (a === b) return 0\n\n let x = a.length\n let y = b.length\n\n for (let i = 0, len = Math.min(x, y); i < len; ++i) {\n if (a[i] !== b[i]) {\n x = a[i]\n y = b[i]\n break\n }\n }\n\n if (x < y) return -1\n if (y < x) return 1\n return 0\n}\n\nBuffer.isEncoding = function isEncoding (encoding) {\n switch (String(encoding).toLowerCase()) {\n case 'hex':\n case 'utf8':\n case 'utf-8':\n case 'ascii':\n case 'latin1':\n case 'binary':\n case 'base64':\n case 'ucs2':\n case 'ucs-2':\n case 'utf16le':\n case 'utf-16le':\n return true\n default:\n return false\n }\n}\n\nBuffer.concat = function concat (list, length) {\n if (!Array.isArray(list)) {\n throw new TypeError('\"list\" argument must be an Array of Buffers')\n }\n\n if (list.length === 0) {\n return Buffer.alloc(0)\n }\n\n let i\n if (length === undefined) {\n length = 0\n for (i = 0; i < list.length; ++i) {\n length += list[i].length\n }\n }\n\n const buffer = Buffer.allocUnsafe(length)\n let pos = 0\n for (i = 0; i < list.length; ++i) {\n let buf = list[i]\n if (isInstance(buf, Uint8Array)) {\n if (pos + buf.length > buffer.length) {\n if (!Buffer.isBuffer(buf)) buf = Buffer.from(buf)\n buf.copy(buffer, pos)\n } else {\n Uint8Array.prototype.set.call(\n buffer,\n buf,\n pos\n )\n }\n } else if (!Buffer.isBuffer(buf)) {\n throw new TypeError('\"list\" argument must be an Array of Buffers')\n } else {\n buf.copy(buffer, pos)\n }\n pos += buf.length\n }\n return buffer\n}\n\nfunction byteLength (string, encoding) {\n if (Buffer.isBuffer(string)) {\n return string.length\n }\n if (ArrayBuffer.isView(string) || isInstance(string, ArrayBuffer)) {\n return string.byteLength\n }\n if (typeof string !== 'string') {\n throw new TypeError(\n 'The \"string\" argument must be one of type string, Buffer, or ArrayBuffer. ' +\n 'Received type ' + typeof string\n )\n }\n\n const len = string.length\n const mustMatch = (arguments.length > 2 && arguments[2] === true)\n if (!mustMatch && len === 0) return 0\n\n // Use a for loop to avoid recursion\n let loweredCase = false\n for (;;) {\n switch (encoding) {\n case 'ascii':\n case 'latin1':\n case 'binary':\n return len\n case 'utf8':\n case 'utf-8':\n return utf8ToBytes(string).length\n case 'ucs2':\n case 'ucs-2':\n case 'utf16le':\n case 'utf-16le':\n return len * 2\n case 'hex':\n return len >>> 1\n case 'base64':\n return base64ToBytes(string).length\n default:\n if (loweredCase) {\n return mustMatch ? -1 : utf8ToBytes(string).length // assume utf8\n }\n encoding = ('' + encoding).toLowerCase()\n loweredCase = true\n }\n }\n}\nBuffer.byteLength = byteLength\n\nfunction slowToString (encoding, start, end) {\n let loweredCase = false\n\n // No need to verify that \"this.length <= MAX_UINT32\" since it's a read-only\n // property of a typed array.\n\n // This behaves neither like String nor Uint8Array in that we set start/end\n // to their upper/lower bounds if the value passed is out of range.\n // undefined is handled specially as per ECMA-262 6th Edition,\n // Section 13.3.3.7 Runtime Semantics: KeyedBindingInitialization.\n if (start === undefined || start < 0) {\n start = 0\n }\n // Return early if start > this.length. Done here to prevent potential uint32\n // coercion fail below.\n if (start > this.length) {\n return ''\n }\n\n if (end === undefined || end > this.length) {\n end = this.length\n }\n\n if (end <= 0) {\n return ''\n }\n\n // Force coercion to uint32. This will also coerce falsey/NaN values to 0.\n end >>>= 0\n start >>>= 0\n\n if (end <= start) {\n return ''\n }\n\n if (!encoding) encoding = 'utf8'\n\n while (true) {\n switch (encoding) {\n case 'hex':\n return hexSlice(this, start, end)\n\n case 'utf8':\n case 'utf-8':\n return utf8Slice(this, start, end)\n\n case 'ascii':\n return asciiSlice(this, start, end)\n\n case 'latin1':\n case 'binary':\n return latin1Slice(this, start, end)\n\n case 'base64':\n return base64Slice(this, start, end)\n\n case 'ucs2':\n case 'ucs-2':\n case 'utf16le':\n case 'utf-16le':\n return utf16leSlice(this, start, end)\n\n default:\n if (loweredCase) throw new TypeError('Unknown encoding: ' + encoding)\n encoding = (encoding + '').toLowerCase()\n loweredCase = true\n }\n }\n}\n\n// This property is used by `Buffer.isBuffer` (and the `is-buffer` npm package)\n// to detect a Buffer instance. It's not possible to use `instanceof Buffer`\n// reliably in a browserify context because there could be multiple different\n// copies of the 'buffer' package in use. This method works even for Buffer\n// instances that were created from another copy of the `buffer` package.\n// See: https://github.com/feross/buffer/issues/154\nBuffer.prototype._isBuffer = true\n\nfunction swap (b, n, m) {\n const i = b[n]\n b[n] = b[m]\n b[m] = i\n}\n\nBuffer.prototype.swap16 = function swap16 () {\n const len = this.length\n if (len % 2 !== 0) {\n throw new RangeError('Buffer size must be a multiple of 16-bits')\n }\n for (let i = 0; i < len; i += 2) {\n swap(this, i, i + 1)\n }\n return this\n}\n\nBuffer.prototype.swap32 = function swap32 () {\n const len = this.length\n if (len % 4 !== 0) {\n throw new RangeError('Buffer size must be a multiple of 32-bits')\n }\n for (let i = 0; i < len; i += 4) {\n swap(this, i, i + 3)\n swap(this, i + 1, i + 2)\n }\n return this\n}\n\nBuffer.prototype.swap64 = function swap64 () {\n const len = this.length\n if (len % 8 !== 0) {\n throw new RangeError('Buffer size must be a multiple of 64-bits')\n }\n for (let i = 0; i < len; i += 8) {\n swap(this, i, i + 7)\n swap(this, i + 1, i + 6)\n swap(this, i + 2, i + 5)\n swap(this, i + 3, i + 4)\n }\n return this\n}\n\nBuffer.prototype.toString = function toString () {\n const length = this.length\n if (length === 0) return ''\n if (arguments.length === 0) return utf8Slice(this, 0, length)\n return slowToString.apply(this, arguments)\n}\n\nBuffer.prototype.toLocaleString = Buffer.prototype.toString\n\nBuffer.prototype.equals = function equals (b) {\n if (!Buffer.isBuffer(b)) throw new TypeError('Argument must be a Buffer')\n if (this === b) return true\n return Buffer.compare(this, b) === 0\n}\n\nBuffer.prototype.inspect = function inspect () {\n let str = ''\n const max = exports.INSPECT_MAX_BYTES\n str = this.toString('hex', 0, max).replace(/(.{2})/g, '$1 ').trim()\n if (this.length > max) str += ' ... '\n return ''\n}\nif (customInspectSymbol) {\n Buffer.prototype[customInspectSymbol] = Buffer.prototype.inspect\n}\n\nBuffer.prototype.compare = function compare (target, start, end, thisStart, thisEnd) {\n if (isInstance(target, Uint8Array)) {\n target = Buffer.from(target, target.offset, target.byteLength)\n }\n if (!Buffer.isBuffer(target)) {\n throw new TypeError(\n 'The \"target\" argument must be one of type Buffer or Uint8Array. ' +\n 'Received type ' + (typeof target)\n )\n }\n\n if (start === undefined) {\n start = 0\n }\n if (end === undefined) {\n end = target ? target.length : 0\n }\n if (thisStart === undefined) {\n thisStart = 0\n }\n if (thisEnd === undefined) {\n thisEnd = this.length\n }\n\n if (start < 0 || end > target.length || thisStart < 0 || thisEnd > this.length) {\n throw new RangeError('out of range index')\n }\n\n if (thisStart >= thisEnd && start >= end) {\n return 0\n }\n if (thisStart >= thisEnd) {\n return -1\n }\n if (start >= end) {\n return 1\n }\n\n start >>>= 0\n end >>>= 0\n thisStart >>>= 0\n thisEnd >>>= 0\n\n if (this === target) return 0\n\n let x = thisEnd - thisStart\n let y = end - start\n const len = Math.min(x, y)\n\n const thisCopy = this.slice(thisStart, thisEnd)\n const targetCopy = target.slice(start, end)\n\n for (let i = 0; i < len; ++i) {\n if (thisCopy[i] !== targetCopy[i]) {\n x = thisCopy[i]\n y = targetCopy[i]\n break\n }\n }\n\n if (x < y) return -1\n if (y < x) return 1\n return 0\n}\n\n// Finds either the first index of `val` in `buffer` at offset >= `byteOffset`,\n// OR the last index of `val` in `buffer` at offset <= `byteOffset`.\n//\n// Arguments:\n// - buffer - a Buffer to search\n// - val - a string, Buffer, or number\n// - byteOffset - an index into `buffer`; will be clamped to an int32\n// - encoding - an optional encoding, relevant is val is a string\n// - dir - true for indexOf, false for lastIndexOf\nfunction bidirectionalIndexOf (buffer, val, byteOffset, encoding, dir) {\n // Empty buffer means no match\n if (buffer.length === 0) return -1\n\n // Normalize byteOffset\n if (typeof byteOffset === 'string') {\n encoding = byteOffset\n byteOffset = 0\n } else if (byteOffset > 0x7fffffff) {\n byteOffset = 0x7fffffff\n } else if (byteOffset < -0x80000000) {\n byteOffset = -0x80000000\n }\n byteOffset = +byteOffset // Coerce to Number.\n if (numberIsNaN(byteOffset)) {\n // byteOffset: it it's undefined, null, NaN, \"foo\", etc, search whole buffer\n byteOffset = dir ? 0 : (buffer.length - 1)\n }\n\n // Normalize byteOffset: negative offsets start from the end of the buffer\n if (byteOffset < 0) byteOffset = buffer.length + byteOffset\n if (byteOffset >= buffer.length) {\n if (dir) return -1\n else byteOffset = buffer.length - 1\n } else if (byteOffset < 0) {\n if (dir) byteOffset = 0\n else return -1\n }\n\n // Normalize val\n if (typeof val === 'string') {\n val = Buffer.from(val, encoding)\n }\n\n // Finally, search either indexOf (if dir is true) or lastIndexOf\n if (Buffer.isBuffer(val)) {\n // Special case: looking for empty string/buffer always fails\n if (val.length === 0) {\n return -1\n }\n return arrayIndexOf(buffer, val, byteOffset, encoding, dir)\n } else if (typeof val === 'number') {\n val = val & 0xFF // Search for a byte value [0-255]\n if (typeof Uint8Array.prototype.indexOf === 'function') {\n if (dir) {\n return Uint8Array.prototype.indexOf.call(buffer, val, byteOffset)\n } else {\n return Uint8Array.prototype.lastIndexOf.call(buffer, val, byteOffset)\n }\n }\n return arrayIndexOf(buffer, [val], byteOffset, encoding, dir)\n }\n\n throw new TypeError('val must be string, number or Buffer')\n}\n\nfunction arrayIndexOf (arr, val, byteOffset, encoding, dir) {\n let indexSize = 1\n let arrLength = arr.length\n let valLength = val.length\n\n if (encoding !== undefined) {\n encoding = String(encoding).toLowerCase()\n if (encoding === 'ucs2' || encoding === 'ucs-2' ||\n encoding === 'utf16le' || encoding === 'utf-16le') {\n if (arr.length < 2 || val.length < 2) {\n return -1\n }\n indexSize = 2\n arrLength /= 2\n valLength /= 2\n byteOffset /= 2\n }\n }\n\n function read (buf, i) {\n if (indexSize === 1) {\n return buf[i]\n } else {\n return buf.readUInt16BE(i * indexSize)\n }\n }\n\n let i\n if (dir) {\n let foundIndex = -1\n for (i = byteOffset; i < arrLength; i++) {\n if (read(arr, i) === read(val, foundIndex === -1 ? 0 : i - foundIndex)) {\n if (foundIndex === -1) foundIndex = i\n if (i - foundIndex + 1 === valLength) return foundIndex * indexSize\n } else {\n if (foundIndex !== -1) i -= i - foundIndex\n foundIndex = -1\n }\n }\n } else {\n if (byteOffset + valLength > arrLength) byteOffset = arrLength - valLength\n for (i = byteOffset; i >= 0; i--) {\n let found = true\n for (let j = 0; j < valLength; j++) {\n if (read(arr, i + j) !== read(val, j)) {\n found = false\n break\n }\n }\n if (found) return i\n }\n }\n\n return -1\n}\n\nBuffer.prototype.includes = function includes (val, byteOffset, encoding) {\n return this.indexOf(val, byteOffset, encoding) !== -1\n}\n\nBuffer.prototype.indexOf = function indexOf (val, byteOffset, encoding) {\n return bidirectionalIndexOf(this, val, byteOffset, encoding, true)\n}\n\nBuffer.prototype.lastIndexOf = function lastIndexOf (val, byteOffset, encoding) {\n return bidirectionalIndexOf(this, val, byteOffset, encoding, false)\n}\n\nfunction hexWrite (buf, string, offset, length) {\n offset = Number(offset) || 0\n const remaining = buf.length - offset\n if (!length) {\n length = remaining\n } else {\n length = Number(length)\n if (length > remaining) {\n length = remaining\n }\n }\n\n const strLen = string.length\n\n if (length > strLen / 2) {\n length = strLen / 2\n }\n let i\n for (i = 0; i < length; ++i) {\n const parsed = parseInt(string.substr(i * 2, 2), 16)\n if (numberIsNaN(parsed)) return i\n buf[offset + i] = parsed\n }\n return i\n}\n\nfunction utf8Write (buf, string, offset, length) {\n return blitBuffer(utf8ToBytes(string, buf.length - offset), buf, offset, length)\n}\n\nfunction asciiWrite (buf, string, offset, length) {\n return blitBuffer(asciiToBytes(string), buf, offset, length)\n}\n\nfunction base64Write (buf, string, offset, length) {\n return blitBuffer(base64ToBytes(string), buf, offset, length)\n}\n\nfunction ucs2Write (buf, string, offset, length) {\n return blitBuffer(utf16leToBytes(string, buf.length - offset), buf, offset, length)\n}\n\nBuffer.prototype.write = function write (string, offset, length, encoding) {\n // Buffer#write(string)\n if (offset === undefined) {\n encoding = 'utf8'\n length = this.length\n offset = 0\n // Buffer#write(string, encoding)\n } else if (length === undefined && typeof offset === 'string') {\n encoding = offset\n length = this.length\n offset = 0\n // Buffer#write(string, offset[, length][, encoding])\n } else if (isFinite(offset)) {\n offset = offset >>> 0\n if (isFinite(length)) {\n length = length >>> 0\n if (encoding === undefined) encoding = 'utf8'\n } else {\n encoding = length\n length = undefined\n }\n } else {\n throw new Error(\n 'Buffer.write(string, encoding, offset[, length]) is no longer supported'\n )\n }\n\n const remaining = this.length - offset\n if (length === undefined || length > remaining) length = remaining\n\n if ((string.length > 0 && (length < 0 || offset < 0)) || offset > this.length) {\n throw new RangeError('Attempt to write outside buffer bounds')\n }\n\n if (!encoding) encoding = 'utf8'\n\n let loweredCase = false\n for (;;) {\n switch (encoding) {\n case 'hex':\n return hexWrite(this, string, offset, length)\n\n case 'utf8':\n case 'utf-8':\n return utf8Write(this, string, offset, length)\n\n case 'ascii':\n case 'latin1':\n case 'binary':\n return asciiWrite(this, string, offset, length)\n\n case 'base64':\n // Warning: maxLength not taken into account in base64Write\n return base64Write(this, string, offset, length)\n\n case 'ucs2':\n case 'ucs-2':\n case 'utf16le':\n case 'utf-16le':\n return ucs2Write(this, string, offset, length)\n\n default:\n if (loweredCase) throw new TypeError('Unknown encoding: ' + encoding)\n encoding = ('' + encoding).toLowerCase()\n loweredCase = true\n }\n }\n}\n\nBuffer.prototype.toJSON = function toJSON () {\n return {\n type: 'Buffer',\n data: Array.prototype.slice.call(this._arr || this, 0)\n }\n}\n\nfunction base64Slice (buf, start, end) {\n if (start === 0 && end === buf.length) {\n return base64.fromByteArray(buf)\n } else {\n return base64.fromByteArray(buf.slice(start, end))\n }\n}\n\nfunction utf8Slice (buf, start, end) {\n end = Math.min(buf.length, end)\n const res = []\n\n let i = start\n while (i < end) {\n const firstByte = buf[i]\n let codePoint = null\n let bytesPerSequence = (firstByte > 0xEF)\n ? 4\n : (firstByte > 0xDF)\n ? 3\n : (firstByte > 0xBF)\n ? 2\n : 1\n\n if (i + bytesPerSequence <= end) {\n let secondByte, thirdByte, fourthByte, tempCodePoint\n\n switch (bytesPerSequence) {\n case 1:\n if (firstByte < 0x80) {\n codePoint = firstByte\n }\n break\n case 2:\n secondByte = buf[i + 1]\n if ((secondByte & 0xC0) === 0x80) {\n tempCodePoint = (firstByte & 0x1F) << 0x6 | (secondByte & 0x3F)\n if (tempCodePoint > 0x7F) {\n codePoint = tempCodePoint\n }\n }\n break\n case 3:\n secondByte = buf[i + 1]\n thirdByte = buf[i + 2]\n if ((secondByte & 0xC0) === 0x80 && (thirdByte & 0xC0) === 0x80) {\n tempCodePoint = (firstByte & 0xF) << 0xC | (secondByte & 0x3F) << 0x6 | (thirdByte & 0x3F)\n if (tempCodePoint > 0x7FF && (tempCodePoint < 0xD800 || tempCodePoint > 0xDFFF)) {\n codePoint = tempCodePoint\n }\n }\n break\n case 4:\n secondByte = buf[i + 1]\n thirdByte = buf[i + 2]\n fourthByte = buf[i + 3]\n if ((secondByte & 0xC0) === 0x80 && (thirdByte & 0xC0) === 0x80 && (fourthByte & 0xC0) === 0x80) {\n tempCodePoint = (firstByte & 0xF) << 0x12 | (secondByte & 0x3F) << 0xC | (thirdByte & 0x3F) << 0x6 | (fourthByte & 0x3F)\n if (tempCodePoint > 0xFFFF && tempCodePoint < 0x110000) {\n codePoint = tempCodePoint\n }\n }\n }\n }\n\n if (codePoint === null) {\n // we did not generate a valid codePoint so insert a\n // replacement char (U+FFFD) and advance only 1 byte\n codePoint = 0xFFFD\n bytesPerSequence = 1\n } else if (codePoint > 0xFFFF) {\n // encode to utf16 (surrogate pair dance)\n codePoint -= 0x10000\n res.push(codePoint >>> 10 & 0x3FF | 0xD800)\n codePoint = 0xDC00 | codePoint & 0x3FF\n }\n\n res.push(codePoint)\n i += bytesPerSequence\n }\n\n return decodeCodePointsArray(res)\n}\n\n// Based on http://stackoverflow.com/a/22747272/680742, the browser with\n// the lowest limit is Chrome, with 0x10000 args.\n// We go 1 magnitude less, for safety\nconst MAX_ARGUMENTS_LENGTH = 0x1000\n\nfunction decodeCodePointsArray (codePoints) {\n const len = codePoints.length\n if (len <= MAX_ARGUMENTS_LENGTH) {\n return String.fromCharCode.apply(String, codePoints) // avoid extra slice()\n }\n\n // Decode in chunks to avoid \"call stack size exceeded\".\n let res = ''\n let i = 0\n while (i < len) {\n res += String.fromCharCode.apply(\n String,\n codePoints.slice(i, i += MAX_ARGUMENTS_LENGTH)\n )\n }\n return res\n}\n\nfunction asciiSlice (buf, start, end) {\n let ret = ''\n end = Math.min(buf.length, end)\n\n for (let i = start; i < end; ++i) {\n ret += String.fromCharCode(buf[i] & 0x7F)\n }\n return ret\n}\n\nfunction latin1Slice (buf, start, end) {\n let ret = ''\n end = Math.min(buf.length, end)\n\n for (let i = start; i < end; ++i) {\n ret += String.fromCharCode(buf[i])\n }\n return ret\n}\n\nfunction hexSlice (buf, start, end) {\n const len = buf.length\n\n if (!start || start < 0) start = 0\n if (!end || end < 0 || end > len) end = len\n\n let out = ''\n for (let i = start; i < end; ++i) {\n out += hexSliceLookupTable[buf[i]]\n }\n return out\n}\n\nfunction utf16leSlice (buf, start, end) {\n const bytes = buf.slice(start, end)\n let res = ''\n // If bytes.length is odd, the last 8 bits must be ignored (same as node.js)\n for (let i = 0; i < bytes.length - 1; i += 2) {\n res += String.fromCharCode(bytes[i] + (bytes[i + 1] * 256))\n }\n return res\n}\n\nBuffer.prototype.slice = function slice (start, end) {\n const len = this.length\n start = ~~start\n end = end === undefined ? len : ~~end\n\n if (start < 0) {\n start += len\n if (start < 0) start = 0\n } else if (start > len) {\n start = len\n }\n\n if (end < 0) {\n end += len\n if (end < 0) end = 0\n } else if (end > len) {\n end = len\n }\n\n if (end < start) end = start\n\n const newBuf = this.subarray(start, end)\n // Return an augmented `Uint8Array` instance\n Object.setPrototypeOf(newBuf, Buffer.prototype)\n\n return newBuf\n}\n\n/*\n * Need to make sure that buffer isn't trying to write out of bounds.\n */\nfunction checkOffset (offset, ext, length) {\n if ((offset % 1) !== 0 || offset < 0) throw new RangeError('offset is not uint')\n if (offset + ext > length) throw new RangeError('Trying to access beyond buffer length')\n}\n\nBuffer.prototype.readUintLE =\nBuffer.prototype.readUIntLE = function readUIntLE (offset, byteLength, noAssert) {\n offset = offset >>> 0\n byteLength = byteLength >>> 0\n if (!noAssert) checkOffset(offset, byteLength, this.length)\n\n let val = this[offset]\n let mul = 1\n let i = 0\n while (++i < byteLength && (mul *= 0x100)) {\n val += this[offset + i] * mul\n }\n\n return val\n}\n\nBuffer.prototype.readUintBE =\nBuffer.prototype.readUIntBE = function readUIntBE (offset, byteLength, noAssert) {\n offset = offset >>> 0\n byteLength = byteLength >>> 0\n if (!noAssert) {\n checkOffset(offset, byteLength, this.length)\n }\n\n let val = this[offset + --byteLength]\n let mul = 1\n while (byteLength > 0 && (mul *= 0x100)) {\n val += this[offset + --byteLength] * mul\n }\n\n return val\n}\n\nBuffer.prototype.readUint8 =\nBuffer.prototype.readUInt8 = function readUInt8 (offset, noAssert) {\n offset = offset >>> 0\n if (!noAssert) checkOffset(offset, 1, this.length)\n return this[offset]\n}\n\nBuffer.prototype.readUint16LE =\nBuffer.prototype.readUInt16LE = function readUInt16LE (offset, noAssert) {\n offset = offset >>> 0\n if (!noAssert) checkOffset(offset, 2, this.length)\n return this[offset] | (this[offset + 1] << 8)\n}\n\nBuffer.prototype.readUint16BE =\nBuffer.prototype.readUInt16BE = function readUInt16BE (offset, noAssert) {\n offset = offset >>> 0\n if (!noAssert) checkOffset(offset, 2, this.length)\n return (this[offset] << 8) | this[offset + 1]\n}\n\nBuffer.prototype.readUint32LE =\nBuffer.prototype.readUInt32LE = function readUInt32LE (offset, noAssert) {\n offset = offset >>> 0\n if (!noAssert) checkOffset(offset, 4, this.length)\n\n return ((this[offset]) |\n (this[offset + 1] << 8) |\n (this[offset + 2] << 16)) +\n (this[offset + 3] * 0x1000000)\n}\n\nBuffer.prototype.readUint32BE =\nBuffer.prototype.readUInt32BE = function readUInt32BE (offset, noAssert) {\n offset = offset >>> 0\n if (!noAssert) checkOffset(offset, 4, this.length)\n\n return (this[offset] * 0x1000000) +\n ((this[offset + 1] << 16) |\n (this[offset + 2] << 8) |\n this[offset + 3])\n}\n\nBuffer.prototype.readBigUInt64LE = defineBigIntMethod(function readBigUInt64LE (offset) {\n offset = offset >>> 0\n validateNumber(offset, 'offset')\n const first = this[offset]\n const last = this[offset + 7]\n if (first === undefined || last === undefined) {\n boundsError(offset, this.length - 8)\n }\n\n const lo = first +\n this[++offset] * 2 ** 8 +\n this[++offset] * 2 ** 16 +\n this[++offset] * 2 ** 24\n\n const hi = this[++offset] +\n this[++offset] * 2 ** 8 +\n this[++offset] * 2 ** 16 +\n last * 2 ** 24\n\n return BigInt(lo) + (BigInt(hi) << BigInt(32))\n})\n\nBuffer.prototype.readBigUInt64BE = defineBigIntMethod(function readBigUInt64BE (offset) {\n offset = offset >>> 0\n validateNumber(offset, 'offset')\n const first = this[offset]\n const last = this[offset + 7]\n if (first === undefined || last === undefined) {\n boundsError(offset, this.length - 8)\n }\n\n const hi = first * 2 ** 24 +\n this[++offset] * 2 ** 16 +\n this[++offset] * 2 ** 8 +\n this[++offset]\n\n const lo = this[++offset] * 2 ** 24 +\n this[++offset] * 2 ** 16 +\n this[++offset] * 2 ** 8 +\n last\n\n return (BigInt(hi) << BigInt(32)) + BigInt(lo)\n})\n\nBuffer.prototype.readIntLE = function readIntLE (offset, byteLength, noAssert) {\n offset = offset >>> 0\n byteLength = byteLength >>> 0\n if (!noAssert) checkOffset(offset, byteLength, this.length)\n\n let val = this[offset]\n let mul = 1\n let i = 0\n while (++i < byteLength && (mul *= 0x100)) {\n val += this[offset + i] * mul\n }\n mul *= 0x80\n\n if (val >= mul) val -= Math.pow(2, 8 * byteLength)\n\n return val\n}\n\nBuffer.prototype.readIntBE = function readIntBE (offset, byteLength, noAssert) {\n offset = offset >>> 0\n byteLength = byteLength >>> 0\n if (!noAssert) checkOffset(offset, byteLength, this.length)\n\n let i = byteLength\n let mul = 1\n let val = this[offset + --i]\n while (i > 0 && (mul *= 0x100)) {\n val += this[offset + --i] * mul\n }\n mul *= 0x80\n\n if (val >= mul) val -= Math.pow(2, 8 * byteLength)\n\n return val\n}\n\nBuffer.prototype.readInt8 = function readInt8 (offset, noAssert) {\n offset = offset >>> 0\n if (!noAssert) checkOffset(offset, 1, this.length)\n if (!(this[offset] & 0x80)) return (this[offset])\n return ((0xff - this[offset] + 1) * -1)\n}\n\nBuffer.prototype.readInt16LE = function readInt16LE (offset, noAssert) {\n offset = offset >>> 0\n if (!noAssert) checkOffset(offset, 2, this.length)\n const val = this[offset] | (this[offset + 1] << 8)\n return (val & 0x8000) ? val | 0xFFFF0000 : val\n}\n\nBuffer.prototype.readInt16BE = function readInt16BE (offset, noAssert) {\n offset = offset >>> 0\n if (!noAssert) checkOffset(offset, 2, this.length)\n const val = this[offset + 1] | (this[offset] << 8)\n return (val & 0x8000) ? val | 0xFFFF0000 : val\n}\n\nBuffer.prototype.readInt32LE = function readInt32LE (offset, noAssert) {\n offset = offset >>> 0\n if (!noAssert) checkOffset(offset, 4, this.length)\n\n return (this[offset]) |\n (this[offset + 1] << 8) |\n (this[offset + 2] << 16) |\n (this[offset + 3] << 24)\n}\n\nBuffer.prototype.readInt32BE = function readInt32BE (offset, noAssert) {\n offset = offset >>> 0\n if (!noAssert) checkOffset(offset, 4, this.length)\n\n return (this[offset] << 24) |\n (this[offset + 1] << 16) |\n (this[offset + 2] << 8) |\n (this[offset + 3])\n}\n\nBuffer.prototype.readBigInt64LE = defineBigIntMethod(function readBigInt64LE (offset) {\n offset = offset >>> 0\n validateNumber(offset, 'offset')\n const first = this[offset]\n const last = this[offset + 7]\n if (first === undefined || last === undefined) {\n boundsError(offset, this.length - 8)\n }\n\n const val = this[offset + 4] +\n this[offset + 5] * 2 ** 8 +\n this[offset + 6] * 2 ** 16 +\n (last << 24) // Overflow\n\n return (BigInt(val) << BigInt(32)) +\n BigInt(first +\n this[++offset] * 2 ** 8 +\n this[++offset] * 2 ** 16 +\n this[++offset] * 2 ** 24)\n})\n\nBuffer.prototype.readBigInt64BE = defineBigIntMethod(function readBigInt64BE (offset) {\n offset = offset >>> 0\n validateNumber(offset, 'offset')\n const first = this[offset]\n const last = this[offset + 7]\n if (first === undefined || last === undefined) {\n boundsError(offset, this.length - 8)\n }\n\n const val = (first << 24) + // Overflow\n this[++offset] * 2 ** 16 +\n this[++offset] * 2 ** 8 +\n this[++offset]\n\n return (BigInt(val) << BigInt(32)) +\n BigInt(this[++offset] * 2 ** 24 +\n this[++offset] * 2 ** 16 +\n this[++offset] * 2 ** 8 +\n last)\n})\n\nBuffer.prototype.readFloatLE = function readFloatLE (offset, noAssert) {\n offset = offset >>> 0\n if (!noAssert) checkOffset(offset, 4, this.length)\n return ieee754.read(this, offset, true, 23, 4)\n}\n\nBuffer.prototype.readFloatBE = function readFloatBE (offset, noAssert) {\n offset = offset >>> 0\n if (!noAssert) checkOffset(offset, 4, this.length)\n return ieee754.read(this, offset, false, 23, 4)\n}\n\nBuffer.prototype.readDoubleLE = function readDoubleLE (offset, noAssert) {\n offset = offset >>> 0\n if (!noAssert) checkOffset(offset, 8, this.length)\n return ieee754.read(this, offset, true, 52, 8)\n}\n\nBuffer.prototype.readDoubleBE = function readDoubleBE (offset, noAssert) {\n offset = offset >>> 0\n if (!noAssert) checkOffset(offset, 8, this.length)\n return ieee754.read(this, offset, false, 52, 8)\n}\n\nfunction checkInt (buf, value, offset, ext, max, min) {\n if (!Buffer.isBuffer(buf)) throw new TypeError('\"buffer\" argument must be a Buffer instance')\n if (value > max || value < min) throw new RangeError('\"value\" argument is out of bounds')\n if (offset + ext > buf.length) throw new RangeError('Index out of range')\n}\n\nBuffer.prototype.writeUintLE =\nBuffer.prototype.writeUIntLE = function writeUIntLE (value, offset, byteLength, noAssert) {\n value = +value\n offset = offset >>> 0\n byteLength = byteLength >>> 0\n if (!noAssert) {\n const maxBytes = Math.pow(2, 8 * byteLength) - 1\n checkInt(this, value, offset, byteLength, maxBytes, 0)\n }\n\n let mul = 1\n let i = 0\n this[offset] = value & 0xFF\n while (++i < byteLength && (mul *= 0x100)) {\n this[offset + i] = (value / mul) & 0xFF\n }\n\n return offset + byteLength\n}\n\nBuffer.prototype.writeUintBE =\nBuffer.prototype.writeUIntBE = function writeUIntBE (value, offset, byteLength, noAssert) {\n value = +value\n offset = offset >>> 0\n byteLength = byteLength >>> 0\n if (!noAssert) {\n const maxBytes = Math.pow(2, 8 * byteLength) - 1\n checkInt(this, value, offset, byteLength, maxBytes, 0)\n }\n\n let i = byteLength - 1\n let mul = 1\n this[offset + i] = value & 0xFF\n while (--i >= 0 && (mul *= 0x100)) {\n this[offset + i] = (value / mul) & 0xFF\n }\n\n return offset + byteLength\n}\n\nBuffer.prototype.writeUint8 =\nBuffer.prototype.writeUInt8 = function writeUInt8 (value, offset, noAssert) {\n value = +value\n offset = offset >>> 0\n if (!noAssert) checkInt(this, value, offset, 1, 0xff, 0)\n this[offset] = (value & 0xff)\n return offset + 1\n}\n\nBuffer.prototype.writeUint16LE =\nBuffer.prototype.writeUInt16LE = function writeUInt16LE (value, offset, noAssert) {\n value = +value\n offset = offset >>> 0\n if (!noAssert) checkInt(this, value, offset, 2, 0xffff, 0)\n this[offset] = (value & 0xff)\n this[offset + 1] = (value >>> 8)\n return offset + 2\n}\n\nBuffer.prototype.writeUint16BE =\nBuffer.prototype.writeUInt16BE = function writeUInt16BE (value, offset, noAssert) {\n value = +value\n offset = offset >>> 0\n if (!noAssert) checkInt(this, value, offset, 2, 0xffff, 0)\n this[offset] = (value >>> 8)\n this[offset + 1] = (value & 0xff)\n return offset + 2\n}\n\nBuffer.prototype.writeUint32LE =\nBuffer.prototype.writeUInt32LE = function writeUInt32LE (value, offset, noAssert) {\n value = +value\n offset = offset >>> 0\n if (!noAssert) checkInt(this, value, offset, 4, 0xffffffff, 0)\n this[offset + 3] = (value >>> 24)\n this[offset + 2] = (value >>> 16)\n this[offset + 1] = (value >>> 8)\n this[offset] = (value & 0xff)\n return offset + 4\n}\n\nBuffer.prototype.writeUint32BE =\nBuffer.prototype.writeUInt32BE = function writeUInt32BE (value, offset, noAssert) {\n value = +value\n offset = offset >>> 0\n if (!noAssert) checkInt(this, value, offset, 4, 0xffffffff, 0)\n this[offset] = (value >>> 24)\n this[offset + 1] = (value >>> 16)\n this[offset + 2] = (value >>> 8)\n this[offset + 3] = (value & 0xff)\n return offset + 4\n}\n\nfunction wrtBigUInt64LE (buf, value, offset, min, max) {\n checkIntBI(value, min, max, buf, offset, 7)\n\n let lo = Number(value & BigInt(0xffffffff))\n buf[offset++] = lo\n lo = lo >> 8\n buf[offset++] = lo\n lo = lo >> 8\n buf[offset++] = lo\n lo = lo >> 8\n buf[offset++] = lo\n let hi = Number(value >> BigInt(32) & BigInt(0xffffffff))\n buf[offset++] = hi\n hi = hi >> 8\n buf[offset++] = hi\n hi = hi >> 8\n buf[offset++] = hi\n hi = hi >> 8\n buf[offset++] = hi\n return offset\n}\n\nfunction wrtBigUInt64BE (buf, value, offset, min, max) {\n checkIntBI(value, min, max, buf, offset, 7)\n\n let lo = Number(value & BigInt(0xffffffff))\n buf[offset + 7] = lo\n lo = lo >> 8\n buf[offset + 6] = lo\n lo = lo >> 8\n buf[offset + 5] = lo\n lo = lo >> 8\n buf[offset + 4] = lo\n let hi = Number(value >> BigInt(32) & BigInt(0xffffffff))\n buf[offset + 3] = hi\n hi = hi >> 8\n buf[offset + 2] = hi\n hi = hi >> 8\n buf[offset + 1] = hi\n hi = hi >> 8\n buf[offset] = hi\n return offset + 8\n}\n\nBuffer.prototype.writeBigUInt64LE = defineBigIntMethod(function writeBigUInt64LE (value, offset = 0) {\n return wrtBigUInt64LE(this, value, offset, BigInt(0), BigInt('0xffffffffffffffff'))\n})\n\nBuffer.prototype.writeBigUInt64BE = defineBigIntMethod(function writeBigUInt64BE (value, offset = 0) {\n return wrtBigUInt64BE(this, value, offset, BigInt(0), BigInt('0xffffffffffffffff'))\n})\n\nBuffer.prototype.writeIntLE = function writeIntLE (value, offset, byteLength, noAssert) {\n value = +value\n offset = offset >>> 0\n if (!noAssert) {\n const limit = Math.pow(2, (8 * byteLength) - 1)\n\n checkInt(this, value, offset, byteLength, limit - 1, -limit)\n }\n\n let i = 0\n let mul = 1\n let sub = 0\n this[offset] = value & 0xFF\n while (++i < byteLength && (mul *= 0x100)) {\n if (value < 0 && sub === 0 && this[offset + i - 1] !== 0) {\n sub = 1\n }\n this[offset + i] = ((value / mul) >> 0) - sub & 0xFF\n }\n\n return offset + byteLength\n}\n\nBuffer.prototype.writeIntBE = function writeIntBE (value, offset, byteLength, noAssert) {\n value = +value\n offset = offset >>> 0\n if (!noAssert) {\n const limit = Math.pow(2, (8 * byteLength) - 1)\n\n checkInt(this, value, offset, byteLength, limit - 1, -limit)\n }\n\n let i = byteLength - 1\n let mul = 1\n let sub = 0\n this[offset + i] = value & 0xFF\n while (--i >= 0 && (mul *= 0x100)) {\n if (value < 0 && sub === 0 && this[offset + i + 1] !== 0) {\n sub = 1\n }\n this[offset + i] = ((value / mul) >> 0) - sub & 0xFF\n }\n\n return offset + byteLength\n}\n\nBuffer.prototype.writeInt8 = function writeInt8 (value, offset, noAssert) {\n value = +value\n offset = offset >>> 0\n if (!noAssert) checkInt(this, value, offset, 1, 0x7f, -0x80)\n if (value < 0) value = 0xff + value + 1\n this[offset] = (value & 0xff)\n return offset + 1\n}\n\nBuffer.prototype.writeInt16LE = function writeInt16LE (value, offset, noAssert) {\n value = +value\n offset = offset >>> 0\n if (!noAssert) checkInt(this, value, offset, 2, 0x7fff, -0x8000)\n this[offset] = (value & 0xff)\n this[offset + 1] = (value >>> 8)\n return offset + 2\n}\n\nBuffer.prototype.writeInt16BE = function writeInt16BE (value, offset, noAssert) {\n value = +value\n offset = offset >>> 0\n if (!noAssert) checkInt(this, value, offset, 2, 0x7fff, -0x8000)\n this[offset] = (value >>> 8)\n this[offset + 1] = (value & 0xff)\n return offset + 2\n}\n\nBuffer.prototype.writeInt32LE = function writeInt32LE (value, offset, noAssert) {\n value = +value\n offset = offset >>> 0\n if (!noAssert) checkInt(this, value, offset, 4, 0x7fffffff, -0x80000000)\n this[offset] = (value & 0xff)\n this[offset + 1] = (value >>> 8)\n this[offset + 2] = (value >>> 16)\n this[offset + 3] = (value >>> 24)\n return offset + 4\n}\n\nBuffer.prototype.writeInt32BE = function writeInt32BE (value, offset, noAssert) {\n value = +value\n offset = offset >>> 0\n if (!noAssert) checkInt(this, value, offset, 4, 0x7fffffff, -0x80000000)\n if (value < 0) value = 0xffffffff + value + 1\n this[offset] = (value >>> 24)\n this[offset + 1] = (value >>> 16)\n this[offset + 2] = (value >>> 8)\n this[offset + 3] = (value & 0xff)\n return offset + 4\n}\n\nBuffer.prototype.writeBigInt64LE = defineBigIntMethod(function writeBigInt64LE (value, offset = 0) {\n return wrtBigUInt64LE(this, value, offset, -BigInt('0x8000000000000000'), BigInt('0x7fffffffffffffff'))\n})\n\nBuffer.prototype.writeBigInt64BE = defineBigIntMethod(function writeBigInt64BE (value, offset = 0) {\n return wrtBigUInt64BE(this, value, offset, -BigInt('0x8000000000000000'), BigInt('0x7fffffffffffffff'))\n})\n\nfunction checkIEEE754 (buf, value, offset, ext, max, min) {\n if (offset + ext > buf.length) throw new RangeError('Index out of range')\n if (offset < 0) throw new RangeError('Index out of range')\n}\n\nfunction writeFloat (buf, value, offset, littleEndian, noAssert) {\n value = +value\n offset = offset >>> 0\n if (!noAssert) {\n checkIEEE754(buf, value, offset, 4, 3.4028234663852886e+38, -3.4028234663852886e+38)\n }\n ieee754.write(buf, value, offset, littleEndian, 23, 4)\n return offset + 4\n}\n\nBuffer.prototype.writeFloatLE = function writeFloatLE (value, offset, noAssert) {\n return writeFloat(this, value, offset, true, noAssert)\n}\n\nBuffer.prototype.writeFloatBE = function writeFloatBE (value, offset, noAssert) {\n return writeFloat(this, value, offset, false, noAssert)\n}\n\nfunction writeDouble (buf, value, offset, littleEndian, noAssert) {\n value = +value\n offset = offset >>> 0\n if (!noAssert) {\n checkIEEE754(buf, value, offset, 8, 1.7976931348623157E+308, -1.7976931348623157E+308)\n }\n ieee754.write(buf, value, offset, littleEndian, 52, 8)\n return offset + 8\n}\n\nBuffer.prototype.writeDoubleLE = function writeDoubleLE (value, offset, noAssert) {\n return writeDouble(this, value, offset, true, noAssert)\n}\n\nBuffer.prototype.writeDoubleBE = function writeDoubleBE (value, offset, noAssert) {\n return writeDouble(this, value, offset, false, noAssert)\n}\n\n// copy(targetBuffer, targetStart=0, sourceStart=0, sourceEnd=buffer.length)\nBuffer.prototype.copy = function copy (target, targetStart, start, end) {\n if (!Buffer.isBuffer(target)) throw new TypeError('argument should be a Buffer')\n if (!start) start = 0\n if (!end && end !== 0) end = this.length\n if (targetStart >= target.length) targetStart = target.length\n if (!targetStart) targetStart = 0\n if (end > 0 && end < start) end = start\n\n // Copy 0 bytes; we're done\n if (end === start) return 0\n if (target.length === 0 || this.length === 0) return 0\n\n // Fatal error conditions\n if (targetStart < 0) {\n throw new RangeError('targetStart out of bounds')\n }\n if (start < 0 || start >= this.length) throw new RangeError('Index out of range')\n if (end < 0) throw new RangeError('sourceEnd out of bounds')\n\n // Are we oob?\n if (end > this.length) end = this.length\n if (target.length - targetStart < end - start) {\n end = target.length - targetStart + start\n }\n\n const len = end - start\n\n if (this === target && typeof Uint8Array.prototype.copyWithin === 'function') {\n // Use built-in when available, missing from IE11\n this.copyWithin(targetStart, start, end)\n } else {\n Uint8Array.prototype.set.call(\n target,\n this.subarray(start, end),\n targetStart\n )\n }\n\n return len\n}\n\n// Usage:\n// buffer.fill(number[, offset[, end]])\n// buffer.fill(buffer[, offset[, end]])\n// buffer.fill(string[, offset[, end]][, encoding])\nBuffer.prototype.fill = function fill (val, start, end, encoding) {\n // Handle string cases:\n if (typeof val === 'string') {\n if (typeof start === 'string') {\n encoding = start\n start = 0\n end = this.length\n } else if (typeof end === 'string') {\n encoding = end\n end = this.length\n }\n if (encoding !== undefined && typeof encoding !== 'string') {\n throw new TypeError('encoding must be a string')\n }\n if (typeof encoding === 'string' && !Buffer.isEncoding(encoding)) {\n throw new TypeError('Unknown encoding: ' + encoding)\n }\n if (val.length === 1) {\n const code = val.charCodeAt(0)\n if ((encoding === 'utf8' && code < 128) ||\n encoding === 'latin1') {\n // Fast path: If `val` fits into a single byte, use that numeric value.\n val = code\n }\n }\n } else if (typeof val === 'number') {\n val = val & 255\n } else if (typeof val === 'boolean') {\n val = Number(val)\n }\n\n // Invalid ranges are not set to a default, so can range check early.\n if (start < 0 || this.length < start || this.length < end) {\n throw new RangeError('Out of range index')\n }\n\n if (end <= start) {\n return this\n }\n\n start = start >>> 0\n end = end === undefined ? this.length : end >>> 0\n\n if (!val) val = 0\n\n let i\n if (typeof val === 'number') {\n for (i = start; i < end; ++i) {\n this[i] = val\n }\n } else {\n const bytes = Buffer.isBuffer(val)\n ? val\n : Buffer.from(val, encoding)\n const len = bytes.length\n if (len === 0) {\n throw new TypeError('The value \"' + val +\n '\" is invalid for argument \"value\"')\n }\n for (i = 0; i < end - start; ++i) {\n this[i + start] = bytes[i % len]\n }\n }\n\n return this\n}\n\n// CUSTOM ERRORS\n// =============\n\n// Simplified versions from Node, changed for Buffer-only usage\nconst errors = {}\nfunction E (sym, getMessage, Base) {\n errors[sym] = class NodeError extends Base {\n constructor () {\n super()\n\n Object.defineProperty(this, 'message', {\n value: getMessage.apply(this, arguments),\n writable: true,\n configurable: true\n })\n\n // Add the error code to the name to include it in the stack trace.\n this.name = `${this.name} [${sym}]`\n // Access the stack to generate the error message including the error code\n // from the name.\n this.stack // eslint-disable-line no-unused-expressions\n // Reset the name to the actual name.\n delete this.name\n }\n\n get code () {\n return sym\n }\n\n set code (value) {\n Object.defineProperty(this, 'code', {\n configurable: true,\n enumerable: true,\n value,\n writable: true\n })\n }\n\n toString () {\n return `${this.name} [${sym}]: ${this.message}`\n }\n }\n}\n\nE('ERR_BUFFER_OUT_OF_BOUNDS',\n function (name) {\n if (name) {\n return `${name} is outside of buffer bounds`\n }\n\n return 'Attempt to access memory outside buffer bounds'\n }, RangeError)\nE('ERR_INVALID_ARG_TYPE',\n function (name, actual) {\n return `The \"${name}\" argument must be of type number. Received type ${typeof actual}`\n }, TypeError)\nE('ERR_OUT_OF_RANGE',\n function (str, range, input) {\n let msg = `The value of \"${str}\" is out of range.`\n let received = input\n if (Number.isInteger(input) && Math.abs(input) > 2 ** 32) {\n received = addNumericalSeparator(String(input))\n } else if (typeof input === 'bigint') {\n received = String(input)\n if (input > BigInt(2) ** BigInt(32) || input < -(BigInt(2) ** BigInt(32))) {\n received = addNumericalSeparator(received)\n }\n received += 'n'\n }\n msg += ` It must be ${range}. Received ${received}`\n return msg\n }, RangeError)\n\nfunction addNumericalSeparator (val) {\n let res = ''\n let i = val.length\n const start = val[0] === '-' ? 1 : 0\n for (; i >= start + 4; i -= 3) {\n res = `_${val.slice(i - 3, i)}${res}`\n }\n return `${val.slice(0, i)}${res}`\n}\n\n// CHECK FUNCTIONS\n// ===============\n\nfunction checkBounds (buf, offset, byteLength) {\n validateNumber(offset, 'offset')\n if (buf[offset] === undefined || buf[offset + byteLength] === undefined) {\n boundsError(offset, buf.length - (byteLength + 1))\n }\n}\n\nfunction checkIntBI (value, min, max, buf, offset, byteLength) {\n if (value > max || value < min) {\n const n = typeof min === 'bigint' ? 'n' : ''\n let range\n if (byteLength > 3) {\n if (min === 0 || min === BigInt(0)) {\n range = `>= 0${n} and < 2${n} ** ${(byteLength + 1) * 8}${n}`\n } else {\n range = `>= -(2${n} ** ${(byteLength + 1) * 8 - 1}${n}) and < 2 ** ` +\n `${(byteLength + 1) * 8 - 1}${n}`\n }\n } else {\n range = `>= ${min}${n} and <= ${max}${n}`\n }\n throw new errors.ERR_OUT_OF_RANGE('value', range, value)\n }\n checkBounds(buf, offset, byteLength)\n}\n\nfunction validateNumber (value, name) {\n if (typeof value !== 'number') {\n throw new errors.ERR_INVALID_ARG_TYPE(name, 'number', value)\n }\n}\n\nfunction boundsError (value, length, type) {\n if (Math.floor(value) !== value) {\n validateNumber(value, type)\n throw new errors.ERR_OUT_OF_RANGE(type || 'offset', 'an integer', value)\n }\n\n if (length < 0) {\n throw new errors.ERR_BUFFER_OUT_OF_BOUNDS()\n }\n\n throw new errors.ERR_OUT_OF_RANGE(type || 'offset',\n `>= ${type ? 1 : 0} and <= ${length}`,\n value)\n}\n\n// HELPER FUNCTIONS\n// ================\n\nconst INVALID_BASE64_RE = /[^+/0-9A-Za-z-_]/g\n\nfunction base64clean (str) {\n // Node takes equal signs as end of the Base64 encoding\n str = str.split('=')[0]\n // Node strips out invalid characters like \\n and \\t from the string, base64-js does not\n str = str.trim().replace(INVALID_BASE64_RE, '')\n // Node converts strings with length < 2 to ''\n if (str.length < 2) return ''\n // Node allows for non-padded base64 strings (missing trailing ===), base64-js does not\n while (str.length % 4 !== 0) {\n str = str + '='\n }\n return str\n}\n\nfunction utf8ToBytes (string, units) {\n units = units || Infinity\n let codePoint\n const length = string.length\n let leadSurrogate = null\n const bytes = []\n\n for (let i = 0; i < length; ++i) {\n codePoint = string.charCodeAt(i)\n\n // is surrogate component\n if (codePoint > 0xD7FF && codePoint < 0xE000) {\n // last char was a lead\n if (!leadSurrogate) {\n // no lead yet\n if (codePoint > 0xDBFF) {\n // unexpected trail\n if ((units -= 3) > -1) bytes.push(0xEF, 0xBF, 0xBD)\n continue\n } else if (i + 1 === length) {\n // unpaired lead\n if ((units -= 3) > -1) bytes.push(0xEF, 0xBF, 0xBD)\n continue\n }\n\n // valid lead\n leadSurrogate = codePoint\n\n continue\n }\n\n // 2 leads in a row\n if (codePoint < 0xDC00) {\n if ((units -= 3) > -1) bytes.push(0xEF, 0xBF, 0xBD)\n leadSurrogate = codePoint\n continue\n }\n\n // valid surrogate pair\n codePoint = (leadSurrogate - 0xD800 << 10 | codePoint - 0xDC00) + 0x10000\n } else if (leadSurrogate) {\n // valid bmp char, but last char was a lead\n if ((units -= 3) > -1) bytes.push(0xEF, 0xBF, 0xBD)\n }\n\n leadSurrogate = null\n\n // encode utf8\n if (codePoint < 0x80) {\n if ((units -= 1) < 0) break\n bytes.push(codePoint)\n } else if (codePoint < 0x800) {\n if ((units -= 2) < 0) break\n bytes.push(\n codePoint >> 0x6 | 0xC0,\n codePoint & 0x3F | 0x80\n )\n } else if (codePoint < 0x10000) {\n if ((units -= 3) < 0) break\n bytes.push(\n codePoint >> 0xC | 0xE0,\n codePoint >> 0x6 & 0x3F | 0x80,\n codePoint & 0x3F | 0x80\n )\n } else if (codePoint < 0x110000) {\n if ((units -= 4) < 0) break\n bytes.push(\n codePoint >> 0x12 | 0xF0,\n codePoint >> 0xC & 0x3F | 0x80,\n codePoint >> 0x6 & 0x3F | 0x80,\n codePoint & 0x3F | 0x80\n )\n } else {\n throw new Error('Invalid code point')\n }\n }\n\n return bytes\n}\n\nfunction asciiToBytes (str) {\n const byteArray = []\n for (let i = 0; i < str.length; ++i) {\n // Node's code seems to be doing this and not & 0x7F..\n byteArray.push(str.charCodeAt(i) & 0xFF)\n }\n return byteArray\n}\n\nfunction utf16leToBytes (str, units) {\n let c, hi, lo\n const byteArray = []\n for (let i = 0; i < str.length; ++i) {\n if ((units -= 2) < 0) break\n\n c = str.charCodeAt(i)\n hi = c >> 8\n lo = c % 256\n byteArray.push(lo)\n byteArray.push(hi)\n }\n\n return byteArray\n}\n\nfunction base64ToBytes (str) {\n return base64.toByteArray(base64clean(str))\n}\n\nfunction blitBuffer (src, dst, offset, length) {\n let i\n for (i = 0; i < length; ++i) {\n if ((i + offset >= dst.length) || (i >= src.length)) break\n dst[i + offset] = src[i]\n }\n return i\n}\n\n// ArrayBuffer or Uint8Array objects from other contexts (i.e. iframes) do not pass\n// the `instanceof` check but they should be treated as of that type.\n// See: https://github.com/feross/buffer/issues/166\nfunction isInstance (obj, type) {\n return obj instanceof type ||\n (obj != null && obj.constructor != null && obj.constructor.name != null &&\n obj.constructor.name === type.name)\n}\nfunction numberIsNaN (obj) {\n // For IE11 support\n return obj !== obj // eslint-disable-line no-self-compare\n}\n\n// Create lookup table for `toString('hex')`\n// See: https://github.com/feross/buffer/issues/219\nconst hexSliceLookupTable = (function () {\n const alphabet = '0123456789abcdef'\n const table = new Array(256)\n for (let i = 0; i < 16; ++i) {\n const i16 = i * 16\n for (let j = 0; j < 16; ++j) {\n table[i16 + j] = alphabet[i] + alphabet[j]\n }\n }\n return table\n})()\n\n// Return not function with Error if BigInt not supported\nfunction defineBigIntMethod (fn) {\n return typeof BigInt === 'undefined' ? BufferBigIntNotDefined : fn\n}\n\nfunction BufferBigIntNotDefined () {\n throw new Error('BigInt not supported')\n}\n","// extracted by extract-css-chunks-webpack-plugin\nmodule.exports = {};","// extracted by extract-css-chunks-webpack-plugin\nmodule.exports = {\"nodeStrokeWidth\":\"0.8\",\"directionArrowSize\":\"6\",\"directionArrowWidth\":\"0.7\",\"node\":\"fornac-node\",\"directionArrow\":\"fornac-directionArrow\",\"plot\":\"fornac-plot\",\"selectedNode\":\"fornac-selectedNode\",\"nodeLabel\":\"fornac-nodeLabel\",\"link\":\"fornac-link\",\"plotLabel\":\"fornac-plotLabel\",\"transparent\":\"fornac-transparent\",\"dragLine\":\"fornac-dragLine\",\"mouseEventHelper\":\"fornac-mouseEventHelper\"};","/*! ieee754. BSD-3-Clause License. Feross Aboukhadijeh */\nexports.read = function (buffer, offset, isLE, mLen, nBytes) {\n var e, m\n var eLen = (nBytes * 8) - mLen - 1\n var eMax = (1 << eLen) - 1\n var eBias = eMax >> 1\n var nBits = -7\n var i = isLE ? (nBytes - 1) : 0\n var d = isLE ? -1 : 1\n var s = buffer[offset + i]\n\n i += d\n\n e = s & ((1 << (-nBits)) - 1)\n s >>= (-nBits)\n nBits += eLen\n for (; nBits > 0; e = (e * 256) + buffer[offset + i], i += d, nBits -= 8) {}\n\n m = e & ((1 << (-nBits)) - 1)\n e >>= (-nBits)\n nBits += mLen\n for (; nBits > 0; m = (m * 256) + buffer[offset + i], i += d, nBits -= 8) {}\n\n if (e === 0) {\n e = 1 - eBias\n } else if (e === eMax) {\n return m ? NaN : ((s ? -1 : 1) * Infinity)\n } else {\n m = m + Math.pow(2, mLen)\n e = e - eBias\n }\n return (s ? -1 : 1) * m * Math.pow(2, e - mLen)\n}\n\nexports.write = function (buffer, value, offset, isLE, mLen, nBytes) {\n var e, m, c\n var eLen = (nBytes * 8) - mLen - 1\n var eMax = (1 << eLen) - 1\n var eBias = eMax >> 1\n var rt = (mLen === 23 ? Math.pow(2, -24) - Math.pow(2, -77) : 0)\n var i = isLE ? 0 : (nBytes - 1)\n var d = isLE ? 1 : -1\n var s = value < 0 || (value === 0 && 1 / value < 0) ? 1 : 0\n\n value = Math.abs(value)\n\n if (isNaN(value) || value === Infinity) {\n m = isNaN(value) ? 1 : 0\n e = eMax\n } else {\n e = Math.floor(Math.log(value) / Math.LN2)\n if (value * (c = Math.pow(2, -e)) < 1) {\n e--\n c *= 2\n }\n if (e + eBias >= 1) {\n value += rt / c\n } else {\n value += rt * Math.pow(2, 1 - eBias)\n }\n if (value * c >= 2) {\n e++\n c /= 2\n }\n\n if (e + eBias >= eMax) {\n m = 0\n e = eMax\n } else if (e + eBias >= 1) {\n m = ((value * c) - 1) * Math.pow(2, mLen)\n e = e + eBias\n } else {\n m = value * Math.pow(2, eBias - 1) * Math.pow(2, mLen)\n e = 0\n }\n }\n\n for (; mLen >= 8; buffer[offset + i] = m & 0xff, i += d, m /= 256, mLen -= 8) {}\n\n e = (e << mLen) | m\n eLen += mLen\n for (; eLen > 0; buffer[offset + i] = e & 0xff, i += d, e /= 256, eLen -= 8) {}\n\n buffer[offset + i - d] |= s * 128\n}\n","// The MIT License (MIT)\n//\n// Copyright (c) 2014 Jonas Finnemann Jensen\n//\n// Permission is hereby granted, free of charge, to any person obtaining a copy\n// of this software and associated documentation files (the \"Software\"), to deal\n// in the Software without restriction, including without limitation the rights\n// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n// copies of the Software, and to permit persons to whom the Software is\n// furnished to do so, subject to the following conditions:\n//\n// The above copyright notice and this permission notice shall be included in\n// all copies or substantial portions of the Software.\n//\n// THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n// THE SOFTWARE.\n\nmodule.exports = require('./slugid');\n","// The MIT License (MIT)\n//\n// Copyright (c) 2014 Jonas Finnemann Jensen\n//\n// Permission is hereby granted, free of charge, to any person obtaining a copy\n// of this software and associated documentation files (the \"Software\"), to deal\n// in the Software without restriction, including without limitation the rights\n// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n// copies of the Software, and to permit persons to whom the Software is\n// furnished to do so, subject to the following conditions:\n//\n// The above copyright notice and this permission notice shall be included in\n// all copies or substantial portions of the Software.\n//\n// THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n// THE SOFTWARE.\n\nvar uuid = require('uuid');\n\n/** @type {(bytes: Uint8Array) => string} */\nvar toBase64 = (() => {\n if (typeof Buffer !== 'undefined') {\n return (bytes) => Buffer.from(bytes).toString('base64');\n }\n return (bytes) => btoa(String.fromCharCode(...bytes));\n})();\n\n/** @type {(base64: string) => Uint8Array | Buffer} */\nvar fromBase64 = (() => {\n if (typeof Buffer !== 'undefined') {\n return (base64) => Buffer.from(base64, 'base64');\n }\n return (base64) => Uint8Array.from(atob(base64), c => c.charCodeAt(0));\n})();\n\n/**\n * Returns the given uuid as a 22 character slug. This can be a regular v4\n * slug or a \"nice\" slug.\n */\nexports.encode = function(uuid_) {\n var bytes = uuid.parse(uuid_);\n var base64 = toBase64(bytes);\n var slug = base64\n .replace(/\\+/g, '-') // Replace + with - (see RFC 4648, sec. 5)\n .replace(/\\//g, '_') // Replace / with _ (see RFC 4648, sec. 5)\n .substring(0, 22); // Drop '==' padding\n return slug;\n};\n\n/**\n * Returns the uuid represented by the given v4 or \"nice\" slug\n */\nexports.decode = function(slug) {\n var base64 = slug\n .replace(/-/g, '+')\n .replace(/_/g, '/')\n + '==';\n return uuid.stringify(fromBase64(base64));\n};\n\n/**\n * Returns a randomly generated uuid v4 compliant slug\n */\nexports.v4 = function() {\n var bytes = uuid.v4(null, new Uint8Array(16));\n var base64 = toBase64(bytes);\n var slug = base64\n .replace(/\\+/g, '-') // Replace + with - (see RFC 4648, sec. 5)\n .replace(/\\//g, '_') // Replace / with _ (see RFC 4648, sec. 5)\n .substring(0, 22); // Drop '==' padding\n return slug;\n};\n\n/**\n * Returns a randomly generated uuid v4 compliant slug which conforms to a set\n * of \"nice\" properties, at the cost of some entropy. Currently this means one\n * extra fixed bit (the first bit of the uuid is set to 0) which guarantees the\n * slug will begin with [A-Za-f]. For example such slugs don't require special\n * handling when used as command line parameters (whereas non-nice slugs may\n * start with `-` which can confuse command line tools).\n *\n * Potentially other \"nice\" properties may be added in future to further\n * restrict the range of potential uuids that may be generated.\n */\nexports.nice = function() {\n var bytes = uuid.v4(null, new Uint8Array(16));\n bytes[0] = bytes[0] & 0x7f; // unset first bit to ensure [A-Za-f] first char\n var base64 = toBase64(bytes);\n var slug = base64\n .replace(/\\+/g, '-') // Replace + with - (see RFC 4648, sec. 5)\n .replace(/\\//g, '_') // Replace / with _ (see RFC 4648, sec. 5)\n .substring(0, 22); // Drop '==' padding\n return slug;\n};\n","// Unique ID creation requires a high quality random # generator. In the browser we therefore\n// require the crypto API and do not support built-in fallback to lower quality random number\n// generators (like Math.random()).\nvar getRandomValues;\nvar rnds8 = new Uint8Array(16);\nexport default function rng() {\n // lazy load so that environments that need to polyfill have a chance to do so\n if (!getRandomValues) {\n // getRandomValues needs to be invoked in a context where \"this\" is a Crypto implementation. Also,\n // find the complete implementation of crypto (msCrypto) on IE11.\n getRandomValues = typeof crypto !== 'undefined' && crypto.getRandomValues && crypto.getRandomValues.bind(crypto) || typeof msCrypto !== 'undefined' && typeof msCrypto.getRandomValues === 'function' && msCrypto.getRandomValues.bind(msCrypto);\n\n if (!getRandomValues) {\n throw new Error('crypto.getRandomValues() not supported. See https://github.com/uuidjs/uuid#getrandomvalues-not-supported');\n }\n }\n\n return getRandomValues(rnds8);\n}","export default /^(?:[0-9a-f]{8}-[0-9a-f]{4}-[1-5][0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}|00000000-0000-0000-0000-000000000000)$/i;","import REGEX from './regex.js';\n\nfunction validate(uuid) {\n return typeof uuid === 'string' && REGEX.test(uuid);\n}\n\nexport default validate;","import validate from './validate.js';\n/**\n * Convert array of 16 byte values to UUID string format of the form:\n * XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX\n */\n\nvar byteToHex = [];\n\nfor (var i = 0; i < 256; ++i) {\n byteToHex.push((i + 0x100).toString(16).substr(1));\n}\n\nfunction stringify(arr) {\n var offset = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 0;\n // Note: Be careful editing this code! It's been tuned for performance\n // and works in ways you may not expect. See https://github.com/uuidjs/uuid/pull/434\n var uuid = (byteToHex[arr[offset + 0]] + byteToHex[arr[offset + 1]] + byteToHex[arr[offset + 2]] + byteToHex[arr[offset + 3]] + '-' + byteToHex[arr[offset + 4]] + byteToHex[arr[offset + 5]] + '-' + byteToHex[arr[offset + 6]] + byteToHex[arr[offset + 7]] + '-' + byteToHex[arr[offset + 8]] + byteToHex[arr[offset + 9]] + '-' + byteToHex[arr[offset + 10]] + byteToHex[arr[offset + 11]] + byteToHex[arr[offset + 12]] + byteToHex[arr[offset + 13]] + byteToHex[arr[offset + 14]] + byteToHex[arr[offset + 15]]).toLowerCase(); // Consistency check for valid UUID. If this throws, it's likely due to one\n // of the following:\n // - One or more input array values don't map to a hex octet (leading to\n // \"undefined\" in the uuid)\n // - Invalid input values for the RFC `version` or `variant` fields\n\n if (!validate(uuid)) {\n throw TypeError('Stringified UUID is invalid');\n }\n\n return uuid;\n}\n\nexport default stringify;","import rng from './rng.js';\nimport stringify from './stringify.js'; // **`v1()` - Generate time-based UUID**\n//\n// Inspired by https://github.com/LiosK/UUID.js\n// and http://docs.python.org/library/uuid.html\n\nvar _nodeId;\n\nvar _clockseq; // Previous uuid creation time\n\n\nvar _lastMSecs = 0;\nvar _lastNSecs = 0; // See https://github.com/uuidjs/uuid for API details\n\nfunction v1(options, buf, offset) {\n var i = buf && offset || 0;\n var b = buf || new Array(16);\n options = options || {};\n var node = options.node || _nodeId;\n var clockseq = options.clockseq !== undefined ? options.clockseq : _clockseq; // node and clockseq need to be initialized to random values if they're not\n // specified. We do this lazily to minimize issues related to insufficient\n // system entropy. See #189\n\n if (node == null || clockseq == null) {\n var seedBytes = options.random || (options.rng || rng)();\n\n if (node == null) {\n // Per 4.5, create and 48-bit node id, (47 random bits + multicast bit = 1)\n node = _nodeId = [seedBytes[0] | 0x01, seedBytes[1], seedBytes[2], seedBytes[3], seedBytes[4], seedBytes[5]];\n }\n\n if (clockseq == null) {\n // Per 4.2.2, randomize (14 bit) clockseq\n clockseq = _clockseq = (seedBytes[6] << 8 | seedBytes[7]) & 0x3fff;\n }\n } // UUID timestamps are 100 nano-second units since the Gregorian epoch,\n // (1582-10-15 00:00). JSNumbers aren't precise enough for this, so\n // time is handled internally as 'msecs' (integer milliseconds) and 'nsecs'\n // (100-nanoseconds offset from msecs) since unix epoch, 1970-01-01 00:00.\n\n\n var msecs = options.msecs !== undefined ? options.msecs : Date.now(); // Per 4.2.1.2, use count of uuid's generated during the current clock\n // cycle to simulate higher resolution clock\n\n var nsecs = options.nsecs !== undefined ? options.nsecs : _lastNSecs + 1; // Time since last uuid creation (in msecs)\n\n var dt = msecs - _lastMSecs + (nsecs - _lastNSecs) / 10000; // Per 4.2.1.2, Bump clockseq on clock regression\n\n if (dt < 0 && options.clockseq === undefined) {\n clockseq = clockseq + 1 & 0x3fff;\n } // Reset nsecs if clock regresses (new clockseq) or we've moved onto a new\n // time interval\n\n\n if ((dt < 0 || msecs > _lastMSecs) && options.nsecs === undefined) {\n nsecs = 0;\n } // Per 4.2.1.2 Throw error if too many uuids are requested\n\n\n if (nsecs >= 10000) {\n throw new Error(\"uuid.v1(): Can't create more than 10M uuids/sec\");\n }\n\n _lastMSecs = msecs;\n _lastNSecs = nsecs;\n _clockseq = clockseq; // Per 4.1.4 - Convert from unix epoch to Gregorian epoch\n\n msecs += 12219292800000; // `time_low`\n\n var tl = ((msecs & 0xfffffff) * 10000 + nsecs) % 0x100000000;\n b[i++] = tl >>> 24 & 0xff;\n b[i++] = tl >>> 16 & 0xff;\n b[i++] = tl >>> 8 & 0xff;\n b[i++] = tl & 0xff; // `time_mid`\n\n var tmh = msecs / 0x100000000 * 10000 & 0xfffffff;\n b[i++] = tmh >>> 8 & 0xff;\n b[i++] = tmh & 0xff; // `time_high_and_version`\n\n b[i++] = tmh >>> 24 & 0xf | 0x10; // include version\n\n b[i++] = tmh >>> 16 & 0xff; // `clock_seq_hi_and_reserved` (Per 4.2.2 - include variant)\n\n b[i++] = clockseq >>> 8 | 0x80; // `clock_seq_low`\n\n b[i++] = clockseq & 0xff; // `node`\n\n for (var n = 0; n < 6; ++n) {\n b[i + n] = node[n];\n }\n\n return buf || stringify(b);\n}\n\nexport default v1;","import validate from './validate.js';\n\nfunction parse(uuid) {\n if (!validate(uuid)) {\n throw TypeError('Invalid UUID');\n }\n\n var v;\n var arr = new Uint8Array(16); // Parse ########-....-....-....-............\n\n arr[0] = (v = parseInt(uuid.slice(0, 8), 16)) >>> 24;\n arr[1] = v >>> 16 & 0xff;\n arr[2] = v >>> 8 & 0xff;\n arr[3] = v & 0xff; // Parse ........-####-....-....-............\n\n arr[4] = (v = parseInt(uuid.slice(9, 13), 16)) >>> 8;\n arr[5] = v & 0xff; // Parse ........-....-####-....-............\n\n arr[6] = (v = parseInt(uuid.slice(14, 18), 16)) >>> 8;\n arr[7] = v & 0xff; // Parse ........-....-....-####-............\n\n arr[8] = (v = parseInt(uuid.slice(19, 23), 16)) >>> 8;\n arr[9] = v & 0xff; // Parse ........-....-....-....-############\n // (Use \"/\" to avoid 32-bit truncation when bit-shifting high-order bytes)\n\n arr[10] = (v = parseInt(uuid.slice(24, 36), 16)) / 0x10000000000 & 0xff;\n arr[11] = v / 0x100000000 & 0xff;\n arr[12] = v >>> 24 & 0xff;\n arr[13] = v >>> 16 & 0xff;\n arr[14] = v >>> 8 & 0xff;\n arr[15] = v & 0xff;\n return arr;\n}\n\nexport default parse;","import stringify from './stringify.js';\nimport parse from './parse.js';\n\nfunction stringToBytes(str) {\n str = unescape(encodeURIComponent(str)); // UTF8 escape\n\n var bytes = [];\n\n for (var i = 0; i < str.length; ++i) {\n bytes.push(str.charCodeAt(i));\n }\n\n return bytes;\n}\n\nexport var DNS = '6ba7b810-9dad-11d1-80b4-00c04fd430c8';\nexport var URL = '6ba7b811-9dad-11d1-80b4-00c04fd430c8';\nexport default function (name, version, hashfunc) {\n function generateUUID(value, namespace, buf, offset) {\n if (typeof value === 'string') {\n value = stringToBytes(value);\n }\n\n if (typeof namespace === 'string') {\n namespace = parse(namespace);\n }\n\n if (namespace.length !== 16) {\n throw TypeError('Namespace must be array-like (16 iterable integer values, 0-255)');\n } // Compute hash of namespace and value, Per 4.3\n // Future: Use spread syntax when supported on all platforms, e.g. `bytes =\n // hashfunc([...namespace, ... value])`\n\n\n var bytes = new Uint8Array(16 + value.length);\n bytes.set(namespace);\n bytes.set(value, namespace.length);\n bytes = hashfunc(bytes);\n bytes[6] = bytes[6] & 0x0f | version;\n bytes[8] = bytes[8] & 0x3f | 0x80;\n\n if (buf) {\n offset = offset || 0;\n\n for (var i = 0; i < 16; ++i) {\n buf[offset + i] = bytes[i];\n }\n\n return buf;\n }\n\n return stringify(bytes);\n } // Function#name is not settable on some platforms (#270)\n\n\n try {\n generateUUID.name = name; // eslint-disable-next-line no-empty\n } catch (err) {} // For CommonJS default export support\n\n\n generateUUID.DNS = DNS;\n generateUUID.URL = URL;\n return generateUUID;\n}","/*\n * Browser-compatible JavaScript MD5\n *\n * Modification of JavaScript MD5\n * https://github.com/blueimp/JavaScript-MD5\n *\n * Copyright 2011, Sebastian Tschan\n * https://blueimp.net\n *\n * Licensed under the MIT license:\n * https://opensource.org/licenses/MIT\n *\n * Based on\n * A JavaScript implementation of the RSA Data Security, Inc. MD5 Message\n * Digest Algorithm, as defined in RFC 1321.\n * Version 2.2 Copyright (C) Paul Johnston 1999 - 2009\n * Other contributors: Greg Holt, Andrew Kepert, Ydnar, Lostinet\n * Distributed under the BSD License\n * See http://pajhome.org.uk/crypt/md5 for more info.\n */\nfunction md5(bytes) {\n if (typeof bytes === 'string') {\n var msg = unescape(encodeURIComponent(bytes)); // UTF8 escape\n\n bytes = new Uint8Array(msg.length);\n\n for (var i = 0; i < msg.length; ++i) {\n bytes[i] = msg.charCodeAt(i);\n }\n }\n\n return md5ToHexEncodedArray(wordsToMd5(bytesToWords(bytes), bytes.length * 8));\n}\n/*\n * Convert an array of little-endian words to an array of bytes\n */\n\n\nfunction md5ToHexEncodedArray(input) {\n var output = [];\n var length32 = input.length * 32;\n var hexTab = '0123456789abcdef';\n\n for (var i = 0; i < length32; i += 8) {\n var x = input[i >> 5] >>> i % 32 & 0xff;\n var hex = parseInt(hexTab.charAt(x >>> 4 & 0x0f) + hexTab.charAt(x & 0x0f), 16);\n output.push(hex);\n }\n\n return output;\n}\n/**\n * Calculate output length with padding and bit length\n */\n\n\nfunction getOutputLength(inputLength8) {\n return (inputLength8 + 64 >>> 9 << 4) + 14 + 1;\n}\n/*\n * Calculate the MD5 of an array of little-endian words, and a bit length.\n */\n\n\nfunction wordsToMd5(x, len) {\n /* append padding */\n x[len >> 5] |= 0x80 << len % 32;\n x[getOutputLength(len) - 1] = len;\n var a = 1732584193;\n var b = -271733879;\n var c = -1732584194;\n var d = 271733878;\n\n for (var i = 0; i < x.length; i += 16) {\n var olda = a;\n var oldb = b;\n var oldc = c;\n var oldd = d;\n a = md5ff(a, b, c, d, x[i], 7, -680876936);\n d = md5ff(d, a, b, c, x[i + 1], 12, -389564586);\n c = md5ff(c, d, a, b, x[i + 2], 17, 606105819);\n b = md5ff(b, c, d, a, x[i + 3], 22, -1044525330);\n a = md5ff(a, b, c, d, x[i + 4], 7, -176418897);\n d = md5ff(d, a, b, c, x[i + 5], 12, 1200080426);\n c = md5ff(c, d, a, b, x[i + 6], 17, -1473231341);\n b = md5ff(b, c, d, a, x[i + 7], 22, -45705983);\n a = md5ff(a, b, c, d, x[i + 8], 7, 1770035416);\n d = md5ff(d, a, b, c, x[i + 9], 12, -1958414417);\n c = md5ff(c, d, a, b, x[i + 10], 17, -42063);\n b = md5ff(b, c, d, a, x[i + 11], 22, -1990404162);\n a = md5ff(a, b, c, d, x[i + 12], 7, 1804603682);\n d = md5ff(d, a, b, c, x[i + 13], 12, -40341101);\n c = md5ff(c, d, a, b, x[i + 14], 17, -1502002290);\n b = md5ff(b, c, d, a, x[i + 15], 22, 1236535329);\n a = md5gg(a, b, c, d, x[i + 1], 5, -165796510);\n d = md5gg(d, a, b, c, x[i + 6], 9, -1069501632);\n c = md5gg(c, d, a, b, x[i + 11], 14, 643717713);\n b = md5gg(b, c, d, a, x[i], 20, -373897302);\n a = md5gg(a, b, c, d, x[i + 5], 5, -701558691);\n d = md5gg(d, a, b, c, x[i + 10], 9, 38016083);\n c = md5gg(c, d, a, b, x[i + 15], 14, -660478335);\n b = md5gg(b, c, d, a, x[i + 4], 20, -405537848);\n a = md5gg(a, b, c, d, x[i + 9], 5, 568446438);\n d = md5gg(d, a, b, c, x[i + 14], 9, -1019803690);\n c = md5gg(c, d, a, b, x[i + 3], 14, -187363961);\n b = md5gg(b, c, d, a, x[i + 8], 20, 1163531501);\n a = md5gg(a, b, c, d, x[i + 13], 5, -1444681467);\n d = md5gg(d, a, b, c, x[i + 2], 9, -51403784);\n c = md5gg(c, d, a, b, x[i + 7], 14, 1735328473);\n b = md5gg(b, c, d, a, x[i + 12], 20, -1926607734);\n a = md5hh(a, b, c, d, x[i + 5], 4, -378558);\n d = md5hh(d, a, b, c, x[i + 8], 11, -2022574463);\n c = md5hh(c, d, a, b, x[i + 11], 16, 1839030562);\n b = md5hh(b, c, d, a, x[i + 14], 23, -35309556);\n a = md5hh(a, b, c, d, x[i + 1], 4, -1530992060);\n d = md5hh(d, a, b, c, x[i + 4], 11, 1272893353);\n c = md5hh(c, d, a, b, x[i + 7], 16, -155497632);\n b = md5hh(b, c, d, a, x[i + 10], 23, -1094730640);\n a = md5hh(a, b, c, d, x[i + 13], 4, 681279174);\n d = md5hh(d, a, b, c, x[i], 11, -358537222);\n c = md5hh(c, d, a, b, x[i + 3], 16, -722521979);\n b = md5hh(b, c, d, a, x[i + 6], 23, 76029189);\n a = md5hh(a, b, c, d, x[i + 9], 4, -640364487);\n d = md5hh(d, a, b, c, x[i + 12], 11, -421815835);\n c = md5hh(c, d, a, b, x[i + 15], 16, 530742520);\n b = md5hh(b, c, d, a, x[i + 2], 23, -995338651);\n a = md5ii(a, b, c, d, x[i], 6, -198630844);\n d = md5ii(d, a, b, c, x[i + 7], 10, 1126891415);\n c = md5ii(c, d, a, b, x[i + 14], 15, -1416354905);\n b = md5ii(b, c, d, a, x[i + 5], 21, -57434055);\n a = md5ii(a, b, c, d, x[i + 12], 6, 1700485571);\n d = md5ii(d, a, b, c, x[i + 3], 10, -1894986606);\n c = md5ii(c, d, a, b, x[i + 10], 15, -1051523);\n b = md5ii(b, c, d, a, x[i + 1], 21, -2054922799);\n a = md5ii(a, b, c, d, x[i + 8], 6, 1873313359);\n d = md5ii(d, a, b, c, x[i + 15], 10, -30611744);\n c = md5ii(c, d, a, b, x[i + 6], 15, -1560198380);\n b = md5ii(b, c, d, a, x[i + 13], 21, 1309151649);\n a = md5ii(a, b, c, d, x[i + 4], 6, -145523070);\n d = md5ii(d, a, b, c, x[i + 11], 10, -1120210379);\n c = md5ii(c, d, a, b, x[i + 2], 15, 718787259);\n b = md5ii(b, c, d, a, x[i + 9], 21, -343485551);\n a = safeAdd(a, olda);\n b = safeAdd(b, oldb);\n c = safeAdd(c, oldc);\n d = safeAdd(d, oldd);\n }\n\n return [a, b, c, d];\n}\n/*\n * Convert an array bytes to an array of little-endian words\n * Characters >255 have their high-byte silently ignored.\n */\n\n\nfunction bytesToWords(input) {\n if (input.length === 0) {\n return [];\n }\n\n var length8 = input.length * 8;\n var output = new Uint32Array(getOutputLength(length8));\n\n for (var i = 0; i < length8; i += 8) {\n output[i >> 5] |= (input[i / 8] & 0xff) << i % 32;\n }\n\n return output;\n}\n/*\n * Add integers, wrapping at 2^32. This uses 16-bit operations internally\n * to work around bugs in some JS interpreters.\n */\n\n\nfunction safeAdd(x, y) {\n var lsw = (x & 0xffff) + (y & 0xffff);\n var msw = (x >> 16) + (y >> 16) + (lsw >> 16);\n return msw << 16 | lsw & 0xffff;\n}\n/*\n * Bitwise rotate a 32-bit number to the left.\n */\n\n\nfunction bitRotateLeft(num, cnt) {\n return num << cnt | num >>> 32 - cnt;\n}\n/*\n * These functions implement the four basic operations the algorithm uses.\n */\n\n\nfunction md5cmn(q, a, b, x, s, t) {\n return safeAdd(bitRotateLeft(safeAdd(safeAdd(a, q), safeAdd(x, t)), s), b);\n}\n\nfunction md5ff(a, b, c, d, x, s, t) {\n return md5cmn(b & c | ~b & d, a, b, x, s, t);\n}\n\nfunction md5gg(a, b, c, d, x, s, t) {\n return md5cmn(b & d | c & ~d, a, b, x, s, t);\n}\n\nfunction md5hh(a, b, c, d, x, s, t) {\n return md5cmn(b ^ c ^ d, a, b, x, s, t);\n}\n\nfunction md5ii(a, b, c, d, x, s, t) {\n return md5cmn(c ^ (b | ~d), a, b, x, s, t);\n}\n\nexport default md5;","import v35 from './v35.js';\nimport md5 from './md5.js';\nvar v3 = v35('v3', 0x30, md5);\nexport default v3;","import rng from './rng.js';\nimport stringify from './stringify.js';\n\nfunction v4(options, buf, offset) {\n options = options || {};\n var rnds = options.random || (options.rng || rng)(); // Per 4.4, set bits for version and `clock_seq_hi_and_reserved`\n\n rnds[6] = rnds[6] & 0x0f | 0x40;\n rnds[8] = rnds[8] & 0x3f | 0x80; // Copy bytes to buffer, if provided\n\n if (buf) {\n offset = offset || 0;\n\n for (var i = 0; i < 16; ++i) {\n buf[offset + i] = rnds[i];\n }\n\n return buf;\n }\n\n return stringify(rnds);\n}\n\nexport default v4;","// Adapted from Chris Veness' SHA1 code at\n// http://www.movable-type.co.uk/scripts/sha1.html\nfunction f(s, x, y, z) {\n switch (s) {\n case 0:\n return x & y ^ ~x & z;\n\n case 1:\n return x ^ y ^ z;\n\n case 2:\n return x & y ^ x & z ^ y & z;\n\n case 3:\n return x ^ y ^ z;\n }\n}\n\nfunction ROTL(x, n) {\n return x << n | x >>> 32 - n;\n}\n\nfunction sha1(bytes) {\n var K = [0x5a827999, 0x6ed9eba1, 0x8f1bbcdc, 0xca62c1d6];\n var H = [0x67452301, 0xefcdab89, 0x98badcfe, 0x10325476, 0xc3d2e1f0];\n\n if (typeof bytes === 'string') {\n var msg = unescape(encodeURIComponent(bytes)); // UTF8 escape\n\n bytes = [];\n\n for (var i = 0; i < msg.length; ++i) {\n bytes.push(msg.charCodeAt(i));\n }\n } else if (!Array.isArray(bytes)) {\n // Convert Array-like to Array\n bytes = Array.prototype.slice.call(bytes);\n }\n\n bytes.push(0x80);\n var l = bytes.length / 4 + 2;\n var N = Math.ceil(l / 16);\n var M = new Array(N);\n\n for (var _i = 0; _i < N; ++_i) {\n var arr = new Uint32Array(16);\n\n for (var j = 0; j < 16; ++j) {\n arr[j] = bytes[_i * 64 + j * 4] << 24 | bytes[_i * 64 + j * 4 + 1] << 16 | bytes[_i * 64 + j * 4 + 2] << 8 | bytes[_i * 64 + j * 4 + 3];\n }\n\n M[_i] = arr;\n }\n\n M[N - 1][14] = (bytes.length - 1) * 8 / Math.pow(2, 32);\n M[N - 1][14] = Math.floor(M[N - 1][14]);\n M[N - 1][15] = (bytes.length - 1) * 8 & 0xffffffff;\n\n for (var _i2 = 0; _i2 < N; ++_i2) {\n var W = new Uint32Array(80);\n\n for (var t = 0; t < 16; ++t) {\n W[t] = M[_i2][t];\n }\n\n for (var _t = 16; _t < 80; ++_t) {\n W[_t] = ROTL(W[_t - 3] ^ W[_t - 8] ^ W[_t - 14] ^ W[_t - 16], 1);\n }\n\n var a = H[0];\n var b = H[1];\n var c = H[2];\n var d = H[3];\n var e = H[4];\n\n for (var _t2 = 0; _t2 < 80; ++_t2) {\n var s = Math.floor(_t2 / 20);\n var T = ROTL(a, 5) + f(s, b, c, d) + e + K[s] + W[_t2] >>> 0;\n e = d;\n d = c;\n c = ROTL(b, 30) >>> 0;\n b = a;\n a = T;\n }\n\n H[0] = H[0] + a >>> 0;\n H[1] = H[1] + b >>> 0;\n H[2] = H[2] + c >>> 0;\n H[3] = H[3] + d >>> 0;\n H[4] = H[4] + e >>> 0;\n }\n\n return [H[0] >> 24 & 0xff, H[0] >> 16 & 0xff, H[0] >> 8 & 0xff, H[0] & 0xff, H[1] >> 24 & 0xff, H[1] >> 16 & 0xff, H[1] >> 8 & 0xff, H[1] & 0xff, H[2] >> 24 & 0xff, H[2] >> 16 & 0xff, H[2] >> 8 & 0xff, H[2] & 0xff, H[3] >> 24 & 0xff, H[3] >> 16 & 0xff, H[3] >> 8 & 0xff, H[3] & 0xff, H[4] >> 24 & 0xff, H[4] >> 16 & 0xff, H[4] >> 8 & 0xff, H[4] & 0xff];\n}\n\nexport default sha1;","import v35 from './v35.js';\nimport sha1 from './sha1.js';\nvar v5 = v35('v5', 0x50, sha1);\nexport default v5;","export default '00000000-0000-0000-0000-000000000000';","import validate from './validate.js';\n\nfunction version(uuid) {\n if (!validate(uuid)) {\n throw TypeError('Invalid UUID');\n }\n\n return parseInt(uuid.substr(14, 1), 16);\n}\n\nexport default version;","module.exports = __WEBPACK_EXTERNAL_MODULE__893__;","// The module cache\nvar __webpack_module_cache__ = {};\n\n// The require function\nfunction __webpack_require__(moduleId) {\n\t// Check if module is in cache\n\tvar cachedModule = __webpack_module_cache__[moduleId];\n\tif (cachedModule !== undefined) {\n\t\treturn cachedModule.exports;\n\t}\n\t// Create a new module (and put it into the cache)\n\tvar module = __webpack_module_cache__[moduleId] = {\n\t\t// no module.id needed\n\t\t// no module.loaded needed\n\t\texports: {}\n\t};\n\n\t// Execute the module function\n\t__webpack_modules__[moduleId](module, module.exports, __webpack_require__);\n\n\t// Return the exports of the module\n\treturn module.exports;\n}\n\n","// getDefaultExport function for compatibility with non-harmony modules\n__webpack_require__.n = (module) => {\n\tvar getter = module && module.__esModule ?\n\t\t() => (module['default']) :\n\t\t() => (module);\n\t__webpack_require__.d(getter, { a: getter });\n\treturn getter;\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__.g = (function() {\n\tif (typeof globalThis === 'object') return globalThis;\n\ttry {\n\t\treturn this || new Function('return this')();\n\t} catch (e) {\n\t\tif (typeof window === 'object') return window;\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};","var scriptUrl;\nif (__webpack_require__.g.importScripts) scriptUrl = __webpack_require__.g.location + \"\";\nvar document = __webpack_require__.g.document;\nif (!scriptUrl && document) {\n\tif (document.currentScript)\n\t\tscriptUrl = document.currentScript.src;\n\tif (!scriptUrl) {\n\t\tvar scripts = document.getElementsByTagName(\"script\");\n\t\tif(scripts.length) {\n\t\t\tvar i = scripts.length - 1;\n\t\t\twhile (i > -1 && (!scriptUrl || !/^http(s?):/.test(scriptUrl))) scriptUrl = scripts[i--].src;\n\t\t}\n\t}\n}\n// When supporting browsers where an automatic publicPath is not supported you must specify an output.publicPath manually via configuration\n// or pass an empty string (\"\") and set the __webpack_public_path__ variable from your code to use your own logic.\nif (!scriptUrl) throw new Error(\"Automatic publicPath is not supported in this browser\");\nscriptUrl = scriptUrl.replace(/#.*$/, \"\").replace(/\\?.*$/, \"\").replace(/\\/[^\\/]+$/, \"/\");\n__webpack_require__.p = scriptUrl;","export default __webpack_public_path__ + \"02188894d5236b1517df3210b79c2a7f.svg\";","import './d3-context-menu.css';\nimport ArrowIcon from './img/play.svg';\n\nimport d3 from 'd3';\nimport slugid from 'slugid';\n\nexport function contextMenu(menu, opts) {\n let previouslyMouseUp = false;\n let clickAway = () => {};\n let uid = slugid.nice();\n let rootElement = null;\n let orientation = 'right'; // display the menu to the right of the mouse click\n // or parent elemement\n let initialPos = null;\n let parentStart = null;\n\n var openCallback,\n closeCallback;\n\n if (typeof opts === 'function') {\n openCallback = opts;\n } else {\n opts = opts || {};\n openCallback = opts.onOpen;\n closeCallback = opts.onClose;\n }\n\n if ('rootElement' in opts)\n rootElement = opts['rootElement']\n\n if ('pos' in opts) {\n // do we want to place this menu somewhere specific?\n initialPos = opts.pos;\n }\n\n if ('orientation' in opts) {\n orientation = opts.orientation;\n }\n\n if ('parentStart' in opts) {\n parentStart = opts.parentStart;\n }\n\n // create the div element that will hold the context menu\n d3.selectAll('.d3-context-menu-' + uid).data([1])\n .enter()\n .append('div')\n .classed('d3-context-menu', true)\n .classed('d3-context-menu-' + uid, true)\n\n // close menu\n d3.select('body').on('click.d3-context-menu-' + uid, function() {\n if (previouslyMouseUp) {\n previouslyMouseUp = false;\n return;\n }\n console.log('body click close');\n\n d3.select('.d3-context-menu-' + uid).style('display', 'none');\n orientation = 'right';\n\n if (closeCallback) {\n closeCallback();\n }\n });\n\n // this gets executed when a contextmenu event occurs\n return function(data, index, pMouseUp=false,\n clickAwayFunc = function() { } ) {\n var elm = this;\n var contextMenuPos = null;\n let mousePos = null;\n let currentThis = this;\n\n if (rootElement == null)\n mousePos = d3.mouse(this);\n else\n mousePos = d3.mouse(rootElement); // for recursive menus, we need the mouse\n // position relative to another element\n\n clickAway = clickAwayFunc;\n let openChildMenuUid = null;\n\n previouslyMouseUp = pMouseUp;\n\n d3.selectAll('.d3-context-menu-' + uid).html('');\n var list = d3.selectAll('.d3-context-menu-' + uid)\n .on('contextmenu', function(d) {\n console.log('context-menu close');\n d3.select('.d3-context-menu-' + uid).style('display', 'none'); \n orientation = 'right';\n\n d3.event.preventDefault();\n d3.event.stopPropagation();\n })\n .append('ul');\n\n list.selectAll('li').data(typeof menu === 'function' ? menu(data) : menu).enter()\n .append('li')\n .attr('class', function(d) {\n console.log('d:', d);\n var ret = '';\n if (d.divider) {\n ret += ' is-divider';\n }\n if (d.disabled) {\n ret += ' is-disabled';\n }\n if (!d.action) {\n ret += ' is-header';\n }\n if ('children' in d) {\n ret += ' d3-context-menu-recursive';\n }\n return ret;\n })\n .html(function(d) {\n if (d.divider) {\n return '
';\n }\n if (!d.title) {\n console.error('No title attribute set. Check the spelling of your options.');\n }\n return (typeof d.title === 'string') ? d.title : d.title(data);\n })\n .on('click', function(d, i) {\n if (d.disabled) return; // do nothing if disabled\n if (!d.action) return; // headers have no \"action\"\n d.action(elm, data, index, mousePos);\n console.log('click close');\n\n // close all context menus\n d3.selectAll('.d3-context-menu').style('display', 'none');\n orientation = 'right';\n\n if (closeCallback) {\n closeCallback();\n }\n })\n .on('mouseenter', function(d, i) {\n d3.select(this)\n .classed('d3-context-menu-selected', true)\n\n if (openChildMenuUid != null) {\n // there's a child menu open\n\n // unselect all items\n d3.select('.d3-context-menu-' + uid)\n .selectAll('li')\n .classed('d3-context-menu-selected', false);\n\n if (typeof d.children == 'undefined') {\n console.log(\"no children close\");\n // no children, so hide any open child menus\n d3.select('.d3-context-menu-' + openChildMenuUid)\n .style('display', 'none');\n\n openChildMenuUid = null;\n return;\n }\n\n if (d.childUid == openChildMenuUid) {\n // the correct child menu is already open\n return;\n\n } else {\n // need to open a different child menu\n console.log('open different child menu close');\n \n // close the already open one\n d3.select('.d3-context-menu-' + openChildMenuUid)\n .style('display', 'none');\n\n openChildMenuUid = null;\n\n }\n } \n\n // there should be no menu open right now\n if (typeof d.children != 'undefined') {\n let boundingRect = this.getBoundingClientRect();\n\n let childrenContextMenu = null\n if (orientation == 'left') {\n childrenContextMenu = contextMenu(d.children, {'rootElement': currentThis,\n 'pos': [ boundingRect.left + window.pageXOffset,\n boundingRect.top - 2 + window.pageYOffset],\n 'orientation': 'left'});\n } else {\n childrenContextMenu = contextMenu(d.children, \n {\n 'pos': [ boundingRect.left + boundingRect.width + window.pageXOffset,\n boundingRect.top - 2 + window.pageYOffset],\n 'rootElement': currentThis,\n 'parentStart': [boundingRect.left + window.pageXOffset,\n boundingRect.top - 2 + window.pageYOffset]});\n }\n\n d.childUid = childrenContextMenu.apply(this, [data,i,true,\n function() { }]);\n openChildMenuUid = d.childUid;\n }\n\n\n d3.select(this)\n .classed('d3-context-menu-selected', true)\n \n })\n .on('mouseleave', function(d, i) {\n\n if (openChildMenuUid == null) {\n d3.select(this)\n .classed('d3-context-menu-selected', false);\n }\n });\n\n list.selectAll('.d3-context-menu-recursive')\n .append('img')\n .attr('src', ArrowIcon)\n .attr('width', '14px')\n .attr('height', '14px')\n .style('position', 'absolute')\n .style('right', '5px')\n ;\n\n // the openCallback allows an action to fire before the menu is displayed\n // an example usage would be closing a tooltip\n if (openCallback) {\n if (openCallback(data, index) === false) {\n return uid;\n }\n }\n\n let contextMenuSelection = d3.select('.d3-context-menu-' + uid)\n .style('display', 'block');\n\n if (initialPos == null) {\n d3.select('.d3-context-menu-' + uid)\n .style('left', (d3.event.pageX - 2) + 'px')\n .style('top', (d3.event.pageY - 2) + 'px')\n } else {\n d3.select('.d3-context-menu-' + uid)\n .style('left', initialPos[0] + 'px')\n .style('top', initialPos[1] + 'px')\n }\n\n // check if the menu disappears off the side of the window\n let boundingRect = contextMenuSelection.node().getBoundingClientRect();\n\n if (boundingRect.left + boundingRect.width > window.innerWidth || orientation == 'left') {\n orientation = 'left';\n\n // menu goes of the end of the window, position it the other way\n if (initialPos == null) {\n // place the menu where the user clicked\n d3.select('.d3-context-menu-' + uid)\n .style('left', (d3.event.pageX - 2 - boundingRect.width) + 'px')\n .style('top', (d3.event.pageY - 2) + 'px')\n } else {\n if (parentStart != null) {\n d3.select('.d3-context-menu-' + uid)\n .style('left', (parentStart[0] - boundingRect.width) + 'px')\n .style('top', parentStart[1] + 'px')\n } else {\n d3.select('.d3-context-menu-' + uid)\n .style('left', (initialPos[0] - boundingRect.width) + 'px')\n .style('top', initialPos[1] + 'px')\n }\n }\n \n }\n\n // display context menu\n\n if (previouslyMouseUp)\n return uid;\n\n d3.event.preventDefault();\n d3.event.stopPropagation();\n //d3.event.stopImmediatePropagation();\n //\n return uid;\n };\n};\n","var numberSort = function(a,b) { return a - b; };\n\nexport function arraysEqual(a, b) {\n // courtesy of \n // http://stackoverflow.com/questions/3115982/how-to-check-if-two-arrays-are-equal-with-javascript\n if (a === b) return true;\n if (a === null || b === null) return false;\n if (a.length != b.length) return false;\n\n // If you don't care about the order of the elements inside\n // the array, you should sort both arrays here.\n\n for (var i = 0; i < a.length; ++i) {\n if (a[i] !== b[i]) return false;\n }\n return true;\n}\n\nexport function RNAUtilities() {\n var self = this;\n\n // the brackets to use when constructing dotbracket strings\n // with pseudoknots\n self.bracketLeft = \"([{abcdefghijklmnopqrstuvwxyz\".split(\"\");\n\n self.inverseBrackets = function(bracket) {\n var res = {};\n for (var i = 0; i < bracket.length; i++) {\n res[bracket[i]] = i;\n }\n return res;\n };\n\n self.maximumMatching = function maximumMatching(pt){\n // Courtesy of the great Ronny Lorenz\n\n var n = pt[0];\n var TURN = 0; //minimal number of nucleotides in the hairpin\n\n /* array init */\n var mm = new Array(n + 1);\n for(var i = 0; i <= n; i++){\n mm[i] = new Array(n + 1);\n for(var j = i; j <= n; j++)\n mm[i][j] = 0;\n }\n var maximum = 0;\n\n /* actual computation */\n for(var i = n - TURN - 1; i > 0; i--)\n\n for(var j = i + TURN + 1; j <= n; j++){\n maximum = mm[i][j-1];\n\n for(var l = j - TURN - 1; l >= i; l--) {\n if(pt[l] === j) {\n\n // we have a base pair here\n maximum = Math.max(maximum, ((l > i) ? mm[i][l-1] : 0) + 1 + ((j - l - 1 > 0) ? mm[l+1][j-1] : 0));\n }\n }\n\n mm[i][j] = maximum;\n }\n\n maximum = mm[1][n];\n\n return mm;\n };\n\n self.backtrackMaximumMatching = function(mm, oldPt) {\n var pt = Array.apply(null, \n Array(mm.length)).map(function() { return 0 }); \n //create an array containing zeros\n\n self.mmBt(mm, pt, oldPt, 1, mm.length-1);\n return pt;\n }\n\n self.mmBt = function(mm, pt, oldPt, i, j){\n // Create a pairtable from the backtracking\n var maximum = mm[i][j];\n var TURN = 0;\n\n if(j - i - 1 < TURN) return; /* no more pairs */\n\n if(mm[i][j-1] == maximum){ /* j is unpaired */\n self.mmBt(mm, pt, oldPt, i, j-1);\n return;\n }\n\n for(var q = j - TURN - 1; q >= i; q--){ /* j is paired with some q */\n if (oldPt[j] !== q)\n continue;\n\n var leftPart = (q > i) ? mm[i][q-1] : 0;\n var enclosedPart = (j - q - 1 > 0) ? mm[q+1][j-1] : 0;\n\n if(leftPart + enclosedPart + 1 == maximum) {\n // there's a base pair between j and q\n pt[q] = j;\n pt[j] = q;\n\n if(i < q) \n self.mmBt(mm, pt, oldPt, i, q - 1);\n\n self.mmBt(mm, pt, oldPt, q + 1, j - 1);\n return;\n }\n }\n\n //alert(i + \",\" + j + \": backtracking failed!\");\n console.log('FAILED!!!' + i + ',' + j + ': backtracking failed!');\n\n };\n\n self.dotbracketToPairtable = function(dotbracket) {\n // create an array and initialize it to 0\n var pt = Array.apply(null, new Array(dotbracket.length + 1)).map(Number.prototype.valueOf,0);\n \n // the first element is always the length of the RNA molecule\n pt[0] = dotbracket.length;\n\n // store the pairing partners for each symbol\n var stack = {};\n for (var i = 0; i < self.bracketLeft.length; i++) {\n stack[i] = [];\n }\n\n // lookup the index of each symbol in the bracket array\n var inverseBracketLeft = self.inverseBrackets(self.bracketLeft);\n var inverseBracketRight = self.inverseBrackets(self.bracketRight);\n\n for (var i = 0; i < dotbracket.length; i++) {\n var a = dotbracket[i];\n var ni = i + 1;\n\n if (a == '.' || a == 'o') {\n // unpaired\n pt[ni] = 0;\n } else {\n if (a in inverseBracketLeft) {\n // open pair?\n stack[inverseBracketLeft[a]].push(ni);\n } else if (a in inverseBracketRight){\n // close pair?\n var j = stack[inverseBracketRight[a]].pop();\n\n pt[ni] = j;\n pt[j] = ni;\n } else if (a == '&'){\n // there is a sequence break here, ignore it\n } else {\n throw \"Unknown symbol in dotbracket string\";\n }\n }\n }\n\n for (var key in stack) {\n if (stack[key].length > 0) {\n throw \"Unmatched base at position \" + stack[key][0];\n }\n }\n\n return pt;\n };\n\n self.insertIntoStack = function(stack, i, j) {\n var k = 0;\n while (stack[k].length > 0 && stack[k][stack[k].length - 1] < j) {\n k += 1;\n }\n\n stack[k].push(j);\n return k;\n };\n\n self.deleteFromStack = function(stack, j) {\n var k = 0;\n while (stack[k].length === 0 || stack[k][stack[k].length-1] != j) {\n k += 1;\n }\n stack[k].pop();\n return k;\n };\n\n self.pairtableToDotbracket = function(pt) {\n // store the pairing partners for each symbol\n var stack = {};\n for (var i = 0; i < pt[0]; i++) {\n stack[i] = [];\n }\n\n var seen = {};\n var res = \"\";\n var i;\n for (var i = 1; i < pt[0] + 1; i++) {\n if (pt[i] !== 0 && pt[i] in seen) {\n throw \"Invalid pairtable contains duplicate entries\";\n }\n seen[pt[i]] = true;\n\n if (pt[i] === 0) {\n res += '.';\n } else {\n if (pt[i] > i) {\n res += self.bracketLeft[self.insertIntoStack(stack, i, pt[i])];\n } else {\n res += self.bracketRight[self.deleteFromStack(stack, i)];\n }\n }\n }\n\n return res;\n };\n\n self.findUnmatched = function(pt, from, to) {\n /*\n * Find unmatched nucleotides in this molecule.\n */\n var toRemove = [];\n var unmatched = [];\n\n var origFrom = from;\n var origTo = to;\n var i;\n\n for (var i = from; i <= to; i++)\n if (pt[i] !== 0 && (pt[i] < from || pt[i] > to))\n unmatched.push([i,pt[i]]);\n\n for (var i = origFrom; i <= origTo; i++) {\n while (pt[i] === 0 && i <= origTo) i++;\n\n to = pt[i];\n\n while (pt[i] === to) {\n i++;\n to--;\n }\n \n toRemove = toRemove.concat(self.findUnmatched(pt, i, to));\n }\n\n if (unmatched.length > 0)\n toRemove.push(unmatched);\n\n return toRemove;\n };\n\n self.removePseudoknotsFromPairtable = function(pt) {\n /* Remove the pseudoknots from this structure in such a fashion\n * that the least amount of base-pairs need to be broken\n *\n * The pairtable is manipulated in place and a list of tuples\n * indicating the broken base pairs is returned.\n */\n\n var mm = self.maximumMatching(pt);\n var newPt = self.backtrackMaximumMatching(mm, pt);\n var removed = [];\n\n for (var i = 1; i < pt.length; i++) {\n if (pt[i] < i)\n continue;\n\n if (newPt[i] != pt[i]) {\n removed.push([i, pt[i]]);\n pt[pt[i]] = 0;\n pt[i] = 0;\n }\n }\n\n return removed;\n };\n\n self.ptToElements = function(pt, level, i, j, dotBracketBreaks) {\n /* Convert a pair table to a list of secondary structure \n * elements:\n *\n * [['s',1,[2,3]]\n *\n * The 's' indicates that an element can be a stem. It can also be\n * an interior loop ('i'), a hairpin loop ('h') or a multiloop ('m')\n *\n * The second number (1 in this case) indicates the depth or\n * how many base pairs have to be broken to get to this element.\n *\n * Finally, there is the list of nucleotides which are part of\n * of this element.\n */\n var elements = [];\n var u5 = [i-1];\n var u3 = [j+1];\n\n if (arguments.length < 5)\n dotBracketBreaks = [];\n\n if (i > j)\n return [];\n \n //iterate over the unpaired regions on either side\n //this is either 5' and 3' unpaired if level == 0\n //or an interior loop or a multiloop\n for (; pt[i] === 0; i++) { u5.push(i); }\n for (; pt[j] === 0; j--) { u3.push(j); }\n\n if (i > j) {\n //hairpin loop or one large unpaired molecule\n u5.push(i);\n if (level === 0)\n return [['e',level, u5.sort(numberSort)]];\n else {\n // check to see if we have chain breaks due\n // to multiple strands in the input\n var external = false;\n var left = [];\n var right = [];\n for (var k = 0; k < u5.length; k++) {\n if (external)\n right.push(u5[k]);\n else\n left.push(u5[k]);\n\n if (dotBracketBreaks.indexOf(u5[k]) >= 0)\n external = true;\n }\n\n if (external) {\n return [['h',level, u5.sort(numberSort)]];\n }\n else\n // if not, this is a simple hairpin loop\n return [['h',level, u5.sort(numberSort)]];\n }\n }\n\n if (pt[i] != j) {\n //multiloop\n var m = u5;\n var k = i;\n\n // the nucleotide before and the starting nucleotide\n m.push(k);\n while (k <= j) {\n // recurse into a stem\n elements = elements.concat(self.ptToElements(pt, level, k, pt[k], dotBracketBreaks));\n\n // add the nucleotides between stems\n m.push(pt[k]);\n k = pt[k] + 1;\n for (; pt[k] === 0 && k <= j; k++) { m.push(k);}\n m.push(k);\n }\n m.pop();\n m = m.concat(u3);\n \n if (m.length > 0) {\n if (level === 0)\n elements.push(['e', level, m.sort(numberSort)]);\n else\n elements.push(['m', level, m.sort(numberSort)]);\n }\n \n return elements;\n }\n\n if (pt[i] === j) {\n //interior loop\n u5.push(i);\n u3.push(j);\n\n var combined = u5.concat(u3);\n if (combined.length > 4) {\n if (level === 0)\n elements.push(['e',level, u5.concat(u3).sort(numberSort)]);\n else\n elements.push(['i',level, u5.concat(u3).sort(numberSort)]);\n }\n } \n\n var s = [];\n //go through the stem\n while (pt[i] === j && i < j) {\n //one stem\n s.push(i);\n s.push(j);\n\n i += 1;\n j -= 1;\n\n level += 1;\n }\n\n u5 = [i-1];\n u3 = [j+1];\n elements.push(['s', level, s.sort(numberSort)]);\n\n return elements.concat(self.ptToElements(pt, level, i, j, dotBracketBreaks));\n };\n\n}\n\nexport var rnaUtilities = new RNAUtilities();\n\nexport function ColorScheme(colorsText) {\n var self = this;\n self.colorsText = colorsText;\n\n self.parseRange = function(rangeText) {\n //parse a number range such as 1-10 or 3,7,9 or just 7\n var parts = rangeText.split(',')\n var nums = [];\n\n for (var i = 0; i < parts.length; i++) {\n //could be 1 or 10-11 or something like that\n var parts1 = parts[i].split('-');\n\n if (parts1.length == 1)\n nums.push(parseInt(parts1[0]));\n else if (parts1.length == 2) {\n var from = parseInt(parts1[0]);\n var to = parseInt(parts1[1]);\n\n // add each number in this range\n for (var j = from; j <= to; j++) \n nums.push(j)\n } else {\n console.log('Malformed range (too many dashes):', rangeText);\n }\n }\n\n return nums;\n }\n\n self.parseColorText = function(colorText) {\n /* Parse the text of an RNA color string. Instructions and description\n * of the format are given below.\n *\n * The return is a json double dictionary indexed first by the \n * molecule name, then by the nucleotide. This is then applied\n * by force.js to the RNAs it is displaying. When no molecule\n * name is specified, the color is applied to all molecules*/\n var lines = colorText.split('\\n');\n var currMolecule = '';\n var counter = 1;\n var colorsJson = {colorValues: {'':{}}, range:['white', 'steelblue']};\n var domainValues = [];\n\n\n for (var i = 0; i < lines.length; i++) {\n\n if (lines[i][0] == '>') {\n // new molecule\n currMolecule = lines[i].trim().slice(1);\n counter = 1;\n\n colorsJson.colorValues[currMolecule] = {};\n continue;\n }\n\n let words = lines[i].trim().split(/[\\s]+/);\n\n for (var j = 0; j < words.length; j++) {\n if (isNaN(words[j])) {\n if (words[j].search('range') === 0) {\n //there's a color scale in this entry\n let parts = words[j].split('=');\n let partsRight = parts[1].split(':')\n colorsJson.range = [partsRight[0], partsRight[1]];\n continue;\n }\n\n if (words[j].search('domain') == 0) {\n //there's a color scale in this entry\n let parts = words[j].split('=');\n let partsRight = parts[1].split(':')\n colorsJson.domain = [partsRight[0], partsRight[1]];\n continue;\n }\n\n // it's not a number, should be a combination \n // of a number (nucleotide #) and a color\n let parts = words[j].split(':');\n let nums = self.parseRange(parts[0]);\n let color = parts[1]\n\n for (var k = 0; k < nums.length; k++) {\n if (isNaN(color)) {\n colorsJson.colorValues[currMolecule][nums[k]] = color;\n } else {\n colorsJson.colorValues[currMolecule][nums[k]] = +color;\n domainValues.push(Number(color));\n }\n }\n } else {\n //it's a number, so we add it to the list of values\n //seen for this molecule\n colorsJson.colorValues[currMolecule][counter] = Number(words[j]);\n counter += 1;\n\n domainValues.push(Number(words[j]));\n }\n }\n }\n\n if (!('domain' in colorsJson))\n colorsJson.domain = [Math.min.apply(null, domainValues), Math.max.apply(null, domainValues)];\n\n self.colorsJson = colorsJson;\n\n return self;\n };\n\n self.normalizeColors = function() {\n /* \n * Normalize the passed in values so that they range from\n * 0 to 1\n */\n var value;\n\n for (var moleculeName in self.colorsJson) {\n var minNum = Number.MAX_VALUE;\n var maxNum = Number.MIN_VALUE;\n\n // iterate once to find the min and max values;\n for (var resnum in self.colorsJson.colorValues[moleculeName]) {\n value = self.colorsJson.colorValues[moleculeName][resnum];\n if (typeof value == 'number') {\n if (value < minNum)\n minNum = value;\n if (value > maxNum)\n maxNum = value;\n }\n }\n\n // iterate again to normalize\n for (resnum in self.colorsJson.colorValues[moleculeName]) {\n value = self.colorsJson.colorValues[moleculeName][resnum];\n if (typeof value == 'number') {\n self.colorsJson.colorValues[moleculeName][resnum] = (value - minNum ) / (maxNum - minNum);\n }\n }\n }\n\n return self;\n };\n\n self.parseColorText(self.colorsText);\n return self;\n}\n","import {arraysEqual,RNAUtilities,rnaUtilities} from './rnautils.js';\nimport slugid from 'slugid';\n\nvar numberSort = function(a,b) { return a - b; };\n\nif (typeof(String.prototype.trim) === 'undefined') {\n String.prototype.trim = function() {\n return String(this).replace(/^\\s+|\\s+$/g, '');\n };\n}\n\nexport function ProteinGraph(structName, size, uid) {\n var self = this;\n\n self.type = 'protein';\n self.size = size;\n self.nodes = [{'name': 'P',\n 'num': 1,\n 'radius': 3 * Math.sqrt(size),\n 'rna': self,\n 'nodeType': 'protein',\n 'structName': structName,\n 'elemType': 'p',\n 'size': size,\n 'uid': slugid.nice()}];\n\n self.links = [];\n self.uid = slugid.nice();\n\n self.addUids = function(uids) {\n for (let i = 0; i < uids.length; i++)\n self.nodes[i].uid = uids[i];\n\n return self;\n };\n\n self.getUids = function() {\n /* Get the positions of each node so that they\n * can be passed to elementsToJson later\n */\n uids = [];\n for (let i = 0; i < self.dotbracket.length; i++)\n uids.push(self.nodes[i].uid);\n\n return uids;\n };\n\n}\n\nexport function RNAGraph(seq = '', dotbracket = '', structName = '', startNumber = 1) {\n var self = this;\n\n self.type = 'rna';\n self.circularizeExternal = false;\n self.seq = seq;\n self.dotbracket = dotbracket; //i.e. ..((..))..\n self.structName = structName;\n self.circular = false;\n\n if (self.dotbracket.slice(-1) == '*') {\n //circular RNA\n self.dotbracket = self.dotbracket.slice(0, -1);\n self.circular = true;\n }\n\n self.uid = slugid.nice();\n\n self.elements = []; //store the elements and the\n //nucleotides they contain\n self.pseudoknotPairs = [];\n self.nucsToNodes = {};\n\n self.addUids = function(uids) {\n let nucleotideNodes = self.nodes.filter(function(d) { return d.nodeType == 'nucleotide'; });\n\n for (let i = 0; i < uids.length && i < nucleotideNodes.length; i++) {\n nucleotideNodes[i].uid = uids[i];\n }\n\n return self;\n };\n\n self.computePairtable = function() {\n self.pairtable = rnaUtilities.dotbracketToPairtable(self.dotbracket);\n };\n\n self.removeBreaks = function(targetString) {\n // Collect the indexes of the chain breaks in the targetString\n // chain breaks are indicated by '&'\n var breaks = [];\n for (var i = 0; i < targetString.length; i++) {\n if (targetString[i] === '&') {\n breaks.push(i);\n }\n }\n\n return {targetString: targetString, breaks: breaks};\n };\n\n var ret = self.removeBreaks(self.dotbracket);\n // commented out to avoid removing the break node, let's keep it in the dotbracket\n // self.dotbracket = ret.targetString;\n self.dotBracketBreaks = ret.breaks;\n\n ret = self.removeBreaks(self.seq);\n // commented out to avoid removing the break node, let's keep it in the sequence\n // self.seq = ret.targetString;\n self.seqBreaks = ret.breaks;\n\n self.rnaLength = self.dotbracket.length;\n\n if (!arraysEqual(self.dotBracketBreaks, self.seqBreaks)) {\n console.log('WARNING: Sequence and structure breaks not equal');\n console.log('WARNING: Using the breaks in the structure');\n }\n\n self.computePairtable();\n\n self.addPositions = function(nodeType, positions) {\n let labelNodes = self.nodes.filter(function(d) { return d.nodeType == nodeType; });\n\n for (let i = 0; i < labelNodes.length; i++) {\n labelNodes[i].x = positions[i][0];\n labelNodes[i].y = positions[i][1];\n }\n\n return self;\n };\n\n self.breakNodesToFakeNodes = function() {\n // convert all the nodes following breaks to fake nodes\n let labelNodes = self.nodes.filter(function(d) { return d.nodeType == 'nucleotide'; });\n\n // if a node was an artifical break node, convert it to a middle\n for (let i = 0; i < labelNodes.length; i++) {\n if (self.dotBracketBreaks.indexOf(i) >= 0) {\n labelNodes[i].nodeType = 'middle';\n // commented out to avoid removing the node after the break\n // labelNodes[i+1].nodeType = 'middle';\n }\n }\n\n for (let i = 0; i < self.elements.length; i++) {\n var broken = false;\n\n // change the elemType of the other nodes in the element containing\n // the break\n for (let j = 0; j < self.elements[i][2].length; j++) {\n if (self.dotBracketBreaks.indexOf(self.elements[i][2][j]) >= 0)\n broken = true;\n }\n\n if (broken) {\n self.elements[i][2].map(function(x) {\n if (x == 0)\n return;\n self.nodes[x-1].elemType = 'e';\n });\n } else {\n self.elements[i][2].map(function(x) {\n if (x == 0)\n return;\n self.nodes[x-1].elemType = self.elements[i][0];\n });\n }\n }\n return self;\n };\n\n self.getPositions = function(nodeType) {\n var positions = [];\n let nucleotideNodes = self.nodes.filter(function(d) { return d.nodeType == nodeType; });\n\n for (let i = 0; i < nucleotideNodes.length; i++)\n positions.push([nucleotideNodes[i].x, nucleotideNodes[i].y]);\n\n return positions;\n };\n\n self.getUids = function() {\n /* Get the positions of each node so that they\n * can be passed to elementsToJson later\n */\n var uids = [];\n for (let i = 0; i < self.dotbracket.length; i++)\n uids.push(self.nodes[i].uid);\n\n return uids;\n };\n\n self.reinforceStems = function() {\n var pt = self.pairtable;\n let relevantElements = self.elements.filter( function(d) {\n return d[0] == 's' && d[2].length >= 4;\n });\n\n for (let i = 0; i < relevantElements.length; i++) {\n let allNucs = relevantElements[i][2];\n let nucs = allNucs.slice(0, allNucs.length / 2);\n\n for (let j = 0; j < nucs.length-1; j++) {\n self.addFakeNode([nucs[j], nucs[j+1], pt[nucs[j+1]], pt[nucs[j]]]);\n }\n }\n\n return self;\n };\n\n self.reinforceLoops = function() {\n /*\n * Add a set of fake nodes to enforce the structure\n */\n var filterNucs = function(d) {\n return d !== 0 && d <= self.dotbracket.length;\n };\n\n for (let i = 0; i < self.elements.length; i++) {\n if (self.elements[i][0] == 's' || (!self.circularizeExternal && self.elements[i][0] == 'e'))\n continue;\n\n var nucs = self.elements[i][2].filter(filterNucs);\n\n if (self.elements[i][0] == 'e') {\n var newNode1 = {'name': '',\n 'num': -3,\n //'radius': 18 * radius -6,\n 'radius': 0,\n 'rna': self,\n 'nodeType': 'middle',\n 'elemType': 'f',\n 'nucs': [],\n 'x': self.nodes[self.rnaLength-1].x,\n 'y': self.nodes[self.rnaLength-1].y,\n 'px': self.nodes[self.rnaLength-1].px,\n 'py': self.nodes[self.rnaLength-1].py,\n 'uid': slugid.nice() };\n var newNode2 = {'name': '',\n 'num': -2,\n //'radius': 18 * radius -6,\n 'radius': 0,\n 'rna': self,\n 'nodeType': 'middle',\n 'elemType': 'f',\n 'nucs': [],\n 'x': self.nodes[0].x,\n 'y': self.nodes[0].y,\n 'px': self.nodes[0].px,\n 'py': self.nodes[0].py,\n 'uid': slugid.nice() };\n\n nucs.push(self.nodes.length+1);\n nucs.push(self.nodes.length+2);\n self.nodes.push(newNode1);\n self.nodes.push(newNode2);\n }\n\n\n self.addFakeNode(nucs);\n }\n\n return self;\n };\n\n self.updateLinkUids = function() {\n for (let i = 0; i < self.links.length; i++) {\n self.links[i].uid = self.links[i].source.uid + self.links[i].target.uid;\n }\n\n return self;\n };\n\n self.addFakeNode = function(nucs) {\n var linkLength = 18; //make sure this is consistent with the value in force.js\n var nodeWidth = 6;\n var angle = (3.1415 * 2) / (2 * nucs.length);\n var radius = linkLength / (2 * Math.tan(angle));\n\n var fakeNodeUid = '';\n\n for (let i = 0; i < nucs.length; i++)\n fakeNodeUid += self.nodes[nucs[i]-1].uid;\n\n var newNode = {'name': '',\n 'num': -1,\n //'radius': 18 * radius -6,\n 'radius': radius,\n 'rna': self,\n 'nodeType': 'middle',\n 'elemType': 'f',\n 'nucs': nucs,\n 'uid': fakeNodeUid };\n self.nodes.push(newNode);\n\n var newX = 0;\n var newY = 0;\n var coordsCounted = 0;\n\n angle = (nucs.length - 2) * 3.14159 / (2 * nucs.length);\n radius = 0.5 / Math.cos(angle);\n\n for (let j = 0; j < nucs.length; j++) {\n if (nucs[j] === 0 || nucs[j] > self.dotbracket.length)\n continue;\n\n //link to the center node\n self.links.push({'source': self.nodes[nucs[j] - 1],\n 'target': self.nodes[self.nodes.length-1],\n 'linkType': 'fake',\n 'value': radius,\n 'uid': slugid.nice() });\n\n if (nucs.length > 4) {\n //link across the loop\n self.links.push({'source': self.nodes[nucs[j] - 1],\n 'target': self.nodes[nucs[(j + Math.floor(nucs.length / 2)) % nucs.length] - 1],\n 'linkType': 'fake',\n 'value': radius * 2,\n 'uid': slugid.nice() });\n }\n\n var ia = ((nucs.length - 2) * 3.14159) / nucs.length;\n var c = 2 * Math.cos(3.14159 / 2 - ia / 2);\n //link to over-neighbor\n self.links.push({'source': self.nodes[nucs[j] - 1],\n 'target': self.nodes[nucs[(j + 2) % nucs.length] - 1],\n 'linkType': 'fake',\n 'value': c});\n\n // calculate the mean of the coordinats in this loop\n // and place the fake node there\n var fromNode = self.nodes[nucs[j]-1];\n if ('x' in fromNode) {\n newX += fromNode.x;\n newY += fromNode.y;\n\n coordsCounted += 1;\n }\n }\n\n if (coordsCounted > 0) {\n // the nucleotides had set positions so we can calculate the position\n // of the fake node\n newNode.x = newX / coordsCounted;\n newNode.y = newY / coordsCounted;\n newNode.px = newNode.x;\n newNode.py = newNode.y;\n }\n\n return self;\n };\n\n self.connectFakeNodes = function() {\n var linkLength = 18;\n\n // We want to be able to connect all of the fake nodes\n // and create a structure consisting of just them\n var filterOutNonFakeNodes = function(d) {\n return d.nodeType == 'middle';\n }\n\n var nucsToNodes = {};\n var fakeNodes = self.nodes.filter(filterOutNonFakeNodes);\n var linked = {};\n\n // initialize the nucleotides to nodes\n for (var i = 1; i <= self.nodes.length; i++)\n nucsToNodes[i] = [];\n\n for (var i = 0; i < fakeNodes.length; i++) {\n var thisNode = fakeNodes[i];\n\n // each fake node represents a certain set of nucleotides (thisNode.nucs)\n for (var j = 0; j < thisNode.nucs.length; j++) {\n var thisNuc = thisNode.nucs[j];\n\n // check to see if this nucleotide has been seen in another fake node\n // if it has, then we add a link between the two nodes\n for (var k = 0; k < nucsToNodes[thisNuc].length; k++) {\n if (JSON.stringify([nucsToNodes[thisNuc][k].uid, thisNode.uid].sort()) in linked)\n continue; //already linked\n\n var distance = nucsToNodes[thisNuc][k].radius + thisNode.radius;\n\n self.links.push({'source': nucsToNodes[thisNuc][k],\n 'target': thisNode,\n 'value': distance / linkLength,\n 'linkType': 'fake_fake'});\n\n // note that we've already seen this link\n linked[JSON.stringify([nucsToNodes[thisNuc][k].uid, thisNode.uid].sort())] = true;\n }\n\n nucsToNodes[thisNuc].push(thisNode);\n }\n }\n\n return self;\n\n };\n\n self.addExtraLinks = function(extraLinks) {\n if (typeof extraLinks == 'undefined')\n return self;\n\n for (var i = 0; i < extraLinks.length; i++) {\n var source = self.getNodeFromNucleotides(extraLinks[i].from);\n var target = self.getNodeFromNucleotides(extraLinks[i].to);\n\n var newLink = {'source': source, 'target': target, 'linkType': 'extra',\n 'extraLinkType': extraLinks[i].linkType, 'uid': slugid.nice() };\n\n self.links.push(newLink);\n }\n\n return self;\n }\n\n\n self.elementsToJson = function() {\n /* Convert a set of secondary structure elements to a json\n * representation of the graph that can be used with d3's\n * force-directed layout to generate a visualization of\n * the structure.\n */\n var pt = self.pairtable;\n var elements = self.elements;\n\n self.nodes = [];\n self.links = [];\n\n //create a reverse lookup so we can find out the type\n //of element that a node is part of\n var elemTypes = {};\n\n //sort so that we count stems last\n self.elements.sort();\n\n for (let i = 0; i < self.elements.length; i++) {\n var nucs = self.elements[i][2];\n for (let j = 0; j < nucs.length; j++) {\n elemTypes[nucs[j]] = self.elements[i][0];\n }\n }\n\n for (let i = 1; i <= pt[0]; i++) {\n var nodeName = self.seq[i-1];\n\n // remove only the breaks that are in the sequence\n if (self.dotBracketBreaks.indexOf(i-1) >= 0) {\n nodeName = '';\n }\n\n //create a node for each nucleotide\n self.nodes.push({'name': nodeName,\n 'num': startNumber + i - 1,\n 'radius': 5,\n 'rna': self,\n 'nodeType': 'nucleotide',\n 'structName': self.structName,\n 'elemType': elemTypes[i],\n 'uid': slugid.nice(),\n 'linked': false});\n }\n\n for (let i = 0; i < self.nodes.length; i++) {\n if (i === 0)\n self.nodes[i].prevNode = null;\n else {\n self.nodes[i].prevNode = self.nodes[i-1];\n }\n\n if (i == self.nodes.length-1)\n self.nodes[i].nextNode = null;\n else {\n self.nodes[i].nextNode = self.nodes[i+1];\n }\n }\n\n for (let i = 1; i <= pt[0]; i++) {\n\n if (pt[i] !== 0) {\n // base-pair links\n self.links.push({'source': self.nodes[i-1],\n 'target': self.nodes[pt[i]-1],\n 'linkType': 'basepair',\n 'value': 1,\n 'uid': slugid.nice() });\n }\n\n if (i > 1) {\n // backbone links\n // unlink only the break and the nucleotide before it\n if (self.dotBracketBreaks.indexOf(i-1) === -1 &&\n self.dotBracketBreaks.indexOf(i-2) == -1) {\n // there is no break in the strands here\n // we can add a backbone link\n self.links.push({'source': self.nodes[i-2],\n 'target': self.nodes[i-1],\n 'linkType': 'backbone',\n 'value': 1,\n 'uid': slugid.nice() });\n self.nodes[i-1].linked = true;\n }\n }\n }\n\n //add the pseudoknot links\n for (let i = 0; i < self.pseudoknotPairs.length; i++) {\n self.links.push({'source': self.nodes[self.pseudoknotPairs[i][0]-1],\n 'target': self.nodes[self.pseudoknotPairs[i][1]-1],\n 'linkType': 'pseudoknot',\n 'value': 1,\n 'uid': slugid.nice()});\n }\n\n if (self.circular) {\n self.links.push({'source': self.nodes[0],\n 'target': self.nodes[self.rnaLength-1],\n 'linkType': 'backbone',\n 'value': 1,\n 'uid': slugid.nice() });\n\n }\n\n return self;\n };\n\n self.ptToElements = function(pt, level, i, j) {\n /* Convert a pair table to a list of secondary structure\n * elements:\n *\n * [['s',1,[2,3]]\n *\n * The 's' indicates that an element can be a stem. It can also be\n * an interior loop ('i'), a hairpin loop ('h') or a multiloop ('m')\n *\n * The second number (1 in this case) indicates the depth or\n * how many base pairs have to be broken to get to this element.\n *\n * Finally, there is the list of nucleotides which are part of\n * of this element.\n */\n var elements = [];\n var u5 = [i-1];\n var u3 = [j+1];\n\n if (i > j)\n return [];\n\n //iterate over the unpaired regions on either side\n //this is either 5' and 3' unpaired if level == 0\n //or an interior loop or a multiloop\n for (; pt[i] === 0; i++) { u5.push(i); }\n for (; pt[j] === 0; j--) { u3.push(j); }\n\n if (i > j) {\n //hairpin loop or one large unpaired molecule\n u5.push(i);\n if (level === 0)\n return [['e',level, u5.sort(numberSort)]];\n else {\n // check to see if we have chain breaks due\n // to multiple strands in the input\n var external = false;\n var left = [];\n var right = [];\n for (var k = 0; k < u5.length; k++) {\n if (external)\n right.push(u5[k]);\n else\n left.push(u5[k]);\n\n if (self.dotBracketBreaks.indexOf(u5[k]) >= 0)\n external = true;\n }\n\n if (external) {\n return [['h',level, u5.sort(numberSort)]];\n }\n else\n // if not, this is a simple hairpin loop\n return [['h',level, u5.sort(numberSort)]];\n }\n }\n\n if (pt[i] != j) {\n //multiloop\n var m = u5;\n var k = i;\n\n // the nucleotide before and the starting nucleotide\n m.push(k);\n while (k <= j) {\n // recurse into a stem\n elements = elements.concat(self.ptToElements(pt, level, k, pt[k]));\n\n // add the nucleotides between stems\n m.push(pt[k]);\n k = pt[k] + 1;\n for (; pt[k] === 0 && k <= j; k++) { m.push(k);}\n m.push(k);\n }\n m.pop();\n m = m.concat(u3);\n\n if (m.length > 0) {\n if (level === 0)\n elements.push(['e', level, m.sort(numberSort)]);\n else\n elements.push(['m', level, m.sort(numberSort)]);\n }\n\n return elements;\n }\n\n if (pt[i] === j) {\n //interior loop\n u5.push(i);\n u3.push(j);\n\n var combined = u5.concat(u3);\n if (combined.length > 4) {\n if (level === 0)\n elements.push(['e',level, u5.concat(u3).sort(numberSort)]);\n else\n elements.push(['i',level, u5.concat(u3).sort(numberSort)]);\n }\n }\n\n var s = [];\n //go through the stem\n while (pt[i] === j && i < j) {\n //one stem\n s.push(i);\n s.push(j);\n\n i += 1;\n j -= 1;\n\n level += 1;\n }\n\n u5 = [i-1];\n u3 = [j+1];\n elements.push(['s', level, s.sort(numberSort)]);\n\n return elements.concat(self.ptToElements(pt, level, i, j));\n };\n\n self.addLabels = function(startNumber = 1, labelInterval = 10) {\n if (labelInterval === 0)\n return self;\n\n for (let i = 1; i <= self.rnaLength; i++) {\n // add labels\n if (i % labelInterval === 0) {\n //create a node for each label\n let newX, newY;\n\n let thisNode = self.nodes[i-1];\n let prevNode, nextNode;\n let prevVec, nextVec;\n\n if (self.rnaLength == 1) {\n nextVec = [thisNode.x - 15, thisNode.y];\n prevVec = [thisNode.x - 15, thisNode.y];\n } else {\n // if we're labelling the first node, then label it in relation to the last\n if (i == 1)\n prevNode = self.nodes[self.rnaLength - 1];\n else\n prevNode = self.nodes[i - 2];\n\n // if we're labelling the last node, then label it in relation to the first\n if (i == self.rnaLength)\n nextNode = self.nodes[0];\n else\n nextNode = self.nodes[i];\n\n // this nucleotide and its neighbors are paired\n if (self.pairtable[nextNode.num - startNumber+1] !== 0 &&\n self.pairtable[prevNode.num - startNumber+1] !== 0 &&\n self.pairtable[thisNode.num - startNumber+1] !== 0) {\n\n prevNode = nextNode = self.nodes[self.pairtable[thisNode.num - startNumber+1]-1];\n }\n\n // this node is paired but at least one of its neighbors is unpaired\n // place the label in the direction of the two neighbors\n if (self.pairtable[thisNode.num - startNumber+1] !== 0 && (\n self.pairtable[nextNode.num - startNumber+1] === 0 ||\n self.pairtable[prevNode.num - startNumber+1] === 0)) {\n nextVec = [thisNode.x - nextNode.x, thisNode.y - nextNode.y];\n prevVec = [thisNode.x - prevNode.x, thisNode.y - prevNode.y];\n\n } else {\n nextVec = [nextNode.x - thisNode.x, nextNode.y - thisNode.y];\n prevVec = [prevNode.x - thisNode.x, prevNode.y - thisNode.y];\n }\n }\n\n var combinedVec = [nextVec[0] + prevVec[0], nextVec[1] + prevVec[1]];\n var vecLength = Math.sqrt(combinedVec[0] * combinedVec[0] + combinedVec[1] * combinedVec[1]);\n var normedVec = [combinedVec[0] / vecLength, combinedVec[1] / vecLength];\n var offsetVec = [-15 * normedVec[0], -15 * normedVec[1]];\n\n newX = self.nodes[i-1].x + offsetVec[0];\n newY = self.nodes[i-1].y + offsetVec[1];\n\n var newNode = {'name': i + startNumber -1,\n 'num': -1,\n 'radius': 6,\n 'rna': self,\n 'nodeType': 'label',\n 'structName': self.structName,\n 'elemType': 'l',\n 'x': newX,\n 'y': newY,\n 'px': newX,\n 'py': newY,\n 'uid': slugid.nice() };\n var newLink = {'source': self.nodes[i-1],\n 'target': newNode,\n 'value': 1,\n 'linkType': 'label_link',\n 'uid': slugid.nice() };\n\n self.nodes.push(newNode);\n self.links.push(newLink);\n }\n }\n\n return self;\n };\n\n self.recalculateElements = function() {\n self.removePseudoknots();\n self.elements = self.ptToElements(self.pairtable, 0, 1, self.dotbracket.length);\n\n if (self.circular) {\n //check to see if the external loop is a hairpin or a multiloop\n let externalLoop = self.elements.filter(function(d) { if (d[0] == 'e') return true; });\n\n if (externalLoop.length > 0) {\n eloop = externalLoop[0];\n nucs = eloop[2].sort(numberSort);\n\n prev = nucs[0];\n hloop = true;\n numGreater = 0;\n for (let i = 1; i < nucs.length; i++) {\n if (nucs[i] - prev > 1) {\n numGreater += 1;\n }\n prev = nucs[i];\n }\n\n if (numGreater == 1) {\n eloop[0] = 'h';\n } else if (numGreater == 2) {\n eloop[0] = 'i';\n } else {\n eloop[0] = 'm';\n }\n }\n }\n\n return self;\n };\n\n self.reassignLinkUids = function() {\n // reassign uids to the links, corresponding to the uids of the two nodes\n // they connect\n var i;\n\n for (var i = 0; i < self.links.length; i++) {\n self.links[i].uid = self.links[i].source.uid + self.links[i].target.uid;\n }\n\n return self;\n }\n\n self.removePseudoknots = function() {\n if (self.pairtable.length > 1)\n self.pseudoknotPairs = self.pseudoknotPairs.concat(rnaUtilities.removePseudoknotsFromPairtable(self.pairtable));\n\n return self;\n };\n\n self.addPseudoknots = function() {\n /* Add all of the pseudoknot pairs which are stored outside\n * of the pairtable back to the pairtable\n */\n var pt = self.pairtable;\n var pseudoknotPairs = self.pseudoknotPairs;\n\n for (var i = 0; i < pseudoknotPairs.length; i++) {\n pt[pseudoknotPairs[i][0]] = pseudoknotPairs[i][1];\n pt[pseudoknotPairs[i][1]] = pseudoknotPairs[i][0];\n }\n\n self.pseudoknotPairs = [];\n return self;\n };\n\n self.addName = function(name) {\n if (typeof name == 'undefined') {\n self.name = '';\n return self;\n } else {\n self.name = name;\n return self;\n }\n };\n\n\n if (self.rnaLength > 0)\n self.recalculateElements();\n\n self.getNodeFromNucleotides = function(nucs) {\n /* Get a node given a nucleotide number or an array of nucleotide\n * numbers indicating an element node */\n if (Object.prototype.toString.call(nucs) === '[object Array]') {\n for (let j = 0; j < self.nodes.length; j++) {\n if ('nucs' in self.nodes[j]) {\n if (self.nodes[j].nucs.equals(nucs)) {\n return self.nodes[j];\n }\n }\n }\n } else {\n for (let j = 0; j < self.nodes.length; j++) {\n if (self.nodes[j].num == nucs) {\n return self.nodes[j];\n }\n }\n }\n\n console.log('ERROR: No node found for nucs:', nucs);\n return null;\n }\n}\n\nexport function moleculesToJson(moleculesJson) {\n /* Convert a list of RNA and protein molecules to a list of RNAGraph\n * ProteinGraph and extraLinks structure */\n\n var nodes = {}; //index the nodes by uid\n var graphs = [];\n var extraLinks = [];\n\n\n // Create the graphs for each molecule\n for (var i = 0; i < moleculesJson.molecules.length; i++) {\n var molecule = moleculesJson.molecules[i];\n var rg;\n\n if (molecule.type == 'rna') {\n rg = new RNAGraph(molecule.seq, molecule.ss, molecule.header);\n rg.circularizeExternal = true;\n rg.elementsToJson()\n .addPositions('nucleotide', molecule.positions)\n .addLabels()\n .reinforceStems()\n .reinforceLoops();\n\n\n } else if (molecule.type == 'protein') {\n rg = new ProteinGraph(molecule.header, molecule.size);\n\n }\n\n rg.addUids(molecule.uids);\n\n for (var j = 0; j < rg.nodes.length; j++) {\n nodes[rg.nodes[j].uid] = rg.nodes[j];\n }\n\n graphs.push(rg);\n }\n\n //Add the extra links\n for (var i = 0; i < moleculesJson.extraLinks.length; i++) {\n link = moleculesJson.extraLinks[i];\n\n link.source = nodes[link.source];\n link.target = nodes[link.target];\n link.uid = slugid.nice();\n\n extraLinks.push(link);\n }\n\n return {'graphs': graphs, 'extraLinks': extraLinks};\n};\n","export function simpleXyCoordinates (pair_table) {\n var INIT_ANGLE=0.; /* initial bending angle */\n var INIT_X = 100.; /* coordinate of first digit */\n var INIT_Y = 100.; /* see above */\n var RADIUS = 15.;\n\n var x = [], y = [];\n\n var i, len;\n var alpha;\n\n len = pair_table[0];\n var angle = Array.apply(null, new Array(len+5)).map(Number.prototype.valueOf,0); \n var loop_size = Array.apply(null, new Array(16+Math.floor(len/5)))\n .map(Number.prototype.valueOf, 0); \n var stack_size = Array.apply(null, new Array(16+Math.floor(len/5)))\n .map(Number.prototype.valueOf, 0); \n\n var lp = 0;\n var stk = 0;\n var PIHALF = Math.PI / 2;\n\n\n var loop = function(i, j, pair_table)\n /* i, j are the positions AFTER the last pair of a stack; i.e\n i-1 and j+1 are paired. */\n {\n var count = 2; /* counts the VERTICES of a loop polygon; that's\n NOT necessarily the number of unpaired bases!\n Upon entry the loop has already 2 vertices, namely\n the pair i-1/j+1. */\n\n var r = 0, bubble = 0; /* bubble counts the unpaired digits in loops */\n\n var i_old, partner, k, l, start_k, start_l, fill, ladder;\n var begin, v, diff;\n var polygon;\n\n var remember = Array.apply(null, new Array((3+Math.floor((j-i)/5)*2))).map(Number.prototype.valueOf, 0);\n\n i_old = i-1, j++; /* j has now been set to the partner of the\n previous pair for correct while-loop\n termination. */\n while (i != j) {\n partner = pair_table[i];\n if ((!partner) || (i==0))\n i++, count++, bubble++;\n else {\n count += 2;\n k = i, l = partner; /* beginning of stack */\n remember[++r] = k;\n remember[++r] = l;\n i = partner+1; /* next i for the current loop */\n\n start_k = k, start_l = l;\n ladder = 0;\n do {\n k++, l--, ladder++; /* go along the stack region */\n }\n while ((pair_table[k] == l) && (pair_table[k] > k));\n\n fill = ladder-2;\n if (ladder >= 2) {\n angle[start_k+1+fill] += PIHALF; /* Loop entries and */\n angle[start_l-1-fill] += PIHALF; /* exits get an */\n angle[start_k] += PIHALF; /* additional PI/2. */\n angle[start_l] += PIHALF; /* Why ? (exercise) */\n if (ladder > 2) {\n for (; fill >= 1; fill--) {\n angle[start_k+fill] = Math.PI; /* fill in the angles */\n angle[start_l-fill] = Math.PI; /* for the backbone */\n }\n }\n }\n stack_size[++stk] = ladder;\n if (k <= l)\n loop(k, l, pair_table);\n }\n }\n\n polygon = Math.PI*(count-2)/count; /* bending angle in loop polygon */\n remember[++r] = j;\n begin = i_old < 0 ? 0 : i_old;\n for (v = 1; v <= r; v++) {\n diff = remember[v]-begin;\n for (fill = 0; fill <= diff; fill++)\n angle[begin+fill] += polygon;\n if (v > r)\n break;\n begin = remember[++v];\n }\n loop_size[++lp] = bubble;\n }\n\n loop(0, len+1, pair_table);\n loop_size[lp] -= 2; /* correct for cheating with function loop */\n\n alpha = INIT_ANGLE;\n x[0] = INIT_X;\n y[0] = INIT_Y;\n\n var poss = [];\n\n poss.push([x[0], y[0]]);\n for (i = 1; i < len; i++) {\n x[i] = x[i-1]+RADIUS*Math.cos(alpha);\n y[i] = y[i-1]+RADIUS*Math.sin(alpha);\n\n poss.push([x[i], y[i]]);\n alpha += Math.PI-angle[i+1];\n }\n\n return poss;\n}\n","export function Radloop() {\n\tthis.radius = null;\n\tthis.loopnumber = null;\n\tthis.next = null;\n this.prev = null;\n}\n\nRadloop.prototype.getRadius = function(){\n\treturn this.radius;\n}\n\nRadloop.prototype.setRadius = function(radius){\n\tthis.radius = radius;\n}\n\nRadloop.prototype.getLoopnumber = function(){\n\treturn this.loopnumber;\n}\n\nRadloop.prototype.setLoopnumber = function(loopnumber){\n\tthis.loopnumber = loopnumber;\n}\n\nRadloop.prototype.getNext = function(){\n\treturn this.next;\n}\n\nRadloop.prototype.setNext = function(next){\n\tthis.next = next;\n}\n\nRadloop.prototype.getPrev = function(){\n\treturn this.prev;\n}\n\nRadloop.prototype.setPrev = function(prev){\n\tthis.prev = prev;\n}\n","import {Region} from './region.js';\n\nexport function Base() {\n\tthis.mate = null;\n\tthis.x = null;\n this.y = null;\n\tthis.extracted = null;\n\tthis.region = new Region();\n}\n\nBase.prototype.getMate = function(){\n\treturn this.mate;\n}\n\nBase.prototype.setMate = function(mate){\n\tthis.mate = mate;\n}\n\nBase.prototype.getX = function(){\n\treturn this.x;\n}\n\nBase.prototype.setX = function(x){\n\tthis.x = x;\n}\n\nBase.prototype.getY = function(){\n\treturn this.y;\n}\n\nBase.prototype.setY = function(y){\n\tthis.y = y;\n}\n\nBase.prototype.isExtracted = function(){\n\treturn this.extracted;\n}\n\nBase.prototype.setExtracted = function(extracted){\n\tthis.extracted = extracted;\n}\n\nBase.prototype.getRegion = function(){\n\treturn this.region;\n}\n\nBase.prototype.setRegion = function(region){\n\tthis.region = region;\n}\n","import {Radloop} from './radloop.js';\nimport {Connection} from './connection.js';\nimport {Region} from './region.js';\nimport {Base} from './base.js';\nimport {Loop} from './loop.js';\n\nexport function NAView(){\n this.ANUM = 9999.0;\n\tthis.MAXITER = 500;\n\n\tthis.bases = [];\n\tthis.nbase = null;\n this.nregion = null;\n this.loop_count = null;\n\n\tthis.root = new Loop();\n\tthis.loops = [];\n\n\tthis.regions = [];\n\n\tthis.rlphead = new Radloop();\n\n\tthis.lencut = 0.8;\n\tthis.RADIUS_REDUCTION_FACTOR = 1.4;\n\n\t// show algorithm step by step\n\tthis.angleinc = null;\n\n\tthis._h = null;\n\n\t// private boolean noIterationFailureYet = true;\n\n\tthis.HELIX_FACTOR = 0.6;\n\tthis.BACKBONE_DISTANCE = 27;\n}\n\nNAView.prototype.naview_xy_coordinates = function(pair_table){\n var x = [];\n\tvar y = [];\n if (pair_table.length === 0 || pair_table[0] === 0){\n return 0;\n }\n var i;\n this.nbase = pair_table[0];\n this.bases = [];\n for (var index = 0; index < this.nbase + 1; index++){\n this.bases.push(new Base());\n }\n this.regions = [];\n for (var index = 0; index < this.nbase + 1; index++){\n this.regions.push(new Region());\n }\n this.read_in_bases(pair_table);\n this.rlphead = null;\n this.find_regions();\n this.loop_count = 0;\n this.loops = [];\n for (var index = 0; index < this.nbase + 1; index++){\n this.loops.push(new Loop());\n }\n this.construct_loop(0);\n this.find_central_loop();\n this.traverse_loop(this.root, null);\n\n for (i = 0; i < this.nbase; i++){\n x.push(100 + this.BACKBONE_DISTANCE * this.bases[i + 1].getX());\n y.push(100 + this.BACKBONE_DISTANCE * this.bases[i + 1].getY());\n }\n\n return {\n nbase: this.nbase,\n x: x,\n y: y\n }\n}\n\nNAView.prototype.read_in_bases = function read_in_bases(pair_table){\n var i = null;\n var npairs = null;\n\n // Set up an origin.\n this.bases.push(new Base());\n this.bases[0].setMate(0);\n this.bases[0].setExtracted(false);\n this.bases[0].setX(this.ANUM);\n this.bases[0].setY(this.ANUM);\n\n for (npairs = 0, i = 1; i <= this.nbase; i++){\n this.bases.push(new Base());\n this.bases[i].setExtracted(false);\n this.bases[i].setX(this.ANUM);\n this.bases[i].setY(this.ANUM);\n this.bases[i].setMate(pair_table[i]);\n if (pair_table[i] > i)\n npairs++;\n }\n // must have at least 1 pair to avoid segfault\n if (npairs == 0){\n this.bases[1].setMate(this.nbase);\n this.bases[this.nbase].setMate(1);\n }\n}\n\nNAView.prototype.find_regions = function find_regions(){\n var i = null;\n var mate = null;\n var nb1 = null;\n\n nb1 = this.nbase + 1;\n var mark = [];\n for (i = 0; i < nb1; i++){\n mark.push(false);\n }\n this.nregion = 0;\n for (i = 0; i <= this.nbase; i++) {\n if ((mate = this.bases[i].getMate()) != 0 && !mark[i]) {\n this.regions[this.nregion].setStart1(i);\n this.regions[this.nregion].setEnd2(mate);\n mark[i] = true;\n mark[mate] = true;\n this.bases[i].setRegion(this.regions[this.nregion]);\n this.bases[mate].setRegion(this.regions[this.nregion]);\n for (i++, mate--; i < mate && this.bases[i].getMate() == mate; i++, mate--) {\n mark[mate] = true;\n mark[i]= true;\n this.bases[i].setRegion(this.regions[this.nregion]);\n this.bases[mate].setRegion(this.regions[this.nregion]);\n }\n this.regions[this.nregion].setEnd1(--i);\n this.regions[this.nregion].setStart2(mate + 1);\n\n this.nregion++;\n }\n }\n}\n\nNAView.prototype.construct_loop = function construct_loop(ibase){\n var i = null;\n var mate = null;\n var retloop = new Loop();\n var lp = new Loop();\n var cp = new Connection();\n var rp = new Region();\n var rlp = new Radloop();\n retloop = this.loops[this.loop_count++];\n retloop.setNconnection(0);\n retloop.setDepth(0);\n retloop.setNumber(this.loop_count);\n retloop.setRadius(0.0);\n\n for (rlp = this.rlphead; rlp != null; rlp = rlp.getNext())\n if (rlp.getLoopnumber() == this.loop_count)\n retloop.setRadius(rlp.getRadius());\n i = ibase;\n do {\n if ((mate = this.bases[i].getMate()) != 0) {\n rp = this.bases[i].getRegion();\n if (!this.bases[rp.getStart1()].isExtracted()) {\n if (i == rp.getStart1()) {\n this.bases[rp.getStart1()].setExtracted(true);\n this.bases[rp.getEnd1()].setExtracted(true);\n this.bases[rp.getStart2()].setExtracted(true);\n this.bases[rp.getEnd2()].setExtracted(true);\n lp = this.construct_loop(rp.getEnd1() < this.nbase ? rp.getEnd1() + 1\n : 0);\n } else if (i == rp.getStart2()) {\n this.bases[rp.getStart2()].setExtracted(true);\n this.bases[rp.getEnd2()].setExtracted(true);\n this.bases[rp.getStart1()].setExtracted(true);\n this.bases[rp.getEnd1()].setExtracted(true);\n lp = this.construct_loop(rp.getEnd2() < this.nbase ? rp.getEnd2() + 1\n : 0);\n } else {\n console.log(\"Something went terribly wrong ....\");\n }\n retloop.setNconnection(retloop.getNconnection() + 1);\n cp = new Connection();\n retloop.setConnection(retloop.getNconnection() - 1,\tcp);\n retloop.setConnection(retloop.getNconnection(), null);\n cp.setLoop(lp);\n cp.setRegion(rp);\n if(i == rp.getStart1()) {\n cp.setStart(rp.getStart1());\n cp.setEnd(rp.getEnd2());\n } else {\n cp.setStart(rp.getStart2());\n cp.setEnd(rp.getEnd1());\n }\n cp.setExtruded(false);\n cp.setBroken(false);\n lp.setNconnection(lp.getNconnection() + 1);\n cp = new Connection();\n lp.setConnection(lp.getNconnection() - 1, cp);\n lp.setConnection(lp.getNconnection(), null);\n cp.setLoop(retloop);\n cp.setRegion(rp);\n if (i == rp.getStart1()) {\n cp.setStart(rp.getStart2());\n cp.setEnd(rp.getEnd1());\n } else {\n cp.setStart(rp.getStart1());\n cp.setEnd(rp.getEnd2());\n }\n cp.setExtruded(false);\n cp.setBroken(false);\n }\n i = mate;\n }\n if (++i > this.nbase)\n i = 0;\n } while (i != ibase);\n return retloop;\n}\n\nNAView.prototype.find_central_loop = function find_central_loop(){\n var lp = new Loop();\n var maxconn = null;\n var maxdepth = null;\n var i = null;\n\n determine_depths.bind(this)();\n maxconn = 0;\n maxdepth = -1;\n for (i = 0; i < this.loop_count; i++) {\n lp = this.loops[i];\n if (lp.getNconnection() > maxconn) {\n maxdepth = lp.getDepth();\n maxconn = lp.getNconnection();\n this.root = lp;\n } else if (lp.getDepth() > maxdepth\n && lp.getNconnection() == maxconn) {\n maxdepth = lp.getDepth();\n this.root = lp;\n }\n }\n}\n\nfunction determine_depths() {\n var lp = new Loop();\n var i = null;\n var j = null;\n\n for (i = 0; i < this.loop_count; i++) {\n lp = this.loops[i];\n for (j = 0; j < this.loop_count; j++){\n this.loops[j].setMark(false);\n }\n lp.setDepth(depth(lp));\n }\n}\n\nfunction depth(lp){\n var count = null;\n var ret = null;\n var d = null;\n\n if (lp.getNconnection() <= 1){\n return 0;\n }\n if (lp.isMark()){\n return -1;\n }\n lp.setMark(true);\n count = 0;\n ret = 0;\n for (var i = 0; lp.getConnection(i) != null; i++) {\n d = depth(lp.getConnection(i).getLoop());\n if (d >= 0) {\n if (++count == 1){\n ret = d;\n }\n else if (ret > d){\n ret = d;\n }\n }\n }\n lp.setMark(false);\n return ret + 1;\n}\n\nNAView.prototype.traverse_loop = function traverse_loop(lp, anchor_connection){\n var xs, ys, xe, ye, xn, yn, angleinc, r;\n var radius, xc, yc, xo, yo, astart, aend, a;\n var cp, cpnext, acp, cpprev;\n var i, j, n, ic;\n var da, maxang;\n var count, icstart, icend, icmiddle, icroot;\n var done, done_all_connections, rooted;\n var sign;\n var midx, midy, nrx, nry, mx, my, vx, vy, dotmv, nmidx, nmidy;\n var icstart1, icup, icdown, icnext, direction;\n var dan, dx, dy, rr;\n var cpx, cpy, cpnextx, cpnexty, cnx, cny, rcn, rc, lnx, lny, rl, ac, acn, sx, sy, dcp;\n var imaxloop = 0;\n\n angleinc = 2 * Math.PI / (this.nbase + 1);\n acp = null;\n icroot = -1;\n var indice = 0;\n\n for (ic = 0; (cp = lp.getConnection(indice)) != null; indice++, ic++) {\n xs = -Math.sin(angleinc * cp.getStart());\n ys = Math.cos(angleinc * cp.getStart());\n xe = -Math.sin(angleinc * cp.getEnd());\n ye = Math.cos(angleinc * cp.getEnd());\n xn = ye - ys;\n yn = xs - xe;\n r = Math.sqrt(xn * xn + yn * yn);\n cp.setXrad(xn / r);\n cp.setYrad(yn / r);\n cp.setAngle(Math.atan2(yn, xn));\n if (cp.getAngle() < 0.0){\n cp.setAngle(cp.getAngle() + 2 * Math.PI);\n }\n if (anchor_connection != null\n && anchor_connection.getRegion() == cp.getRegion()) {\n acp = cp;\n icroot = ic;\n }\n }\n set_radius: while (true) {\n this.determine_radius(lp, this.lencut);\n radius = lp.getRadius()/this.RADIUS_REDUCTION_FACTOR;\n if (anchor_connection == null){\n xc = yc = 0.0;\n }\n else {\n xo = (this.bases[acp.getStart()].getX() + this.bases\n [acp.getEnd()].getX()) / 2.0;\n yo = (this.bases[acp.getStart()].getY() + this.bases\n [acp.getEnd()].getY()) / 2.0;\n xc = xo - radius * acp.getXrad();\n yc = yo - radius * acp.getYrad();\n }\n\n // The construction of the connectors will proceed in blocks of\n // connected connectors, where a connected connector pairs means two\n // connectors that are forced out of the drawn circle because they\n // are too close together in angle.\n\n // First, find the start of a block of connected connectors\n\n if (icroot == -1){\n icstart = 0;\n }\n else {\n icstart = icroot;\n }\n cp = lp.getConnection(icstart);\n count = 0;\n done = false;\n do {\n j = icstart - 1;\n if (j < 0){\n j = lp.getNconnection() - 1;\n }\n cpprev = lp.getConnection(j);\n if (!this.connected_connection(cpprev, cp)) {\n done = true;\n }\n else {\n icstart = j;\n cp = cpprev;\n }\n if (++count > lp.getNconnection()) {\n // Here everything is connected. Break on maximum angular\n // separation between connections.\n maxang = -1.0;\n for (ic = 0; ic < lp.getNconnection(); ic++) {\n j = ic + 1;\n if (j >= lp.getNconnection()){\n j = 0;\n }\n cp = lp.getConnection(ic);\n cpnext = lp.getConnection(j);\n ac = cpnext.getAngle() - cp.getAngle();\n if (ac < 0.0){\n ac += 2 * Math.PI;\n }\n if (ac > maxang) {\n maxang = ac;\n imaxloop = ic;\n }\n }\n icend = imaxloop;\n icstart = imaxloop + 1;\n if (icstart >= lp.getNconnection()){\n icstart = 0;\n }\n cp = lp.getConnection(icend);\n cp.setBroken(true);\n done = true;\n }\n } while (!done);\n done_all_connections = false;\n icstart1 = icstart;\n while (!done_all_connections) {\n count = 0;\n done = false;\n icend = icstart;\n rooted = false;\n while (!done) {\n cp = lp.getConnection(icend);\n if (icend == icroot){\n rooted = true;\n }\n j = icend + 1;\n if (j >= lp.getNconnection()) {\n j = 0;\n }\n cpnext = lp.getConnection(j);\n if (this.connected_connection(cp, cpnext)) {\n if (++count >= lp.getNconnection()){\n break;\n }\n icend = j;\n }\n else {\n done = true;\n }\n }\n icmiddle = this.find_ic_middle(icstart, icend, anchor_connection,\n acp, lp);\n ic = icup = icdown = icmiddle;\n done = false;\n direction = 0;\n while (!done) {\n if (direction < 0) {\n ic = icup;\n }\n else if (direction == 0) {\n ic = icmiddle;\n }\n else {\n ic = icdown;\n }\n if (ic >= 0) {\n cp = lp.getConnection(ic);\n if (anchor_connection == null || acp != cp) {\n if (direction == 0) {\n astart = cp.getAngle()\n - Math.asin(1.0 / 2.0 / radius);\n aend = cp.getAngle()\n + Math.asin(1.0 / 2.0 / radius);\n this.bases[cp.getStart()].setX(\n xc + radius * Math.cos(astart));\n this.bases[cp.getStart()].setY(\n yc + radius * Math.sin(astart));\n this.bases[cp.getEnd()].setX(\n xc + radius * Math.cos(aend));\n this.bases[cp.getEnd()].setY(\n yc + radius * Math.sin(aend));\n }\n else if (direction < 0) {\n j = ic + 1;\n if (j >= lp.getNconnection()){\n j = 0;\n }\n cp = lp.getConnection(ic);\n cpnext = lp.getConnection(j);\n cpx = cp.getXrad();\n cpy = cp.getYrad();\n ac = (cp.getAngle() + cpnext.getAngle()) / 2.0;\n if (cp.getAngle() > cpnext.getAngle()){\n ac -= Math.PI;\n }\n cnx = Math.cos(ac);\n cny = Math.sin(ac);\n lnx = cny;\n lny = -cnx;\n da = cpnext.getAngle() - cp.getAngle();\n if (da < 0.0){\n da += 2 * Math.PI;\n }\n if (cp.isExtruded()) {\n if (da <= Math.PI / 2){\n rl = 2.0;\n }\n else {\n rl = 1.5;\n }\n }\n else {\n rl = 1.0;\n }\n this.bases[cp.getEnd()].setX(\n this.bases[cpnext.getStart()].getX()\n + rl * lnx);\n this.bases[cp.getEnd()].setY(\n this.bases[cpnext.getStart()].getY()\n + rl * lny);\n this.bases[cp.getStart()].setX(\n this.bases[cp.getEnd()].getX() + cpy);\n this.bases[cp.getStart()].setY(\n this.bases[cp.getEnd()].getY() - cpx);\n } else {\n j = ic - 1;\n if (j < 0){\n j = lp.getNconnection() - 1;\n }\n cp = lp.getConnection(j);\n cpnext = lp.getConnection(ic);\n cpnextx = cpnext.getXrad();\n cpnexty = cpnext.getYrad();\n ac = (cp.getAngle() + cpnext.getAngle()) / 2.0;\n if (cp.getAngle() > cpnext.getAngle()){\n ac -= Math.PI;\n }\n cnx = Math.cos(ac);\n cny = Math.sin(ac);\n lnx = -cny;\n lny = cnx;\n da = cpnext.getAngle() - cp.getAngle();\n if (da < 0.0){\n da += 2 * Math.PI;\n }\n if (cp.isExtruded()) {\n if (da <= Math.PI / 2){\n rl = 2.0;\n }\n else {\n rl = 1.5;\n }\n }\n else {\n rl = 1.0;\n }\n this.bases[cpnext.getStart()].setX(\n this.bases[cp.getEnd()].getX() + rl\n * lnx);\n this.bases[cpnext.getStart()].setY(\n this.bases[cp.getEnd()].getY() + rl\n * lny);\n this.bases[cpnext.getEnd()].setX(\n this.bases[cpnext.getStart()].getX()\n - cpnexty);\n this.bases[cpnext.getEnd()].setY(\n this.bases[cpnext.getStart()].getY()\n + cpnextx);\n }\n }\n }\n if (direction < 0) {\n if (icdown == icend) {\n icdown = -1;\n }\n else if (icdown >= 0) {\n if (++icdown >= lp.getNconnection()) {\n icdown = 0;\n }\n }\n direction = 1;\n }\n else {\n if (icup == icstart){\n icup = -1;\n }\n else if (icup >= 0) {\n if (--icup < 0) {\n icup = lp.getNconnection() - 1;\n }\n }\n direction = -1;\n }\n done = icup == -1 && icdown == -1;\n }\n icnext = icend + 1;\n if (icnext >= lp.getNconnection()){\n icnext = 0;\n }\n if (icend != icstart\n && (!(icstart == icstart1 && icnext == icstart1))) {\n\n // Move the bases just constructed (or the radius) so that\n // the bisector of the end points is radius distance away\n // from the loop center.\n\n cp = lp.getConnection(icstart);\n cpnext = lp.getConnection(icend);\n dx = this.bases[cpnext.getEnd()].getX()\n - this.bases[cp.getStart()].getX();\n dy = this.bases[cpnext.getEnd()].getY()\n - this.bases[cp.getStart()].getY();\n midx = this.bases[cp.getStart()].getX() + dx / 2.0;\n midy = this.bases[cp.getStart()].getY() + dy / 2.0;\n rr = Math.sqrt(dx * dx + dy * dy);\n mx = dx / rr;\n my = dy / rr;\n vx = xc - midx;\n vy = yc - midy;\n rr = Math.sqrt(dx * dx + dy * dy);\n vx /= rr;\n vy /= rr;\n dotmv = vx * mx + vy * my;\n nrx = dotmv * mx - vx;\n nry = dotmv * my - vy;\n rr = Math.sqrt(nrx * nrx + nry * nry);\n nrx /= rr;\n nry /= rr;\n\n // Determine which side of the bisector the center should\n // be.\n\n dx = this.bases[cp.getStart()].getX() - xc;\n dy = this.bases[cp.getStart()].getY() - yc;\n ac = Math.atan2(dy, dx);\n if (ac < 0.0){\n ac += 2 * Math.PI;\n }\n dx = this.bases[cpnext.getEnd()].getX() - xc;\n dy = this.bases[cpnext.getEnd()].getY() - yc;\n acn = Math.atan2(dy, dx);\n if (acn < 0.0){\n acn += 2 * Math.PI;\n }\n if (acn < ac){\n acn += 2 * Math.PI;\n }\n if (acn - ac > Math.PI){\n sign = -1;\n }\n else {\n sign = 1;\n }\n nmidx = xc + sign * radius * nrx;\n nmidy = yc + sign * radius * nry;\n if (rooted) {\n xc -= nmidx - midx;\n yc -= nmidy - midy;\n }\n else {\n for (ic = icstart;;) {\n cp = lp.getConnection(ic);\n i = cp.getStart();\n this.bases[i].setX(\n this.bases[i].getX() + nmidx - midx);\n this.bases[i].setY(\n this.bases[i].getY() + nmidy - midy);\n i = cp.getEnd();\n this.bases[i].setX(\n this.bases[i].getX() + nmidx - midx);\n this.bases[i].setY(\n this.bases[i].getY() + nmidy - midy);\n if (ic == icend){\n break;\n }\n if (++ic >= lp.getNconnection()){\n ic = 0;\n }\n }\n }\n }\n icstart = icnext;\n done_all_connections = icstart == icstart1;\n }\n for (ic = 0; ic < lp.getNconnection(); ic++) {\n cp = lp.getConnection(ic);\n j = ic + 1;\n if (j >= lp.getNconnection()){\n j = 0;\n }\n cpnext = lp.getConnection(j);\n dx = this.bases[cp.getEnd()].getX() - xc;\n dy = this.bases[cp.getEnd()].getY() - yc;\n rc = Math.sqrt(dx * dx + dy * dy);\n ac = Math.atan2(dy, dx);\n if (ac < 0.0){\n ac += 2 * Math.PI;\n }\n dx = this.bases[cpnext.getStart()].getX() - xc;\n dy = this.bases[cpnext.getStart()].getY() - yc;\n rcn = Math.sqrt(dx * dx + dy * dy);\n acn = Math.atan2(dy, dx);\n if (acn < 0.0){\n acn += 2 * Math.PI;\n }\n if (acn < ac){\n acn += 2 * Math.PI;\n }\n dan = acn - ac;\n dcp = cpnext.getAngle() - cp.getAngle();\n if (dcp <= 0.0){\n dcp += 2 * Math.PI;\n }\n if (Math.abs(dan - dcp) > Math.PI) {\n if (cp.isExtruded()) {\n console.log(\"Warning from traverse_loop. Loop \"\n + lp.getNumber() + \" has crossed regions\\n\");\n }\n else if ((cpnext.getStart() - cp.getEnd()) != 1) {\n cp.setExtruded(true);\n continue set_radius; // remplacement du goto\n }\n }\n if (cp.isExtruded()) {\n this.construct_extruded_segment(cp, cpnext);\n }\n else {\n n = cpnext.getStart() - cp.getEnd();\n if (n < 0){\n n += this.nbase + 1;\n }\n angleinc = dan / n;\n for (j = 1; j < n; j++) {\n i = cp.getEnd() + j;\n if (i > this.nbase){\n i -= this.nbase + 1;\n }\n a = ac + j * angleinc;\n rr = rc + (rcn - rc) * (a - ac) / dan;\n this.bases[i].setX(xc + rr * Math.cos(a));\n this.bases[i].setY(yc + rr * Math.sin(a));\n }\n }\n }\n break;\n }\n for (ic = 0; ic < lp.getNconnection(); ic++) {\n if (icroot != ic) {\n cp = lp.getConnection(ic);\n //IM HERE\n this.generate_region(cp);\n this.traverse_loop(cp.getLoop(), cp);\n }\n }\n n = 0;\n sx = 0.0;\n sy = 0.0;\n for (ic = 0; ic < lp.getNconnection(); ic++) {\n j = ic + 1;\n if (j >= lp.getNconnection()){\n j = 0;\n }\n cp = lp.getConnection(ic);\n cpnext = lp.getConnection(j);\n n += 2;\n sx += this.bases[cp.getStart()].getX()\n + this.bases[cp.getEnd()].getX();\n sy += this.bases[cp.getStart()].getY()\n + this.bases[cp.getEnd()].getY();\n if (!cp.isExtruded()) {\n for (j = cp.getEnd() + 1; j != cpnext.getStart(); j++) {\n if (j > this.nbase){\n j -= this.nbase + 1;\n }\n n++;\n sx += this.bases[j].getX();\n sy += this.bases[j].getY();\n }\n }\n }\n lp.setX(sx / n);\n lp.setY(sy / n);\n}\n\nNAView.prototype.determine_radius = function determine_radius(lp, lencut){\n var mindit, ci, dt, sumn, sumd, radius, dit;\n var i, j, end, start, imindit = 0;\n var cp = new Connection(), cpnext = new Connection();\n var rt2_2 = 0.7071068;\n\n do {\n mindit = 1.0e10;\n for (sumd = 0.0, sumn = 0.0, i = 0; i < lp.getNconnection(); i++) {\n cp = lp.getConnection(i);\n j = i + 1;\n if (j >= lp.getNconnection()){\n j = 0;\n }\n cpnext = lp.getConnection(j);\n end = cp.getEnd();\n start = cpnext.getStart();\n if (start < end){\n start += this.nbase + 1;\n }\n dt = cpnext.getAngle() - cp.getAngle();\n if (dt <= 0.0){\n dt += 2 * Math.PI;\n }\n if (!cp.isExtruded()){\n ci = start - end;\n }\n else {\n if (dt <= Math.PI / 2){\n ci = 2.0;\n }\n else {\n ci = 1.5;\n }\n }\n sumn += dt * (1.0 / ci + 1.0);\n sumd += dt * dt / ci;\n dit = dt / ci;\n if (dit < mindit && !cp.isExtruded() && ci > 1.0) {\n mindit = dit;\n imindit = i;\n }\n }\n radius = sumn / sumd;\n if (radius < rt2_2){\n radius = rt2_2;\n }\n if (mindit * radius < lencut) {\n lp.getConnection(imindit).setExtruded(true);\n }\n } while (mindit * radius < lencut);\n if (lp.getRadius() > 0.0){\n radius = lp.getRadius();\n }\n else {\n lp.setRadius(radius);\n }\n}\n\nNAView.prototype.find_ic_middle = function find_ic_middle(icstart, icend, anchor_connection, acp, lp){\n var count, ret, ic, i;\n var done;\n\n count = 0;\n ret = -1;\n ic = icstart;\n done = false;\n while (!done) {\n if (count++ > lp.getNconnection() * 2) {\n console.log(\"Infinite loop in 'find_ic_middle'\");\n }\n if (anchor_connection != null && lp.getConnection(ic) == acp) {\n ret = ic;\n }\n done = ic == icend;\n if (++ic >= lp.getNconnection()) {\n ic = 0;\n }\n }\n if (ret == -1) {\n for (i = 1, ic = icstart; i < (count + 1) / 2; i++) {\n if (++ic >= lp.getNconnection())\n ic = 0;\n }\n ret = ic;\n }\n return ret;\n}\n\nNAView.prototype.construct_extruded_segment = function construct_extruded_segment(cp, cpnext){\n var astart, aend1, aend2, aave, dx, dy, a1, a2, ac, rr, da, dac;\n var start, end, n, nstart, nend;\n var collision;\n\n astart = cp.getAngle();\n aend2 = aend1 = cpnext.getAngle();\n if (aend2 < astart){\n aend2 += 2 * Math.PI;\n }\n aave = (astart + aend2) / 2.0;\n start = cp.getEnd();\n end = cpnext.getStart();\n n = end - start;\n if (n < 0){\n n += this.nbase + 1;\n }\n da = cpnext.getAngle() - cp.getAngle();\n if (da < 0.0) {\n da += 2 * Math.PI;\n }\n if (n == 2) {\n this.construct_circle_segment(start, end);\n }\n else {\n dx = this.bases[end].getX() - this.bases[start].getX();\n dy = this.bases[end].getY() - this.bases[start].getY();\n rr = Math.sqrt(dx * dx + dy * dy);\n dx /= rr;\n dy /= rr;\n if (rr >= 1.5 && da <= Math.PI / 2) {\n nstart = start + 1;\n if (nstart > this.nbase){\n nstart -= this.nbase + 1;\n }\n nend = end - 1;\n if (nend < 0){\n nend += this.nbase + 1;\n }\n this.bases[nstart].setX(this.bases[start].getX() + 0.5 * dx);\n this.bases[nstart].setY(this.bases[start].getY() + 0.5 * dy);\n this.bases[nend].setX(this.bases[end].getX() - 0.5 * dx);\n this.bases[nend].setY(this.bases[end].getY() - 0.5 * dy);\n start = nstart;\n end = nend;\n }\n do {\n collision = false;\n this.construct_circle_segment(start, end);\n nstart = start + 1;\n if (nstart > this.nbase) {\n nstart -= this.nbase + 1;\n }\n dx = this.bases[nstart].getX() - this.bases[start].getX();\n dy = this.bases[nstart].getY() - this.bases[start].getY();\n a1 = Math.atan2(dy, dx);\n if (a1 < 0.0){\n a1 += 2 * Math.PI;\n }\n dac = a1 - astart;\n if (dac < 0.0){\n dac += 2 * Math.PI;\n }\n if (dac > Math.PI){\n collision = true;\n }\n nend = end - 1;\n if (nend < 0){\n nend += this.nbase + 1;\n }\n dx = this.bases[nend].getX() - this.bases[end].getX();\n dy = this.bases[nend].getY() - this.bases[end].getY();\n a2 = Math.atan2(dy, dx);\n if (a2 < 0.0){\n a2 += 2 * Math.PI;\n }\n dac = aend1 - a2;\n if (dac < 0.0){\n dac += 2 * Math.PI;\n }\n if (dac > Math.PI){\n collision = true;\n }\n if (collision) {\n ac = this.minf2(aave, astart + 0.5);\n this.bases[nstart].setX(\n this.bases[start].getX() + Math.cos(ac));\n this.bases[nstart].setY(\n this.bases[start].getY() + Math.sin(ac));\n start = nstart;\n ac = this.maxf2(aave, aend2 - 0.5);\n this.bases[nend].setX(this.bases[end].getX() + Math.cos(ac));\n this.bases[nend].setY(this.bases[end].getY() + Math.sin(ac));\n end = nend;\n n -= 2;\n }\n } while (collision && n > 1);\n }\n}\n\nNAView.prototype.construct_circle_segment = function construct_circle_segment(start, end){\n var dx, dy, rr, midx, midy, xn, yn, nrx, nry, mx, my, a;\n var l, j, i;\n\n dx = this.bases[end].getX() - this.bases[start].getX();\n dy = this.bases[end].getY() - this.bases[start].getY();\n rr = Math.sqrt(dx * dx + dy * dy);\n l = end - start;\n if (l < 0){\n l += this.nbase + 1;\n }\n if (rr >= l) {\n dx /= rr;\n dy /= rr;\n for (j = 1; j < l; j++) {\n i = start + j;\n if (i > this.nbase){\n i -= this.nbase + 1;\n }\n this.bases[i].setX(\n this.bases[start].getX() + dx * j / l);\n this.bases[i].setY(\n this.bases[start].getY() + dy * j / l);\n }\n }\n else {\n this.find_center_for_arc((l - 1), rr);\n dx /= rr;\n dy /= rr;\n midx = this.bases[start].getX() + dx * rr / 2.0;\n midy = this.bases[start].getY() + dy * rr / 2.0;\n xn = dy;\n yn = -dx;\n nrx = midx + this._h * xn;\n nry = midy + this._h * yn;\n mx = this.bases[start].getX() - nrx;\n my = this.bases[start].getY() - nry;\n rr = Math.sqrt(mx * mx + my * my);\n a = Math.atan2(my, mx);\n for (j = 1; j < l; j++) {\n i = start + j;\n if (i > this.nbase){\n i -= this.nbase + 1;\n }\n this.bases[i].setX(nrx + rr * Math.cos(a + j * this.angleinc));\n this.bases[i].setY(nry + rr * Math.sin(a + j * this.angleinc));\n }\n }\n}\n\nNAView.prototype.find_center_for_arc = function find_center_for_arc(n, b){\n var h, hhi, hlow, r, disc, theta, e, phi;\n var iter;\n\n hhi = (n + 1.0) / Math.PI;\n // changed to prevent div by zero if (ih)\n hlow = -hhi - b / (n + 1.000001 - b);\n if (b < 1){\n // otherwise we might fail below (ih)\n hlow = 0;\n }\n iter = 0;\n do {\n h = (hhi + hlow) / 2.0;\n r = Math.sqrt(h * h + b * b / 4.0);\n disc = 1.0 - 0.5 / (r * r);\n if (Math.abs(disc) > 1.0) {\n console.log(\"Unexpected large magnitude discriminant = \" + disc\n + \" \" + r);\n }\n theta = Math.acos(disc);\n phi = Math.acos(h / r);\n e = theta * (n + 1) + 2 * phi - 2 * Math.PI;\n if (e > 0.0) {\n hlow = h;\n }\n else {\n hhi = h;\n }\n } while (Math.abs(e) > 0.0001 && ++iter < this.MAXITER);\n if (iter >= this.MAXITER) {\n if (noIterationFailureYet) {\n console.log(\"Iteration failed in find_center_for_arc\");\n noIterationFailureYet = false;\n }\n h = 0.0;\n theta = 0.0;\n }\n this._h = h;\n this.angleinc = theta;\n}\n\nNAView.prototype.generate_region = function generate_region(cp){\n var l, start, end, i, mate;\n var rp;\n\n rp = cp.getRegion();\n l = 0;\n if (cp.getStart() == rp.getStart1()) {\n start = rp.getStart1();\n end = rp.getEnd1();\n }\n else {\n start = rp.getStart2();\n end = rp.getEnd2();\n }\n if (this.bases[cp.getStart()].getX() > this.ANUM - 100.0\n || this.bases[cp.getEnd()].getX() > this.ANUM - 100.0) {\n console.log(\n \"Bad region passed to generate_region. Coordinates not defined.\");\n }\n for (i = start + 1; i <= end; i++) {\n l++;\n this.bases[i].setX(\n this.bases[cp.getStart()].getX() + this.HELIX_FACTOR * l\n * cp.getXrad());\n this.bases[i].setY(\n this.bases[cp.getStart()].getY() + this.HELIX_FACTOR * l\n * cp.getYrad());\n mate = this.bases[i].getMate();\n this.bases[mate].setX(\n this.bases[cp.getEnd()].getX() + this.HELIX_FACTOR * l\n * cp.getXrad());\n this.bases[mate].setY(\n this.bases[cp.getEnd()].getY() + this.HELIX_FACTOR * l\n * cp.getYrad());\n\n }\n}\n\nNAView.prototype.minf2 = function minf2(x1, x2) {\n return ((x1) < (x2)) ? (x1) : (x2);\n}\n\nNAView.prototype.maxf2 = function maxf2(x1, x2) {\n return ((x1) > (x2)) ? (x1) : (x2);\n}\n\nNAView.prototype.connected_connection = function connected_connection(cp, cpnext) {\n if (cp.isExtruded()) {\n return true;\n }\n else if (cp.getEnd() + 1 == cpnext.getStart()) {\n return true;\n }\n else {\n return false;\n }\n}\n","/* Version: 0.2\n* Date: 2015-03-15\n*/\n\nimport fstyle from './fornac.css';\n\nimport d3 from 'd3';\nimport slugid from 'slugid';\nimport {contextMenu} from './d3-context-menu.js';\n\nimport {RNAGraph} from './rnagraph.js';\nimport {ColorScheme, rnaUtilities} from './rnautils.js';\n\nimport {simpleXyCoordinates} from './simplernaplot.js';\nimport {NAView} from './naview/naview.js';\n\nexport function FornaContainer(element, passedOptions = {}) {\n var self = this;\n\n let options = {\n 'editable': false,\n 'zoomable': true,\n 'animation': true,\n 'displayAllLinks': false,\n 'labelInterval': 10,\n 'chargeDistance': 110,\n 'friction': 0.35,\n 'middleCharge': -30,\n 'otherCharge': -30,\n 'linkDistanceMultiplier': 15,\n 'initialSize': null,\n 'layout': 'standard-polygonal',\n 'transitionDuration': 500,\n 'maxNodeRadius': 80 // the maximum radius of a node when the view is centered\n };\n\n self.options = Object.assign(options, passedOptions);\n\n if (self.options.initialSize !== null) {\n self.options.svgW = self.options.initialSize[0];\n self.options.svgH = self.options.initialSize[1];\n } else {\n self.options.svgW = 300;\n self.options.svgH = 300;\n }\n\n self.linkStrengths = {\n 'pseudoknot': 0.00,\n 'proteinChain': 0.00,\n 'chainChain': 0.00,\n 'intermolecule': 10.00,\n 'external': 0.00,\n 'other': 10.00\n };\n\n self.displayParameters = {\n 'displayNumbering': true,\n 'displayNodeOutline': true,\n 'displayNodeLabel': true,\n 'displayLinks': true,\n 'displayPseudoknotLinks': true,\n 'displayProteinLinks': true,\n 'displayDirectionArrows': true\n };\n\n self.colorScheme = 'structure';\n self.customColors = {};\n self.rnas = {};\n self.extraLinks = []; //store links between different RNAs\n\n // global mouse event vars\n var mousedownLink = null,\n mousedownNode = null,\n mouseupNode = null;\n let linkContextMenuShown = false;\n\n let resetMouseVars = () => {\n mousedownNode = null;\n mouseupNode = null;\n mousedownLink = null;\n }\n\n var graph = self.graph = {\n 'nodes':[],\n 'links':[]\n };\n\n Array.prototype.equals = function (array) {\n // if the other array is a falsy value, return\n if (!array)\n return false;\n\n // compare lengths - can save a lot of time\n if (this.length != array.length)\n return false;\n\n for (var i = 0, l=this.length; i < l; i++) {\n // Check if we have nested arrays\n if (this[i] instanceof Array && array[i] instanceof Array) {\n // recurse into the nested arrays\n if (!this[i].equals(array[i]))\n return false;\n }\n else if (this[i] != array[i]) {\n // Warning - two different object instances will never be equal: {x:20} != {x:20}\n return false;\n }\n }\n return true;\n };\n\n /* Register global mouse and key events */\n if (self.options.editable || self.options.animation) {\n var shiftKeydown = false;\n var ctrlKeydown = false;\n\n let keydown = () => {\n switch (d3.event.keyCode) {\n case 68: //'d' key\n console.log('dotbracket:', self.getStructuresDotBracket());\n break;\n case 16:\n shiftKeydown = true;\n break;\n case 17:\n ctrlKeydown = true;\n break;\n case 67: //c\n self.centerView();\n break;\n }\n\n if (ctrlKeydown) {\n // Ctrl key must disable panning and zooming\n if (self.options.zoomable)\n disableZooming()\n // Ctrl Button must enable crosshair and start brusher\n if (self.options.editable || self.options.animation) {\n enableBrushing()\n }\n }\n }\n\n let keyup = () => {\n shiftKeydown = false;\n ctrlKeydown = false;\n\n // enable zoomer\n if (self.options.zoomable)\n enableZooming()\n // disable brushing events\n disableBrushing()\n }\n\n d3.select('body')\n .on('keydown', keydown)\n .on('keyup', keyup)\n .on('contextmenu', function() {\n d3.event.preventDefault();\n });\n }\n\n /* Register global context menu */\n if (self.options.editable) {\n let backgroundMenu = [\n {\n title: 'Add Node',\n action: function(elm, d, i, mousePos) {\n\n },\n children: [{\n 'title': 'A',\n action: function(elm, d, i, mousePos) {\n console.log('mousePos:', mousePos, self.options.svgW, self.options.svgH);\n let canvasMousePos = [xScale.invert(mousePos[0]),\n yScale.invert(mousePos[1])];\n console.log('canvasMousePos', canvasMousePos);\n\n self.addRNA('.', {'sequence': 'A', 'centerPos': canvasMousePos});\n }\n },\n {\n 'title': 'C',\n action: function(elm, d, i, mousePos) {\n console.log('mousePos:', mousePos, self.options.svgW, self.options.svgH);\n let canvasMousePos = [xScale.invert(mousePos[0]),\n yScale.invert(mousePos[1])];\n console.log('canvasMousePos', canvasMousePos);\n\n self.addRNA('.', {'sequence': 'C', 'centerPos': canvasMousePos});\n }\n\n },\n {\n 'title': 'G',\n action: function(elm, d, i, mousePos) {\n console.log('mousePos:', mousePos, self.options.svgW, self.options.svgH);\n let canvasMousePos = [xScale.invert(mousePos[0]),\n yScale.invert(mousePos[1])];\n console.log('canvasMousePos', canvasMousePos);\n\n self.addRNA('.', {'sequence': 'G', 'centerPos': canvasMousePos});\n }\n\n },\n {\n 'title': 'U',\n action: function(elm, d, i, mousePos) {\n console.log('mousePos:', mousePos, self.options.svgW, self.options.svgH);\n let canvasMousePos = [xScale.invert(mousePos[0]),\n yScale.invert(mousePos[1])];\n console.log('canvasMousePos', canvasMousePos);\n\n self.addRNA('.', {'sequence': 'U', 'centerPos': canvasMousePos});\n\n }\n }\n ],\n disabled: false // optional, defaults to false\n }\n ]\n\n let nodeMenu = [\n {\n title: 'Delete Node',\n action: function(elm, d, i) {\n deleteNode(d);\n },\n disabled: false // optional, defaults to false\n },\n {\n title: 'Change Node',\n action: function(elm, d, i) {\n console.log('You have clicked the second item!');\n console.log('The data for this circle is: ' + d);\n },\n children: [\n {\n title: 'A',\n action: function(elm, d, i) {\n changeNode('A', d);\n }\n },\n {\n title: 'C',\n action: function(elm, d, i) {\n changeNode('C', d);\n\n }\n },\n {\n title: 'G',\n action: function(elm, d, i) {\n changeNode('G', d);\n\n }\n },\n {\n title: 'U',\n action: function(elm, d, i) {\n changeNode('U', d);\n }\n },\n ]\n },\n {\n title: 'Insert Before',\n action: function(elm, d, i) {\n\n },\n children: [\n {\n title: 'A',\n action: function(elm, d, i) {\n insertNodeBeforeOrAfter('A', d, -1);\n }\n },\n {\n title: 'C',\n action: function(elm, d, i) {\n insertNodeBeforeOrAfter('C', d, -1);\n\n }\n },\n {\n title: 'G',\n action: function(elm, d, i) {\n insertNodeBeforeOrAfter('G', d, -1);\n\n }\n },\n {\n title: 'U',\n action: function(elm, d, i) {\n insertNodeBeforeOrAfter('U', d, -1);\n }\n },\n ]\n },\n {\n title: 'Insert After',\n action: function(elm, d, i) {\n console.log('d:', d);\n\n },\n children: [\n {\n title: 'A',\n action: function(elm, d, i) {\n insertNodeBeforeOrAfter('A', d, 0);\n\n }\n },\n {\n title: 'C',\n action: function(elm, d, i) {\n insertNodeBeforeOrAfter('C', d, 0);\n }\n },\n {\n title: 'G',\n action: function(elm, d, i) {\n insertNodeBeforeOrAfter('G', d, 0);\n }\n },\n {\n title: 'U',\n action: function(elm, d, i) {\n insertNodeBeforeOrAfter('U', d, 0);\n }\n },\n ]\n }\n ]\n\n self.nodeContextMenu = contextMenu(nodeMenu);\n self.backgroundContextMenu = contextMenu(backgroundMenu);\n\n } else {\n //console.log('empty context menu');\n self.nodeContextMenu = function() {};\n }\n\n /* Draw the plot here */\n d3.select(element).select('svg').remove();\n\n var svg = d3.select(element)\n .attr('tabindex', 1)\n .each(function() { this.focus(); })\n .append('svg:svg')\n .attr('preserveAspectRatio', 'xMidYMid meet')\n .attr('viewBox', '0 0 ' + self.options.svgW + ' ' + self.options.svgH)\n\n self.options.svg = svg;\n\n if (self.options.editable || self.options.animation) {\n var mouseEventHelper = svg.append('svg:g')\n .on('mousemove', () => {\n // only if we are dragging\n if (!mousedownNode) return;\n\n // update drag line\n let mpos = d3.mouse(vis.node());\n dragLine\n .attr('x1', mousedownNode.x)\n .attr('y1', mousedownNode.y)\n .attr('x2', mpos[0])\n .attr('y2', mpos[1]);\n })\n .on('mousedown', () => {\n })\n .on('mouseup', () => {\n if (mousedownNode && !linkContextMenuShown) {\n dragLine.classed(fstyle.transparent, true);\n }\n // clear mouse event vars\n resetMouseVars();\n //update()\n })\n .classed(fstyle.mouseEventHelper, true)\n .style('pointer-events', 'all')\n\n // draw a background layer for mouse events\n mouseEventHelper.append('svg:rect')\n .classed('background', true)\n .style('visibility', 'hidden')\n .attr('width', self.options.svgW)\n .attr('height', self.options.svgH)\n .on('mousedown', function() {\n //console.log('background click');\n deselectAllNodes()\n })\n } else {\n var mouseEventHelper = svg;\n }\n\n var vis = mouseEventHelper.append('svg:g')\n .classed(fstyle.plot, true)\n var visLinks = vis.append('svg:g')\n .classed('fornac-links', true);\n var visNodes = vis.append('svg:g')\n .classed('fornac-nodes', true);\n\n // line displayed when dragging new nodes\n if (self.options.editable) {\n var dragLine = vis.append('line')\n .attr('class', fstyle.dragLine)\n .attr('x1', 0)\n .attr('y1', 0)\n .attr('x2', 0)\n .attr('y2', 0);\n\n svg.on('contextmenu', self.backgroundContextMenu);\n }\n\n /* Zooming related objects and functions */\n var xScale = d3.scale.linear()\n .domain([0,self.options.svgW]).range([0,self.options.svgW]);\n var yScale = d3.scale.linear()\n .domain([0,self.options.svgH]).range([0, self.options.svgH]);\n\n self.zoomer = d3.behavior.zoom()\n .scaleExtent([0.1,10])\n .x(xScale)\n .y(yScale)\n .on('zoom', () => {\n vis.attr('transform',\n 'translate(' + d3.event.translate + ')' + ' scale(' + d3.event.scale + ')');\n });\n\n let enableZooming = () => {\n svg.call(self.zoomer)\n .on(\"dblclick.zoom\", null);\n }\n\n let disableZooming = () => {\n svg.call(self.zoomer)\n .on(\"dblclick.zoom\", null)\n .on('mousedown.zoom', null)\n .on('touchstart.zoom', null)\n .on('touchmove.zoom', null)\n .on('touchend.zoom', null);\n }\n\n if (self.options.zoomable)\n enableZooming()\n\n /* Node selection related objects and functions */\n let toggleSelectNode = (node) => {\n node.selected = !node.selected;\n visNodes.selectAll('g.gnode').filter((d) => { return node.uid == d.uid; })\n .classed(fstyle.selectedNode, function(p) { return p.selected; });\n }\n\n let selectNode = (node) => {\n node.selected = true;\n visNodes.selectAll('g.gnode').filter((d) => { return node.uid == d.uid; })\n .classed(fstyle.selectedNode, function(p) { return p.selected; });\n }\n\n let deselectAllNodes = () => {\n visNodes.selectAll('g.gnode')\n .classed(fstyle.selectedNode, function(p) { return p.selected = false; });\n }\n\n let selectedNodes = () => {\n // return all selected nodes\n return visNodes.selectAll('g.gnode').filter(function(d) { return d.selected; });\n }\n\n self.brusher = d3.svg.brush()\n .x(xScale)\n .y(yScale)\n .on('brushstart', function(d) {})\n .on('brush', function() {\n // during brushing invert styling of selection as preview\n let extent = d3.event.target.extent();\n\n visNodes.selectAll('g.gnode')\n .classed(fstyle.selectedNode, function (d) {\n return d.selected ^ (extent[0][0] <= d.x && d.x < extent[1][0]\n && extent[0][1] <= d.y && d.y < extent[1][1])\n })\n })\n .on('brushend', function() {\n // after brushing finally toggle the selection\n let extent = d3.event.target.extent();\n\n visNodes.selectAll('g.gnode')\n .filter(function (d) {\n return extent[0][0] <= d.x && d.x < extent[1][0]\n && extent[0][1] <= d.y && d.y < extent[1][1]\n })\n .each(toggleSelectNode)\n\n d3.event.target.clear();\n d3.select(this).call(d3.event.target);\n });\n\n let enableBrushing = () => {\n // crosshair curson\n mouseEventHelper.select('.background').style('cursor', 'crosshair');\n // bind brusher\n mouseEventHelper.call(self.brusher);\n }\n\n let disableBrushing = () => {\n // normal cursor\n mouseEventHelper.select('.background').style('cursor', 'auto');\n // disable brushing events\n mouseEventHelper.call(self.brusher)\n .on('mousedown.brush', null)\n .on('touchstart.brush', null)\n .on('touchmove.brush', null)\n .on('touchend.brush', null);\n }\n\n /* Force related objects and functions */\n self.force = d3.layout.force()\n .charge(function(d) {\n if (d.nodeType == 'middle')\n return self.options.middleCharge;\n else\n return self.options.otherCharge;\n })\n .friction(self.options.friction)\n .linkDistance(function(d) { return self.options.linkDistanceMultiplier * d.value; })\n .linkStrength(function(d) { if (d.linkType in self.linkStrengths) {\n return self.linkStrengths[d.linkType];\n } else {\n return self.linkStrengths.other; }\n })\n .gravity(0.000)\n .nodes(self.graph.nodes)\n .links(self.graph.links)\n .chargeDistance(self.options.chargeDistance)\n .size([self.options.svgW, self.options.svgH]);\n\n var drag = d3.behavior.drag()\n .on('dragstart', function(d) {\n console.log('dragstart')\n d3.event.sourceEvent.stopPropagation();\n\n selectedNodes().each(function(d1) {\n d1.fixed |= 2;\n });\n })\n .on('drag', (d) => {\n if (shiftKeydown) return\n selectedNodes().each(function(d1) {\n d1.x += d3.event.dx;\n d1.y += d3.event.dy;\n\n d1.px += d3.event.dx;\n d1.py += d3.event.dy;\n });\n\n self.resumeForce();\n d3.event.sourceEvent.preventDefault();\n })\n .on('dragend', (d) => {\n console.log('dragend')\n selectedNodes().each(function(d1) {\n d1.fixed &= ~6;\n });\n });\n\n /* Main plot drawing functions */\n let createInitialLayout = function(structure, passedOptions = {}) {\n // the default options\n let options = {\n 'sequence': '',\n 'name': 'empty',\n 'positions': [],\n 'labelInterval': self.options.labelInterval,\n 'avoidOthers': true,\n 'uids': [],\n 'circularizeExternal': true\n };\n\n options = Object.assign(options, passedOptions);\n\n //console.log('options.uids:', options.uids);\n let rg = new RNAGraph(options.sequence, structure, options.name);\n rg.circularizeExternal = options.circularizeExternal;\n\n let rnaJson = rg.recalculateElements();\n\n if (options.positions.length === 0) {\n // no provided positions means we need to calculate an initial layout\n\n if (self.options.layout == 'naview') {\n let naview = new NAView();\n\n let naViewPositions = naview.naview_xy_coordinates(rg.pairtable);\n options.positions = []\n for (let i = 0; i < naViewPositions.nbase; i++)\n options.positions.push([naViewPositions.x[i], naViewPositions.y[i]]);\n } else {\n options.positions = simpleXyCoordinates(rnaJson.pairtable);\n }\n }\n\n rnaJson = rnaJson.elementsToJson()\n .addUids(options.uids)\n .addPositions('nucleotide', options.positions)\n .addLabels(1, options.labelInterval)\n .reinforceStems()\n .reinforceLoops()\n .connectFakeNodes()\n .reassignLinkUids()\n .breakNodesToFakeNodes();\n\n return rnaJson;\n };\n\n let createNewNodes = function(gnodesEnter) {\n gnodesEnter = gnodesEnter.append('g')\n .classed('gnode', true)\n .attr('struct_name', function(d) { return d.structName; })\n .attr('transform', function(d) {\n if (typeof d.x != 'undefined' && typeof d.y != 'undefined')\n return 'translate(' + [d.x, d.y] + ')';\n else\n return '';\n })\n .each( function(d) { d.selected = d.previouslySelected = false; });\n\n gnodesEnter\n .attr('num', function(d) { return 'n' + d.num; })\n .attr('rnum', function(d) {\n return 'n' + (d.rna.rnaLength - d.num + 1); })\n .transition()\n .duration(750)\n .ease('elastic');\n\n if (self.options.editable || self.options.animation) {\n gnodesEnter.on('mousedown', nodeMousedown)\n //.on('mousedrag', function(d) {})\n .on('mouseup', nodeMouseup)\n .on('contextmenu', self.nodeContextMenu)\n .call(drag)\n }\n\n let labelAndProteinNodes = gnodesEnter.filter(function(d) {\n return d.nodeType == 'label' || d.nodeType == 'protein';\n });\n\n let nucleotideNodes = gnodesEnter.filter(function(d) {\n return d.nodeType == 'nucleotide';\n });\n\n labelAndProteinNodes.append('svg:circle')\n .classed(fstyle.node, true)\n .attr('r', function(d) {\n if (d.nodeType == 'middle') return 0;\n else {\n return d.radius;\n }\n })\n .attr('node_type', function(d) { return d.nodeType; })\n .attr('node_num', function(d) { return d.num; });\n\n // direction arrows\n nucleotideNodes.append('svg:path')\n .attr('class', fstyle.directionArrow)\n .attr('node_num', function(d) { return d.num; })\n\n // nucleotide outlines\n nucleotideNodes.append('svg:circle')\n .attr('class', fstyle.node)\n .attr('node_type', function(d) { return d.nodeType; })\n .attr('node_num', function(d) { return d.num; })\n .attr('r', function(d) { return d.radius; })\n .append('svg:title')\n .text(function(d) {\n if (d.nodeType == 'nucleotide') {\n return d.structName + ':' + d.num;\n } else {\n return '';\n }\n });\n\n // nucleotide labels\n var labelsEnter = gnodesEnter.append('text')\n .text(function(d) { return d.name; })\n .attr('class', fstyle.nodeLabel)\n .attr('label_type', function(d) { return d.nodeType; })\n\n // nucleotide label title\n labelsEnter.append('svg:title')\n .text(function(d) {\n if (d.nodeType == 'nucleotide') {\n return d.structName + ':' + d.num;\n } else {\n return '';\n }\n });\n\n return gnodesEnter;\n };\n\n let createNewLinks = function(linksEnter) {\n var linkLines = linksEnter.append('svg:line');\n\n linkLines.append('svg:title')\n .text((d) => { return d.linkType + ':' + d.source.num + '-' + d.target.num });\n\n linkLines\n .classed('link', true)\n .classed(fstyle.link, true)\n .attr('x1', function(d) { return d.source.x; })\n .attr('y1', function(d) { return d.source.y; })\n .attr('x2', function(d) { return d.target.x; })\n .attr('y2', function(d) { return d.target.y; })\n .attr('link_type', function(d) { return d.linkType; } )\n .attr('pointer-events', function(d) { if (d.linkType == 'fake') return 'none'; else return 'all';});\n\n if (self.options.editable)\n linkLines.on('click', linkClick);\n\n /* We don't need to update the positions of the stabilizing links */\n /*\n basepairLinks = visLinks.selectAll('[link_type=basepair]');\n basepairLinks.classed('basepair', true);\n\n fakeLinks = visLinks.selectAll('[link_type=fake]')\n fakeLinks.classed('fake', true);\n\n intermolecule_links = vis_links.selectAll('[link_type=intermolecule]');\n intermolecule_links.classed('intermolecule', true);\n\n plink = vis_links.selectAll('[link_type=protein_chain],[link_type=chain_chain]');\n plink.classed('chain_chain', true);\n */\n\n return linkLines;\n };\n\n function drawDirectionArrow(d) {\n let magnitude = (x) => {\n return Math.sqrt(x[0] * x[0] + x[1] * x[1]);\n }\n\n let endPoint = d;\n let startPoint = d.prevNode;\n // get stroke width and arrow size values from css\n let nodeStroke = parseFloat(fstyle.nodeStrokeWidth) / 2;\n let lengthMult = parseFloat(fstyle.directionArrowSize);\n let arrowWidth = parseFloat(fstyle.directionArrowWidth);\n\n if (startPoint === null)\n return;\n\n // does this node have a link pointing to it?\n if (!d.linked)\n return;\n\n // point back toward the previous node\n let u = [-(endPoint.x - startPoint.x), -(endPoint.y - startPoint.y)];\n\n if (u[0] == 0 && u[1] == 0)\n return; // will lead to a NaN error\n\n // scale u to unit length\n u = [u[0] / magnitude(u), u[1] / magnitude(u)];\n // normal vector of u\n let v = [-u[1], u[0]];\n\n // calculate the tip position\n let arrowTip = [(d.radius + nodeStroke) * u[0], (d.radius + nodeStroke) * u[1]];\n\n let path = 'M' + (arrowTip[0] + lengthMult * (u[0]/2 + v[0]*arrowWidth/2)) + ',' + (arrowTip[1] + lengthMult * (u[1]/2 + v[1]*arrowWidth/2)) +\n 'L' + (arrowTip[0]) + ',' + (arrowTip[1]) +\n 'L' + (arrowTip[0] + lengthMult * (u[0]/2 - v[0]*arrowWidth/2)) + ',' + (arrowTip[1] + lengthMult * (u[1]/2 - v[1]*arrowWidth/2));\n\n d3.select(this).attr('d', path);\n }\n\n let realLinkFilter = (d) => {\n return d.linkType == 'basepair' ||\n d.linkType == 'backbone' ||\n d.linkType == 'intermolecule' ||\n d.linkType == 'pseudoknot' ||\n d.linkType == 'label_link' ||\n d.linkType == 'external' ||\n d.linkType == 'chain_chain';\n }\n\n let recalculateGraph = () => {\n // Condense all of the individual RNAs into one\n // collection of nodes and links\n self.graph.nodes = [];\n self.graph.links = [];\n for (let uid in self.rnas) {\n self.graph.nodes = self.graph.nodes.concat(self.rnas[uid].nodes);\n self.graph.links = self.graph.links.concat(self.rnas[uid].links);\n }\n\n // Create a lookup table so that we can access each node\n // based on its uid. This will be used to create the links\n // between different RNAs\n var uidsToNodes = {};\n\n for (let i = 0; i < self.graph.nodes.length; i++)\n uidsToNodes[self.graph.nodes[i].uid] = self.graph.nodes[i];\n\n self.graph.links.forEach(function(link) {\n link.source = uidsToNodes[link.source.uid];\n link.target = uidsToNodes[link.target.uid];\n });\n\n for (let i = 0; i < self.extraLinks.length; i++) {\n // the actual node objects may have changed, so we hae to recreate\n // the extra links based on the uids\n if (!(self.extraLinks[i].target.uid in uidsToNodes)) {\n console.log('not there:', self.extraLinks[i]);\n continue;\n }\n\n self.extraLinks[i].source = uidsToNodes[self.extraLinks[i].source.uid];\n self.extraLinks[i].target = uidsToNodes[self.extraLinks[i].target.uid];\n\n if (self.extraLinks[i].linkType == 'intermolecule') {\n //remove links to middle nodes\n let fakeLinks = self.graph.links.filter(function(d) {\n return ((d.source == self.extraLinks[i].source || d.source == self.extraLinks[i].target ||\n d.target == self.extraLinks[i].source || d.target == self.extraLinks[i].source) &&\n d.linkType == 'fake');\n });\n\n for (let j = 0; j < fakeLinks.length; j++) {\n let linkIndex = self.graph.links.indexOf(fakeLinks[j]);\n self.graph.links.splice(linkIndex, 1);\n }\n }\n\n graph.links.push(self.extraLinks[i]);\n }\n };\n\n self.update = function () {\n self.force.nodes(self.graph.nodes)\n .links(self.graph.links);\n\n if (self.options.animation) {\n self.force.start();\n }\n\n let allLinks = visLinks.selectAll('line.link')\n .data(self.graph.links.filter(realLinkFilter), elementKey);\n\n allLinks.attr('class', '')\n .classed('link', true)\n .classed(fstyle.link, true)\n .attr('link_type', function(d) { return d.linkType; } )\n\n let linksEnter = allLinks.enter();\n createNewLinks(linksEnter);\n\n allLinks.exit().remove();\n\n let gnodes = visNodes.selectAll('g.gnode')\n .data(self.graph.nodes, elementKey);\n //.attr('pointer-events', 'all');\n\n let gnodesEnter = gnodes.enter();\n createNewNodes(gnodesEnter);\n gnodes.exit().remove();\n\n\n //fake_nodes = self.graph.nodes.filter(function(d) { return d.nodeType == 'middle'; });\n //fakeNodes = self.graph.nodes.filter(function(d) { return true; });\n let realNodes = self.graph.nodes.filter(function(d) { return d.nodeType == 'nucleotide' || d.nodeType == 'label';});\n\n gnodes.select('.' + fstyle.directionArrow).each(drawDirectionArrow);\n\n self.force.on('tick', function() {\n let q = d3.geom.quadtree(realNodes);\n let i = 0;\n let n = realNodes.length;\n\n let collide = (node) => {\n let r = node.radius + 16,\n nx1 = node.x - r,\n nx2 = node.x + r,\n ny1 = node.y - r,\n ny2 = node.y + r;\n return function(quad, x1, y1, x2, y2) {\n if (quad.point && (quad.point !== node)) {\n let x = node.x - quad.point.x,\n y = node.y - quad.point.y,\n l = Math.sqrt(x * x + y * y),\n r = node.radius + quad.point.radius;\n if (l < r) {\n l = (l - r) / l * 0.1;\n node.x -= x *= l;\n node.y -= y *= l;\n quad.point.x += x;\n quad.point.y += y;\n }\n }\n return x1 > nx2 || x2 < nx1 || y1 > ny2 || y2 < ny1;\n };\n }\n\n while (++i < n) q.visit(collide(realNodes[i]));\n\n allLinks.attr('x1', function(d) { return d.source.x; })\n .attr('y1', function(d) { return d.source.y; })\n .attr('x2', function(d) { return d.target.x; })\n .attr('y2', function(d) { return d.target.y; });\n\n // Translate the groups\n gnodes.attr('transform', function(d) {\n return 'translate(' + [d.x, d.y] + ')';\n });\n\n gnodes.select('.' + fstyle.directionArrow).each(drawDirectionArrow);\n\n });\n\n self.force.on('end', () => {\n gnodes.selectAll('[node_type=nucleotide]')\n .filter((d,i) => { if (i == 0) return true; else return false; })\n .each((d,i) => {\n //console.log(\"pos\", d.num, d.x, d.y);\n });\n\n //for (let uid in self.rnas) {\n // for (let i = 1; i < self.rnas[uid].pairtable[0]; i++) {\n // console.log('pt', i, self.rnas[uid].pairtable[i]);\n // }\n //}\n\n });\n\n self.changeColorScheme(self.colorScheme);\n\n if (self.options.animation) {\n self.force.start();\n }\n\n updateStyle();\n };\n\n self.transitionRNA = function(newStructure, nextFunction) {\n if (self.dotbracket == newStructure) {\n return;\n } else {\n self.dotbracket = newStructure;\n }\n //transition from an RNA which is already displayed to a new structure\n var duration = self.options.transitionDuration;\n\n var uids = self.graph.nodes\n .filter(function(d) { return d.nodeType == 'nucleotide'; })\n .map(function(d) { return d.uid; });\n\n let options = {'uids': uids};\n var newRNAJson = createInitialLayout(newStructure, options);\n\n let gnodes = visNodes.selectAll('g.gnode').data(newRNAJson.nodes, elementKey);\n var links = visLinks.selectAll('line.link').data(newRNAJson.links.filter(realLinkFilter), elementKey);\n\n if (duration === 0)\n gnodes.attr('transform', function(d) {\n return 'translate(' + [d.x, d.y] + ')';\n });\n else {\n gnodes.transition()\n .attr('transform', function(d) {\n return 'translate(' + [d.x, d.y] + ')'; }).duration(duration);\n }\n\n\n var newNodes = createNewNodes(gnodes.enter())\n .attr('transform', function(d) {\n if (typeof d.x != 'undefined' && typeof d.y != 'undefined')\n return 'translate(' + [0, 0] + ')';\n else\n return '';\n });\n\n if (duration === 0)\n gnodes.exit().remove();\n else\n gnodes.exit().transition()\n .attr('transform', function(d) {\n if (typeof d.x != 'undefined' && typeof d.y != 'undefined')\n return 'translate(' + [0, 0] + ')';\n else\n return '';\n });\n\n self.graph.nodes = gnodes.data();\n gnodes.select('.' + fstyle.directionArrow).each(drawDirectionArrow);\n self.changeColorScheme(self.colorScheme);\n updateStyle();\n self.centerView(duration);\n\n function endall(transition, callback) {\n if (transition.size() === 0) { setTimeout(callback, duration); }\n var n = 0;\n transition\n .each(function() { ++n; })\n .each('end', function() { if (!--n) callback.apply(this, arguments); });\n }\n\n function afterAnimation() {\n var newLinks = createNewLinks(links.enter());\n self.graph.links = links.data();\n self.changeColorScheme(self.colorScheme);\n updateStyle();\n\n if (typeof nextFunction != 'undefined')\n nextFunction();\n\n }\n\n links.exit().remove();\n\n if (duration === 0) {\n links\n .attr('x1', function(d) { return d.source.x; })\n .attr('y1', function(d) { return d.source.y; })\n .attr('x2', function(d) { return d.target.x; })\n .attr('y2', function(d) { return d.target.y; });\n\n var newLinks = createNewLinks(links.enter());\n self.graph.links = links.data();\n\n updateStyle();\n } else {\n links.transition()\n .attr('x1', function(d) { return d.source.x; })\n .attr('y1', function(d) { return d.source.y; })\n .attr('x2', function(d) { return d.target.x; })\n .attr('y2', function(d) { return d.target.y; })\n .duration(duration)\n .call(endall, afterAnimation);\n }\n\n if (duration === 0) {\n newNodes\n .attr('transform', function(d) {\n if (typeof d.x != 'undefined' && typeof d.y != 'undefined')\n return 'translate(' + [d.x, d.y] + ')';\n else\n return '';\n });\n } else {\n newNodes.transition()\n .attr('transform', function(d) {\n if (typeof d.x != 'undefined' && typeof d.y != 'undefined')\n return 'translate(' + [d.x, d.y] + ')';\n else\n return '';\n });\n }\n\n };\n\n /* Plot presentation related functions */\n let getBoundingBoxTransform = () => {\n // Center the view on the molecule(s) and scale it so that everything\n // fits in the window\n\n //no molecules, nothing to do\n if (self.graph.nodes.length === 0)\n return {'translate': [0,0], 'scale': 1};\n\n // Get the bounding box\n var minX = d3.min(self.graph.nodes.map(function(d) {return d.x;}));\n var minY = d3.min(self.graph.nodes.map(function(d) {return d.y;}));\n\n var maxX = d3.max(self.graph.nodes.map(function(d) {return d.x;}));\n var maxY = d3.max(self.graph.nodes.map(function(d) {return d.y;}));\n\n var maxRadius = d3.max(self.graph.nodes.map(function(d) { return d.radius; }));\n\n // The width and the height of the molecule\n var molWidth = maxX - minX;\n var molHeight = maxY - minY;\n\n // how much larger the drawing area is than the width and the height\n var widthRatio = self.options.svgW / (molWidth + 1);\n var heightRatio = self.options.svgH / (molHeight + 1);\n\n // we need to fit it in both directions, so we scale according to\n // the direction in which we need to shrink the most\n var minRatio = Math.min(widthRatio, heightRatio,\n self.options.maxNodeRadius / maxRadius) * 0.8;\n\n // the new dimensions of the molecule\n var newMolWidth = molWidth * minRatio;\n var newMolHeight = molHeight * minRatio;\n\n // translate so that it's in the center of the window\n var xTrans = -(minX) * minRatio + (self.options.svgW - newMolWidth) / 2;\n var yTrans = -(minY) * minRatio + (self.options.svgH - newMolHeight) / 2;\n\n return {'translate': [xTrans, yTrans], 'scale': minRatio};\n };\n\n self.centerView = function(duration = 0) {\n var bbTransform = getBoundingBoxTransform();\n\n if (bbTransform === null)\n return;\n\n // do the actual moving\n vis.transition().attr('transform',\n 'translate(' + bbTransform.translate + ')' + ' scale(' + bbTransform.scale + ')').duration(duration);\n\n // tell the zoomer what we did so that next we zoom, it uses the\n // transformation we entered here\n self.zoomer.translate(bbTransform.translate);\n self.zoomer.scale(bbTransform.scale);\n };\n\n self.setSize = (\n svgW = d3.select(element).node().offsetWidth,\n svgH = d3.select(element).node().offsetHeight\n ) => {\n // save width and height\n self.options.svgW = svgW;\n self.options.svgH = svgH;\n\n // set the viewBox\n svg.attr('viewBox', \"0 0 \" + svgW + \" \" + svgH)\n\n //Set the output range of the scales\n xScale.range([0, svgW]).domain([0, svgW]);\n yScale.range([0, svgH]).domain([0, svgH]);\n\n //re-attach the scales to the zoom behaviour\n self.zoomer.x(xScale)\n .y(yScale);\n self.brusher.x(xScale)\n .y(yScale);\n\n //resize the background\n svg.select('.background')\n .attr('width', svgW)\n .attr('height', svgH);\n\n // center the view\n self.centerView();\n }\n\n /* Style and color related functions */\n self.setOutlineColor = function(color) {\n var nodes = visNodes.selectAll('g.gnode').select('[node_type=nucleotide]');\n nodes.style('fill', color);\n }\n\n self.addCustomColors = function addCustomColors(json) {\n // Add a json file containing the custom colors\n self.customColors = json;\n self.changeColorScheme('custom');\n };\n\n self.addCustomColorsText = function(customColorsText) {\n let cs = new ColorScheme(customColorsText);\n self.customColors = cs.colorsJson;\n self.changeColorScheme('custom');\n };\n\n self.changeColorScheme = function(newColorScheme) {\n var proteinNodes = visNodes.selectAll('[node_type=protein]');\n\n proteinNodes.classed(fstyle.node, true)\n .attr('r', function(d) { return d.radius; });\n\n var gnodes = visNodes.selectAll('g.gnode');\n var circles = visNodes.selectAll('g.gnode').selectAll('circle');\n var nodes = visNodes.selectAll('g.gnode').select('[node_type=nucleotide]');\n self.colorScheme = newColorScheme;\n\n\n if (newColorScheme == 'sequence') {\n var scale = d3.scale.ordinal()\n .range(['#dbdb8d', '#98df8a', '#ff9896', '#aec7e8', '#aec7e8'])\n .domain(['A','C','G','U','T']);\n nodes.style('fill', function(d) {\n return scale(d.name);\n });\n\n } else if (newColorScheme == 'structure') {\n var scale = d3.scale.category10()\n .domain(['s','m','i','e','t','h','x'])\n .range(['lightgreen', '#ff9896', '#dbdb8d', 'lightsalmon',\n 'lightcyan', 'lightblue', 'transparent']);\n\n nodes.style('fill', function(d) {\n return scale(d.elemType);\n });\n\n } else if (newColorScheme == 'positions') {\n nodes.style('fill', function(d) {\n var scale = d3.scale.linear()\n .range(['#98df8a', '#dbdb8d', '#ff9896'])\n .interpolate(d3.interpolateLab)\n .domain([1, 1 + (d.rna.rnaLength - 1) / 2, d.rna.rnaLength]);\n\n return scale(d.num);\n });\n } else if (newColorScheme == 'custom') {\n // scale to be used in case the user passes scalar\n // values rather than color names\n if (typeof self.customColors != 'undefined' &&\n 'domain' in self.customColors &&\n 'range' in self.customColors) {\n var scale = d3.scale.linear()\n .interpolate(d3.interpolateLab)\n .domain(self.customColors.domain)\n .range(self.customColors.range);\n }\n\n let changeColors = (moleculeColors, d, scale) => {\n if (moleculeColors.hasOwnProperty(d.num)) {\n let val = parseFloat(moleculeColors[d.num]);\n\n if (isNaN(val)) {\n // passed in color is not a scalar, so\n // treat it as a color\n return moleculeColors[d.num];\n } else {\n // the user passed in a float, let's use a colormap\n // to convert it to a color\n return scale(val);\n }\n } else {\n return 'white';\n }\n }\n\n nodes.style('fill', function(d) {\n if (typeof self.customColors == 'undefined' ||\n !self.customColors.hasOwnProperty('colorValues')) {\n return 'white';\n }\n\n if (self.customColors.colorValues.hasOwnProperty(d.structName) &&\n self.customColors.colorValues[d.structName].hasOwnProperty(d.num)) {\n // if a molecule name is specified, it supercedes the default colors\n // (for which no molecule name has been specified)\n let moleculeColors = self.customColors.colorValues[d.structName];\n return changeColors(moleculeColors, d, scale);\n } else if (self.customColors.colorValues.hasOwnProperty('')) {\n let moleculeColors = self.customColors.colorValues[''];\n return changeColors(moleculeColors, d, scale);\n }\n\n return 'white';\n });\n }\n };\n\n let updateStyle = () => {\n // Numbering\n visNodes.selectAll('[node_type=label]').classed(fstyle.transparent, !self.displayParameters.displayNumbering);\n visNodes.selectAll('[label_type=label]').classed(fstyle.transparent, !self.displayParameters.displayNumbering);\n visLinks.selectAll('[link_type=label_link]').classed(fstyle.transparent, !self.displayParameters.displayNumbering);\n // Node Outline\n svg.selectAll('[node_type=nucleotide]').classed(fstyle.transparent, !self.displayParameters.displayNodeOutline);\n // Node Labels\n visNodes.selectAll('[label_type=nucleotide]').classed(fstyle.transparent, !self.displayParameters.displayNodeLabel);\n // Links\n svg.selectAll('[link_type=real],[link_type=basepair],[link_type=backbone],[link_type=pseudoknot],[link_type=protein_chain],[link_type=chain_chain],[link_type=external]').classed(fstyle.transparent, !self.displayParameters.displayLinks);\n // Pseudoknot Links\n svg.selectAll('[link_type=pseudoknot]').classed(fstyle.transparent, !self.displayParameters.displayPseudoknotLinks);\n // Protein Links\n svg.selectAll('[link_type=protein_chain]').classed(fstyle.transparent, !self.displayParameters.displayProteinLinks);\n // Fake Links\n visLinks.selectAll('[link_type=fake]').classed(fstyle.transparent, !self.options.displayAllLinks);\n visLinks.selectAll('[link_type=fake_fake]').classed(fstyle.transparent, !self.options.displayAllLinks);\n // direction Arrows\n svg.selectAll('.' + fstyle.directionArrow).classed(fstyle.transparent, !self.displayParameters.displayDirectionArrows);\n };\n\n /* RNA edditing related functions */\n let changeNode = function(nodeName, referenceNode) {\n // change the label of a node\n let rna = referenceNode.rna;\n\n let dotbracket = rnaUtilities.pairtableToDotbracket(rna.pairtable);\n let positions = rna.getPositions('nucleotide');\n let sequence = rna.seq\n let uids = rna.getUids();\n\n let newNodeNum = referenceNode.num;\n\n let newDotbracket = dotbracket;\n let newSequence = sequence.slice(0,newNodeNum-1) + nodeName + sequence.slice(newNodeNum);\n\n console.log('newSequence:', newSequence);\n\n console.log('uids:', uids);\n uids.splice(newNodeNum-1, 1, slugid.nice());\n let newPositions = positions;\n\n delete self.rnas[rna.uid];\n let newRNA = self.addRNA(newDotbracket, {'sequence': newSequence,\n 'positions': newPositions,\n 'uids': uids,\n 'centerView': false});\n }\n\n let insertNodeBeforeOrAfter = function(nodeName, referenceNode, positionOffset) {\n //insert a new node before or after another one\n //positionOffset specifies who far from the original to insert the new node\n let rna = referenceNode.rna;\n\n let dotbracket = rnaUtilities.pairtableToDotbracket(rna.pairtable);\n let positions = rna.getPositions('nucleotide');\n let sequence = rna.seq\n let uids = rna.getUids();\n\n let newNodeNum = referenceNode.num + positionOffset;\n\n let newDotbracket = dotbracket.slice(0,newNodeNum) + '.' + dotbracket.slice(newNodeNum);\n let newSequence = sequence.slice(0,newNodeNum) + nodeName + sequence.slice(newNodeNum);\n\n console.log('newSequence:', newSequence);\n\n uids.splice(newNodeNum, 0, slugid.nice());\n positions.splice(newNodeNum, 0, positions[newNodeNum - positionOffset-1]);\n\n let newUids = uids;\n let newPositions = positions;\n\n console.log('positions:', positions);\n console.log('new node positions:', newPositions);\n\n delete self.rnas[rna.uid];\n let newRNA = self.addRNA(newDotbracket, {'sequence': newSequence,\n 'positions': newPositions,\n 'uids': newUids,\n 'centerView': false});\n }\n\n let deleteNode = function(node) {\n console.log('deleting...', node);\n // get the dotbracket string for this rna\n let rna = node.rna;\n let pair = rna.pairtable[node.num];\n\n // remove basepairs for this node\n if (pair != 0) {\n rna.pairtable[node.num] = 0;\n rna.pairtable[pair] = 0;\n }\n\n let dotbracket = rnaUtilities.pairtableToDotbracket(rna.pairtable);\n let positions = rna.getPositions('nucleotide');\n let sequence = rna.seq\n let uids = rna.getUids();\n\n let newDotbracket = dotbracket.slice(0, node.num-1) + dotbracket.slice(node.num)\n let newPositions = positions.slice(0, node.num-1)\n .concat(positions.slice(node.num));\n let newSequence = sequence.slice(0, node.num-1) + sequence.slice(node.num)\n let newUids = uids.slice(0, node.num-1)\n .concat(uids.slice(node.num));\n\n delete self.rnas[rna.uid];\n let newRNA = self.addRNA(newDotbracket, {'sequence': newSequence,\n 'positions': newPositions,\n 'uids': newUids,\n 'centerView': false});\n\n console.log('new dotbracket:', newDotbracket);\n //recalculateGraph();\n\n //remove backbone links associated with this node\n\n //remove this node\n\n }\n\n let elementKey = (d) => {\n return d.uid;\n };\n\n let updateRnaGraph = function(r) {\n let nucleotidePositions = r.getPositions('nucleotide');\n let labelPositions = r.getPositions('label');\n\n let uids = r.getUids();\n\n r.recalculateElements()\n .elementsToJson()\n .addPseudoknots()\n .addPositions('nucleotide', nucleotidePositions)\n .addUids(uids)\n .addLabels(1, self.options.labelInterval)\n .addPositions('label', labelPositions)\n .reinforceStems()\n .reinforceLoops()\n .updateLinkUids();\n };\n\n let removeBackBoneLink = function(d) {\n if (d.target.num - d.source.num != 1) {\n console.log('ERROR: non adjacent nodes. Target:', d.target,\n 'Source:', d.source, 'Link:', d);\n return;\n }\n\n let rna = d.target.rna;\n let toRemove = [];\n\n for (let i = 0; i < rna.links.length; i++) {\n let link = rna.links[i];\n\n if (link.linkType != 'basepair')\n continue;\n\n if (link.source.num <= d.source.num && link.target.num >= d.target.num) {\n console.log('crossing basepair', link);\n toRemove.push(link);\n }\n }\n\n\n // Remove all base pairs that are between these two nodes and add them as extra\n // links\n console.log('toRemove:', toRemove);\n\n for (let i = 0; i < toRemove.length; i++) {\n rna.pairtable[toRemove[i].source.num] = 0;\n rna.pairtable[toRemove[i].target.num] = 0;\n\n toRemove[i].from = toRemove[i].source.num;\n toRemove[i].to = toRemove[i].target.num - d.source.num;\n }\n\n // extract the dotbracket string of the rna\n // cut it at the position of this backbone bond\n let sequence = rna.seq;\n let sequence1 = rna.seq.slice(0, d.source.num);\n let sequence2 = rna.seq.slice(d.source.num);\n\n let rnaDotBracket = rnaUtilities.pairtableToDotbracket(rna.pairtable);\n let dotBracket1 = rnaDotBracket.slice(0, d.source.num);\n let dotBracket2 = rnaDotBracket.slice(d.source.num)\n\n // get the nucleotide positions\n // cut them at the positions of the backbone bond\n let positions = rna.getPositions('nucleotide')\n let uids = rna.getUids();\n\n let positions1 = positions.slice(0, d.source.num);\n let positions2 = positions.slice(d.source.num);\n\n let uids1 = uids.slice(0, d.source.num);\n let uids2 = uids.slice(d.source.num);\n\n console.log('positions1:', positions1);\n console.log('positions2:', positions2);\n\n delete self.rnas[rna.uid];\n let rna1 = self.addRNA(dotBracket1, { 'sequence': sequence1,\n 'positions': positions1,\n 'uids': uids1 });\n let rna2 = self.addRNA(dotBracket2, { 'sequence': sequence2,\n 'positions': positions2,\n 'uids': uids2 });\n for (let i = 0; i < toRemove.length; i++) {\n console.log('rna1:', rna1);\n console.log('rna2:', rna2);\n console.log('toRemove[i]', toRemove[i]);\n self.extraLinks.push(\n {'source': rna1.nodes[toRemove[i].from-1],\n 'target': rna2.nodes[toRemove[i].to-1],\n 'value': 1,\n 'uid': slugid.nice(),\n 'linkType': 'intermolecule'});\n recalculateGraph();\n self.update();\n\n }\n console.log('self.extraLinks:', self.extraLinks);\n //self.extraLinks.push({'source': rna1.nodes[\n\n // create two new rnas\n // add their positions\n // add them back to the plot\n }\n\n var removeLink = function(d) {\n // remove a link between two nodes\n let index = self.graph.links.indexOf(d);\n console.log('removing link:', index);\n\n if (index > -1) {\n //remove a link\n //graph.links.splice(index, 1);\n\n // there should be two cases\n // 1. The link is within a single molecule\n\n if (d.source.rna == d.target.rna) {\n if (d.linkType == 'backbone') {\n console.log('trying to remove a backbone link', d.source.num, d.target.num);\n removeBackBoneLink(d);\n return;\n } else {\n let r = d.source.rna;\n r.addPseudoknots();\n r.pairtable[d.source.num] = 0;\n r.pairtable[d.target.num] = 0;\n\n updateRnaGraph(r);\n }\n } else {\n // 2. The link is between two different molecules\n let extraLinkIndex = self.extraLinks.indexOf(d);\n\n self.extraLinks.splice(extraLinkIndex, 1);\n }\n recalculateGraph();\n }\n self.update();\n };\n\n let addBackBoneLink = function(newLink) {\n // opposite of deleting a link\n // get the two dotbracket strings\n let rna1 = newLink.target.rna;\n let rna2 = newLink.source.rna;\n if (newLink.target.num == 1) {\n rna1 = newLink.source.rna;\n rna2 = newLink.target.rna;\n }\n\n let dotbracket1 = rnaUtilities.pairtableToDotbracket(rna1.pairtable);\n let dotbracket2 = rnaUtilities.pairtableToDotbracket(rna2.pairtable);\n\n let seq1 = rna1.seq;\n let seq2 = rna2.seq;\n\n let positions1 = rna1.getPositions('nucleotide');\n let positions2 = rna2.getPositions('nucleotide');\n\n // concatenate them\n let newDotbracket = dotbracket1 + dotbracket2;\n let newSeq = seq1 + seq2;\n let newPositions = positions1.concat(positions2);\n\n let toAddInternal = [];\n let toAddExternal = [];\n let toDelete = {};\n\n for (let i = 0; i < self.extraLinks.length; i++) {\n console.log('self.extraLinks[i]', self.extraLinks[i]);\n console.log('rna1:', rna1);\n console.log('rna2:', rna2);\n if (self.extraLinks[i].source.rna == rna1) {\n if ( self.extraLinks[i].target.rna == rna2) {\n // both ends of the extra link are within what will become the new molecule\n // need to be added as base pairs afterwards\n //self.extraLinks[i].from = self.extraLinks[i].source.num;\n //self.extraLinks[i].to = dotbracket1.length + self.extraLinks[i].target.num;\n //toAddInternal.push(self.extraLinks[i]);\n } else {\n // only one end of the extra link is within what will become the newly\n // created molecule, needs to remain an extra link\n // source will always be the unchanged molecule, whereas target will be\n // the newly created one\n toAddExternal.push({\n 'source': self.extraLinks[i].target,\n 'target': self.extraLinks[i].source.num\n });\n\n toDelete[self.extraLinks[i].uid] = true;\n }\n } else if (self.extraLinks[i].source.rna == rna2) {\n if ( self.extraLinks[i].target.rna == rna1) {\n // add internal link\n // both ends of the extra link are within what will become the new molecule\n // need to be added as base pairs afterwards\n //self.extraLinks[i].from = self.extraLinks[i].target.num;\n //self.extraLinks[i].to = dotbracket1.length + self.extraLinks[i].source.num;\n\n //toAddInternal.push(self.extraLinks[i]);\n } else {\n toAddExternal.push({\n 'source': self.extraLinks[i].target,\n 'target': self.extraLinks[i].source.num + dotbracket1.length\n });\n toDelete[self.extraLinks[i].uid] = true;\n }\n }\n\n if (self.extraLinks[i].target.rna == rna1) {\n if (self.extraLinks[i].source.rna == rna2) {\n // covered in previous if statement\n } else {\n // only one end of the extra link is within what will become the newly\n // created molecule, needs to remain an extra link\n toAddExternal.push({\n 'source': self.extraLinks[i].source,\n 'target': self.extraLinks[i].target.num\n });\n\n toDelete[self.extraLinks[i].uid] = true;\n }\n } else if (self.extraLinks[i].target.rna == rna2) {\n if (self.extraLinks[i].source.rna == rna1) {\n toAddExternal.push({\n 'source': self.extraLinks[i].source,\n 'target': self.extraLinks[i].target.num + dotbracket1.length\n });\n\n toDelete[self.extraLinks[i].uid] = true;\n }\n }\n }\n\n\n self.extraLinks = self.extraLinks.filter((e) => { return !(e.uid in toDelete) });\n\n delete self.rnas[rna1.uid];\n delete self.rnas[rna2.uid];\n\n let newRna = null;\n // create a new RNA\n if (self.options.animation)\n newRna = self.addRNA(newDotbracket, { 'sequence': newSeq,\n 'positions': newPositions,\n 'centerView': false});\n else\n newRna = self.addRNA(newDotbracket, { 'sequence': newSeq,\n 'centerView': false });\n\n\n\n // add new external links\n for (let i = 0; i < toAddExternal.length; i++) {\n self.extraLinks.push({\n 'source': toAddExternal[i].source,\n 'target': newRna.nodes[toAddExternal[i].target-1],\n 'value': 1,\n 'uid': slugid.nice(),\n 'linkType': 'intermolecule'\n });\n }\n\n recalculateGraph();\n self.update();\n console.log('self.extraLinks:', self.extraLinks);\n };\n\n function nudge(dx, dy) {\n // TODO currently unused\n node.filter(function(d) { return d.selected; })\n .attr('cx', function(d) { return d.x += dx; })\n .attr('cy', function(d) { return d.y += dy; });\n\n link.filter(function(d) { return d.source.selected; })\n .attr('x1', function(d) { return d.source.x; })\n .attr('y1', function(d) { return d.source.y; });\n\n link.filter(function(d) { return d.target.selected; })\n .attr('x2', function(d) { return d.target.x; })\n .attr('y2', function(d) { return d.target.y; });\n\n d3.event.preventDefault();\n }\n\n let nodeMouseup = function(d,i) {\n console.log(\"nodeMouseup\")\n let backbonePossible = true, basepairPossible = true;\n\n if (mousedownNode) {\n mouseupNode = d;\n\n // if the node isn't a nucleotide, we can't create a link\n if (mouseupNode.nodeType == 'middle' || mousedownNode.nodeType == 'middle' || mouseupNode.nodeType == 'label' || mousedownNode.nodeType == 'label')\n return;\n\n if (mouseupNode == mousedownNode) { resetMouseVars(); return; }\n let newLink = {source: mousedownNode, target: mouseupNode, linkType: 'basepair', value: 1, uid: slugid.nice()};\n\n for (let i = 0; i < self.graph.links.length; i++) {\n if ((self.graph.links[i].source == mousedownNode) ||\n (self.graph.links[i].target == mousedownNode) ||\n (self.graph.links[i].source == mouseupNode) ||\n (self.graph.links[i].target == mouseupNode)) {\n // either one of the nodes is already in a link\n\n // if any of the nodes are already involved in a basepair or a pseudoknot\n // then we can't make a basepair link\n if (self.graph.links[i].linkType == 'basepair' ||\n self.graph.links[i].linkType == 'pseudoknot' ||\n self.graph.links[i].linkType == 'intermolecule') {\n // although should be able to make a backbone link\n console.log('no basepair possible');\n basepairPossible = false;\n }\n }\n\n if (((self.graph.links[i].source == mouseupNode) &&\n (self.graph.links[i].target == mousedownNode)) ||\n ((self.graph.links[i].source == mousedownNode) &&\n (self.graph.links[i].target == mouseupNode))) {\n\n // if we're trying to make a link between two nodes which already have\n // a backbone between them, then we can't make a link\n if (self.graph.links[i].linkType == 'backbone') {\n return;\n }\n }\n }\n\n\n if (newLink.source.rna != newLink.target.rna) {\n // could be either a backbone link or an intermolecule link\n\n if ((newLink.source.num == 1 &&\n newLink.target.num == newLink.target.rna.rnaLength) ||\n (newLink.target.num == 1 &&\n newLink.source.num == newLink.source.rna.rnaLength)) {\n //\n let linkMenu = [\n {\n title: 'Backbone Link',\n action: function(elm, d, i) {\n linkContextMenuShown = false;\n console.log('Item #1 clicked!');\n console.log('The data for this circle is: ' + d);\n dragLine.attr('class', fstyle.transparent);\n addBackBoneLink(newLink);\n },\n disabled: false // optional, defaults to false\n },\n {\n title: 'Basepair Link',\n action: function(elm, d, i) {\n linkContextMenuShown = false;\n console.log('You have clicked the second item!');\n console.log('The data for this circle is: ' + d);\n dragLine.attr('class', fstyle.transparent);\n self.addLink(newLink);\n }\n }\n ]\n linkContextMenuShown = true;\n let linkContextMenu = contextMenu(linkMenu);\n console.log('newLinkMenu');\n linkContextMenu.apply(this, [d,i,true,\n function() { dragLine.attr('class', fstyle.transparent) }]);\n } else {\n // between end points but can't make a backbone\n if (basepairPossible)\n self.addLink(newLink);\n }\n } else {\n if (basepairPossible)\n self.addLink(newLink);\n }\n\n }\n };\n\n let nodeMousedown = function(d) {\n console.log(\"nodeMousedown\")\n if (!d.selected && !ctrlKeydown) {\n // if this node isn't selected, then we have to unselect every other node\n deselectAllNodes()\n }\n\n if (!shiftKeydown) {\n // only without shift, toggle select or select\n if (ctrlKeydown) {\n toggleSelectNode(d)\n } else {\n selectNode(d)\n }\n }\n\n if (shiftKeydown && self.options.editable) {\n // with shift key and editable continue to draw dragline\n mousedownNode = d;\n\n dragLine\n .attr('class', fstyle.dragLine)\n .attr('x1', mousedownNode.x)\n .attr('y1', mousedownNode.y)\n .attr('x2', mousedownNode.x)\n .attr('y2', mousedownNode.y);\n\n d3.event.stopPropagation();\n }\n };\n\n let linkClick = (d) => {\n if (!shiftKeydown) {\n return;\n }\n\n var invalidLinks = { //'backbone': true,\n 'fake': true,\n 'fake_fake': true,\n 'label_link': true};\n\n console.log('d.linkType:', d.linkType);\n if (d.linkType in invalidLinks )\n return;\n\n removeLink(d);\n };\n\n /* I/O functions */\n self.toJSON = function toJSON() {\n var data = {'rnas': self.rnas, 'extraLinks': self.extraLinks};\n var dataString = JSON.stringify(data, function(key, value) {\n //remove circular references\n if (key == 'rna') {\n return;\n } else {\n return value;\n }\n }, '\\t');\n return dataString;\n };\n\n self.fromJSON = function(jsonString) {\n var rnas, extraLinks;\n\n try{\n var data = JSON.parse(jsonString);\n rnas = data.rnas;\n extraLinks = data.extraLinks;\n } catch(err) {\n throw err;\n }\n\n for (var uid in rnas) {\n if (rnas[uid].type == 'rna') {\n r = new RNAGraph();\n\n r.seq = rnas[uid].seq;\n r.dotbracket = rnas[uid].dotbracket;\n r.circular = rnas[uid].circular;\n r.pairtable = rnas[uid].pairtable;\n r.uid = rnas[uid].uid;\n r.structName = rnas[uid].structName;\n r.nodes = rnas[uid].nodes;\n r.links = rnas[uid].links;\n r.rnaLength = rnas[uid].rnaLength;\n r.elements = rnas[uid].elements;\n r.nucsToNodes = rnas[uid].nucsToNodes;\n r.pseudoknotPairs = rnas[uid].pseudoknotPairs;\n } else {\n r = new ProteinGraph();\n r.size = rnas[uid].size;\n r.nodes = rnas[uid].nodes;\n r.uid = rnas[uid].uid;\n }\n\n self.addRNAJSON(r, false);\n }\n\n extraLinks.forEach(function(link) {\n self.extraLinks.push(link);\n });\n\n recalculateGraph();\n self.update();\n };\n\n self.addRNA = function(structure, passedOptions = {}) {\n let rnaJson = createInitialLayout(structure, passedOptions);\n let centerView = false;\n\n /*\n * Code to display the JSONs representing the structure\n *\n rnaJson.nodes[0].rna = null;\n rnaJson.nodes[0].nextNode = null;\n\n rnaJson.links[0].source = null;\n rnaJson.links[0].target = null;\n\n console.log(rnaJson.nodes[0]);\n console.log(rnaJson.links[0]);\n console.log(JSON.stringify(rnaJson.nodes[0],null,2));\n console.log(JSON.stringify(rnaJson.links[0],null,2));\n */\n\n if ('extraLinks' in passedOptions) {\n // presumably the passed in links are within the passed molecule\n let newLinks = self.addExternalLinks(rnaJson, passedOptions.extraLinks);\n\n self.extraLinks = self.extraLinks.concat(newLinks);\n }\n\n if ('centerPos' in passedOptions)\n self.addRNAJSON(rnaJson, {centerPos: passedOptions.centerPos,\n centerView: false})\n else if ('avoidOthers' in passedOptions)\n self.addRNAJSON(rnaJson, {avoidOthers: passedOptions.avoidOthers});\n else\n self.addRNAJSON(rnaJson, {centerView: passedOptions.centerView});\n\n return rnaJson;\n };\n\n self.addRNAJSON = function(rnaGraph,\n { avoidOthers = false,\n centerPos = null,\n centerView = true}\n ) {\n // Add an RNAGraph, which contains nodes and links as part of the\n // structure\n // Each RNA will have uid to identify it\n // when it is modified, it is replaced in the global list of RNAs\n //\n var maxX, minX;\n //console.log('centerView:', centerView);\n\n if (centerPos != null) {\n // center the newly created RNA at a given position\n let totalX = 0;\n let totalY = 0;\n let nodeCount = 0;\n\n rnaGraph.nodes.forEach(function(node) {\n totalX += node.x;\n totalY += node.y;\n nodeCount += 1;\n });\n\n if (nodeCount > 0) {\n // center the nodes at centerPos\n\n rnaGraph.nodes.forEach(function(node) {\n node.x = node.x + centerPos[0] - totalX / nodeCount;\n node.y = node.y + centerPos[1] - totalY / nodeCount;\n\n node.px = node.x;\n node.py = node.y;\n });\n }\n }\n\n if (avoidOthers) {\n if (self.graph.nodes.length > 0)\n maxX = d3.max(self.graph.nodes.map(function(d) { return d.x; }));\n else\n maxX = 0;\n\n minX = d3.min(rnaGraph.nodes.map(function(d) { return d.x; }));\n\n rnaGraph.nodes.forEach(function(node) {\n node.x += (maxX - minX) + 20;\n node.px += (maxX - minX);\n });\n }\n\n rnaGraph.nodes.forEach(function(node) {\n node.rna = rnaGraph;\n });\n\n self.rnas[rnaGraph.uid] = rnaGraph;\n recalculateGraph();\n\n self.update();\n\n if (centerView)\n self.centerView();\n\n return rnaGraph;\n };\n\n self.addNodes = function addNodes(json) {\n // add a new set of nodes from a json file\n\n // Resolve the sources and targets of the links so that they\n // are not just indeces into an array\n json.links.forEach(function(entry) {\n if (typeof entry.source == 'number') entry.source = json.nodes[entry.source];\n if (typeof entry.target == 'number') entry.target = json.nodes[entry.target];\n });\n\n // Get the maximum x and y values of the current graph\n // so that we don't place a new structure on top of the\n // old one\n if (self.graph.nodes.length > 0) {\n maxX = d3.max(self.graph.nodes.map(function(d) {return d.x;}));\n maxY = d3.max(self.graph.nodes.map(function(d) {return d.y;}));\n } else {\n maxX = 0;\n maxY = 0;\n }\n\n json.nodes.forEach(function(entry) {\n if (!(entry.rna.uid in self.rnas)) {\n self.rnas[entry.rna.uid] = entry.rna;\n }\n\n entry.x += maxX;\n //entry.y += maxY;\n\n entry.px += maxX;\n //entry.py += maxY;\n });\n\n r = new RNAGraph('','');\n r.nodes = json.nodes;\n r.links = json.links;\n\n //self.addRNA(r);\n recalculateGraph();\n\n self.update();\n self.centerView();\n };\n\n self.clearNodes = () => {\n self.graph.nodes = [];\n self.graph.links = [];\n\n self.rnas = {};\n self.extraLinks = [];\n\n self.update();\n };\n\n self.addLink = function(newLink) {\n // this means we have a new json, which means we have\n // to recalculate the structure and change the colors\n // appropriately\n //\n console.log('adding new link');\n if (newLink.source.rna == newLink.target.rna) {\n // must be a basepair\n let r = newLink.source.rna;\n\n r.pairtable[newLink.source.num] = newLink.target.num;\n r.pairtable[newLink.target.num] = newLink.source.num;\n\n updateRnaGraph(r);\n\n } else {\n //Add an extra link\n console.log('intermolecule');\n newLink.linkType = 'intermolecule';\n self.extraLinks.push(newLink);\n }\n recalculateGraph();\n self.update();\n };\n\n self.addExternalLinks = function(rnaJson, externalLinks) {\n let newLinks = [];\n\n for (let i = 0; i < externalLinks.length; i++) {\n let newLink = {linkType: 'external', value: 1, uid: slugid.nice(),\n source: null, target: null};\n // check if the source node is an array\n if (Object.prototype.toString.call(externalLinks[i][0]) === '[object Array]') {\n for (let j = 0; j < rnaJson.nodes.length; j++) {\n if ('nucs' in rnaJson.nodes[j]) {\n if (rnaJson.nodes[j].nucs.equals(externalLinks[i][0])) {\n newLink.source = rnaJson.nodes[j];\n break;\n }\n }\n }\n } else {\n for (let j = 0; j < rnaJson.nodes.length; j++) {\n if (rnaJson.nodes[j].num == externalLinks[i][0]) {\n newLink.source = rnaJson.nodes[j];\n }\n }\n }\n\n // check if the target node is an array\n if (Object.prototype.toString.call(externalLinks[i][1]) === '[object Array]') {\n for (let j = 0; j < rnaJson.nodes.length; j++) {\n if ('nucs' in rnaJson.nodes[j]) {\n if (rnaJson.nodes[j].nucs.equals(externalLinks[i][1])) {\n newLink.target = rnaJson.nodes[j];\n }\n }\n }\n } else {\n for (let j = 0; j < rnaJson.nodes.length; j++) {\n if (rnaJson.nodes[j].num == externalLinks[i][1]) {\n newLink.target = rnaJson.nodes[j];\n }\n }\n }\n\n if (newLink.source == null || newLink.target == null) {\n console.log('ERROR: source or target of new link not found:', newLink, externalLinks[i]);\n continue;\n }\n\n newLinks.push(newLink);\n }\n\n return newLinks;\n };\n\n self.getStructuresDotBracket = function() {\n console.log('self.rnas:', self.rnas);\n let sequence = [];\n let currIdx = 1;\n let nodeIdxs = {};\n let breaks = [];\n let pairtable = [];\n\n // add the nodes\n for (let uid in self.rnas) {\n let rna = self.rnas[uid];\n\n for (let j = 0; j < rna.nodes.length; j++) {\n let node = rna.nodes[j];\n\n if (node.nodeType != 'nucleotide')\n continue;\n\n console.log('node:', node);\n nodeIdxs[node.uid] = currIdx;\n currIdx += 1;\n\n sequence.push(node.name);\n }\n\n breaks.push(currIdx);\n }\n\n pairtable = [currIdx-1]\n for (let i = 0; i < currIdx; i++)\n pairtable.push(0)\n\n // add the links\n for (let uid in self.rnas) {\n let rna = self.rnas[uid];\n\n for (let j = 0; j < rna.links.length; j++) {\n let link = rna.links[j];\n\n if (link.linkType != 'basepair')\n continue;\n\n let idx1 = nodeIdxs[link.source.uid];\n let idx2 = nodeIdxs[link.target.uid];\n pairtable[idx1] = idx2;\n pairtable[idx2] = idx1;\n }\n }\n\n for (let i = 0; i < self.extraLinks.length; i++) {\n let link = self.extraLinks[i];\n\n let idx1 = nodeIdxs[link.source.uid];\n let idx2 = nodeIdxs[link.target.uid];\n\n pairtable[idx1] = idx2;\n pairtable[idx2] = idx1;\n }\n\n let structure = rnaUtilities.pairtableToDotbracket(pairtable).split('');\n\n for (let i = 0; i < breaks.length - 1; i++) {\n console.log('breaks[i]:', breaks[i]);\n sequence.splice(breaks[i] + i - 1, 0, '&');\n structure.splice(breaks[i] + i - 1, 0, '&');\n }\n\n console.log('sequence:', sequence, sequence.join(''));\n console.log('structure:', structure, structure.join(''));\n return [sequence.join(''), structure.join('')];\n };\n\n /* APIs */\n self.startAnimation = function() {\n self.options.animation = true;\n vis.selectAll('g.gnode')\n .call(drag);\n self.force.start();\n };\n\n self.stopAnimation = function() {\n self.options.animation = false;\n vis.selectAll('g.gnode')\n .on('mousedown.drag', null);\n self.force.stop();\n };\n\n self.resumeForce = function() {\n if (self.options.animation)\n self.force.resume();\n };\n\n self.setFriction = function(value) {\n self.force.friction(value);\n self.resumeForce();\n };\n\n self.setCharge = function(value) {\n self.force.charge(value);\n self.resumeForce();\n };\n\n self.setGravity = function(value) {\n self.force.gravity(value);\n self.resumeForce();\n };\n\n self.setPseudoknotStrength = function(value) {\n self.linkStrengths.pseudoknot = value;\n self.update();\n };\n\n self.displayNumbering = function(value) {\n self.displayParameters.displayNumbering = value;\n updateStyle();\n };\n\n self.displayNodeOutline = function(value) {\n self.displayParameters.displayNodeOutline = value;\n updateStyle();\n };\n\n self.displayNodeLabel = function(value) {\n self.displayParameters.displayNodeLabel = value;\n updateStyle();\n };\n\n self.displayLinks = function(value) {\n self.displayParameters.displayLinks = value;\n updateStyle();\n };\n\n self.displayPseudoknotLinks = function(value) {\n self.displayParameters.displayPseudoknotLinks = value;\n updateStyle();\n };\n\n self.displayProteinLinks = function(value) {\n self.displayParameters.displayProteinLinks = value;\n updateStyle();\n };\n\n self.displayDirectionArrows = function(value) {\n self.displayParameters.displayDirectionArrows = value;\n updateStyle();\n };\n}\n","import {RNAGraph} from './rnagraph.js';\n\nimport {simpleXyCoordinates} from './simplernaplot.js';\nimport {NAView} from './naview/naview.js'\n\nimport fstyle from './fornac.css';\n\nexport function rnaPlot(passedOptions = {}) {\n var options = {\n 'width': 300,\n 'height': 300,\n 'nucleotideRadius': 5,\n 'rnaEdgePadding': 1, // how far the leftmost, rightmost, topmost and bottomost\n // nucleotides are from the edge of the plot\n 'labelInterval': 10,\n 'showNucleotideLabels': true,\n 'startNucleotideNumber': 1,\n 'bundleExternalLinks': false,\n\n 'rnaLayout': 'simple', // simple or naview\n 'namePosition': '0 0' // for x and y either 0, 0.5 or 1\n };\n var options = Object.assign(options, passedOptions);\n\n var xScale, yScale;\n\n function createTransformToFillViewport(xValues, yValues) {\n // create transform that will scale the x and y values so that\n // they fill the available viewport\n let xExtent = d3.extent(xValues);\n let yExtent = d3.extent(yValues);\n\n // add the radius of the nucleotides\n xExtent[0] -= options.nucleotideRadius + options.rnaEdgePadding;\n yExtent[0] -= options.nucleotideRadius + options.rnaEdgePadding;\n\n xExtent[1] += options.nucleotideRadius + options.rnaEdgePadding;\n yExtent[1] += options.nucleotideRadius + options.rnaEdgePadding;\n\n // find out how wide and height the molecule\n var xRange = xExtent[1] - xExtent[0];\n var yRange = yExtent[1] - yExtent[0];\n\n // how much wider / taller is it than the available viewport\n var xExtra = xRange - options.width;\n var yExtra = yRange - options.height;\n\n // once we have a scale for one dimension, we can create the scale for the other\n // keeping the same expansion / shrinking ratio\n function createOtherScale(firstScale, newDomain, newRange) {\n var scaleFactor = (firstScale.range()[1] - firstScale.range()[0]) /\n (firstScale.domain()[1] - firstScale.domain()[0]);\n var newWidth = (newDomain[1] - newDomain[0]) * scaleFactor\n var newMargin = ((newRange[1] - newRange[0]) - newWidth) / 2;\n\n return {'scaleFactor': scaleFactor,\n 'scale': d3.scale.linear()\n .domain(newDomain)\n .range([newRange[0] + newMargin, newRange[1] - newMargin])};\n }\n\n var ret;\n\n if (xExtra > yExtra) {\n // we have to shrink more in the x-dimension than the y\n xScale = d3.scale.linear()\n .domain(xExtent)\n .range([0, options.width])\n\n ret = createOtherScale(xScale, yExtent, [0, options.height]);\n yScale = ret.scale;\n } else {\n // we have to shrink more in the x-dimension than the y\n yScale = d3.scale.linear()\n .domain(yExtent)\n .range([0, options.height])\n\n ret = createOtherScale(yScale, xExtent, [0, options.width]);\n xScale = ret.scale;\n }\n\n var xOffset = xScale.range()[0] - xScale.domain()[0];\n var yOffset = yScale.range()[0] - yScale.domain()[0];\n\n return 'translate(' + -(xScale.domain()[0] * ret.scaleFactor - xScale.range()[0]) +\n ',' + -(yScale.domain()[0] * ret.scaleFactor - yScale.range()[0]) + ')' +\n 'scale(' + ret.scaleFactor + ')';\n }\n\n function createNucleotides(selection, nucleotideNodes) {\n // create groupings for each nucleotide and label\n var gs = selection\n .selectAll('.gnode')\n .data(nucleotideNodes)\n .enter()\n .append('svg:g')\n .classed('gnode', true)\n .attr('transform', function(d) {\n return 'translate(' + d.x + ',' + d.y + ')';\n });\n\n var circles = gs.append('svg:circle')\n .classed(fstyle.node, true)\n .attr('node_type', 'nucleotide')\n .attr('base_type', (d) => { if (d.name) { return d.name.toLowerCase(); }})\n .attr('r', options.nucleotideRadius)\n\n\n if (options.showNucleotideLabels) {\n var nucleotideLabels = gs.append('svg:text')\n .text(function(d) { return d.name; })\n .classed(fstyle.nodeLabel, true)\n .append('svg:title')\n .text(function(d) { return d.struct_name + ':' + d.num; });\n }\n }\n\n function createLabels(selection, labelNodes) {\n // create groupings for each nucleotide and label\n\n var gs = selection\n .selectAll()\n .data(labelNodes)\n .enter()\n .append('svg:g')\n .classed('gnode', true)\n .attr('transform', function(d) {\n return 'translate(' + d.x + ',' + d.y + ')';\n });\n\n var circles = gs.append('svg:circle')\n .classed(fstyle.node, true)\n .attr('node_type', 'label')\n .attr('r', options.nucleotideRadius)\n\n var numberLabels = gs.append('svg:text')\n .classed(fstyle.nodeLabel, true)\n .text(function(d) { return d.name; })\n }\n\n function createName(selection, name) {\n let nameLabel = selection.append('svg:text')\n //.attr('dy', -10)\n .classed(fstyle.plotLabel, true)\n .text(name);\n\n let xyPos = options.namePosition.split(\" \", 2) // 0 0.5 1\n let xy = []\n let textBBox = nameLabel.node().getBBox()\n let textSize = [textBBox.width, textBBox.height]\n let plotSize = [options.width, options.height]\n\n for (let p in [0, 1]) {\n switch (xyPos[p]) {\n case '0':\n xy[p] = textSize[p] / 2\n break;\n case '1':\n xy[p] = plotSize[p] - textSize[p] / 2\n break;\n case '0.5':\n xy[p] = plotSize[p] / 2\n break;\n }\n }\n nameLabel.attr('x', xy[0]).attr('y', xy[1])\n }\n\n function makeExternalLinksBundle(selection, links) {\n var nodesDict = {};\n var linksList = [];\n links = links.filter(function(d) { return d.linkType == 'correct' || d.linkType == 'incorrect' || d.linkType == 'extra'; });\n\n selection.selectAll('[link-type=extra]')\n .remove();\n\n\n for (var i = 0; i < links.length; i++) {\n if (links[i].source === null || links[i].target === null)\n continue;\n\n nodesDict[links[i].source.uid] = links[i].source;\n nodesDict[links[i].target.uid] = links[i].target;\n\n linksList.push({'source': links[i].source.uid, 'target': links[i].target.uid, 'linkType': links[i].linkType, 'extraLinkType': links[i].extraLinkType}) ;\n }\n\n var fbundling = d3.ForceEdgeBundling().nodes(nodesDict).edges(linksList)\n .compatibility_threshold(0.8).step_size(0.2);\n var results = fbundling();\n\n var d3line = d3.svg.line()\n .x(function(d){return d.x;})\n .y(function(d){return d.y;})\n .interpolate('linear');\n\n for (var i = 0; i < results.length; i++) {\n var edge_subpoint_data = results[i];\n // for each of the arrays in the results\n // draw a line between the subdivions points for that edge\n\n selection.append('path').attr('d', d3line(edge_subpoint_data))\n .style('fill', 'none')\n .attr('link-type', function(d) { return linksList[i].linkType; })\n .attr('extra-link-type', function(d) { return linksList[i].extraLinkType; })\n .style('stroke-opacity',0.4); //use opacity as blending\n }\n\n }\n\n function createLinks(selection, links) {\n links = links.filter(function(d) { return d.source !== null && d.target !== null; });\n var gs = selection.selectAll('.link')\n .data(links)\n .enter()\n .append('svg:line')\n .attr('x1', function(d) { return d.source.x; })\n .attr('x2', function(d) { return d.target.x; })\n .attr('y1', function(d) { return d.source.y; })\n .attr('y2', function(d) { return d.target.y; })\n .attr('link-type', function(d) { return d.linkType; })\n .attr('extra-link-type', function(d) { return d.extraLinkType; })\n .classed('link', true)\n .classed(fstyle.link, true)\n }\n\n function chart(selection) {\n selection.each(function(data) {\n let plot = d3.select(this).append('g')\n .classed(fstyle.plot, true)\n\n // data should be a dictionary containing at least a structure\n // and possibly a sequence\n let rg = new RNAGraph(data.sequence, data.structure, data.name, options.startNucleotideNumber)\n .recalculateElements()\n .elementsToJson()\n .addName(data.name);\n\n data.rnaGraph = rg;\n // calculate the position of each nucleotide\n // the positions of the labels will be calculated in\n // the addLabels function\n let positions = [];\n\n if (options.rnaLayout === 'naview') {\n var naview = new NAView();\n var naViewPositions = naview.naview_xy_coordinates(rg.pairtable);\n\n for (var i = 0; i < naViewPositions.nbase; i++) {\n positions.push([naViewPositions.x[i], naViewPositions.y[i]]);\n }\n } else {\n positions = simpleXyCoordinates(rg.pairtable);\n }\n\n rg.addPositions('nucleotide', positions)\n //.reinforceStems()\n //.reinforceLoops()\n //.addExtraLinks(data.extraLinks)\n .addLabels(options.startNucleotideNumber, options.labelInterval);\n\n // create a transform that will fit the molecule to the\n // size of the viewport (canvas, svg, whatever)\n let fillViewportTransform = createTransformToFillViewport(\n rg.nodes.map(function(d) { return d.x; }),\n rg.nodes.map(function(d) { return d.y; })\n );\n plot.attr('transform', fillViewportTransform);\n\n let nucleotideNodes = rg.nodes.filter(function(d) {\n return d.nodeType == 'nucleotide';\n });\n\n let labelNodes = rg.nodes.filter(function(d) {\n return d.nodeType == 'label';\n });\n\n let links = rg.links;\n\n createLinks(plot, links);\n createNucleotides(plot, nucleotideNodes);\n createLabels(plot, labelNodes);\n createName(d3.select(this), data.name);\n\n if (options.bundleExternalLinks) {\n makeExternalLinksBundle(plot, links);\n }\n\n });\n }\n\n chart.width = function(_) {\n if (!arguments.length) return options.width;\n options.width = _;\n return chart;\n };\n\n chart.height = function(_) {\n if (!arguments.length) return options.height;\n options.height = _;\n return chart;\n };\n\n chart.showNucleotideLabels = function(_) {\n if (!arguments.length) return options.showNucleotideLabels;\n options.showNucleotideLabels = _;\n return chart;\n };\n\n chart.rnaEdgePadding = function(_) {\n if (!arguments.length) return options.rnaEdgePadding;\n options.rnaEdgePadding = _;\n return chart;\n };\n\n chart.nucleotideRadius = function(_) {\n if (!arguments.length) return options.nucleotideRadius;\n options.nucleotideRadius = _;\n return chart;\n };\n\n chart.labelInterval = function(_) {\n if (!arguments.length) return options.labelInterval;\n options.labelInterval = _;\n return chart;\n };\n\n chart.showNucleotideLabels = function(_) {\n if (!arguments.length) return options.showNucleotideLabels;\n options.showNucleotideLabels = _;\n return chart;\n };\n\n chart.startNucleotideNumber = function(_) {\n if (!arguments.length) return options.startNucleotideNumber;\n options.startNucleotideNumber = _;\n return chart;\n };\n\n chart.bundleExternalLinks = function(_) {\n if (!arguments.length) return options.bundleExternalLinks;\n options.bundleExternalLinks = _;\n return chart;\n };\n\n chart.rnaLayout = function(_) {\n if (!arguments.length) return options.rnaLayout;\n options.rnaLayout = _;\n return chart;\n };\n\n chart.namePosition = function(_) {\n if (!arguments.length) return options.namePosition;\n options.namePosition = _;\n return chart;\n };\n\n return chart;\n}\n","import {rnaPlot} from './rnaplot.js';\n\nexport function rnaTreemap(passedOptions = {}) {\n var options = {\n 'width': 300,\n 'height': 300,\n 'nucleotideRadius': 5,\n 'rnaEdgePadding': 1, // how far the leftmost, rightmost, topmost and bottomost\n // nucleotides are from the edge of the plot\n 'labelInterval': 10,\n 'showNucleotideLabels': true,\n 'startNucleotideNumber': 1,\n 'bundleExternalLinks': false,\n\n 'rnaLayout': 'simple', // simple or naview\n 'namePosition': '0 0', // for x and y either 0, 0.5 or 1\n };\n\n var options = Object.assign(options, passedOptions);\n\n function rnaTreemapNode(selection) {\n // create a background rectangle for each RNA structure\n selection.each(function(d) {\n d3.select(this)\n .attr('transform', function(d) { return 'translate(' + d.x + ',' + d.y + ')' })\n .append('rect')\n .attr('fill', 'transparent')\n .attr('width', function(d) { return Math.max(0, d.dx); })\n .attr('height', function(d) { return Math.max(0, d.dy); })\n\n // draw the actual RNA structure\n var chart = rnaPlot(options)\n .width( Math.max(0, d.dx))\n .height( Math.max(0, d.dy))\n\n if ('structure' in d) d3.select(this).call(chart)\n });\n }\n\n var chart = function(selection) {\n selection.each(function(data) {\n console.log('data:', data)\n // initialize the treemap structure\n // sample input\n // { 'name': 'blah',\n // 'children: [{'structure': '..((..))',\n // 'sequence': 'ACCGGCC',\n // 'size': 50}]\n // }\n var treemap = d3.layout.treemap()\n .size([options.width, options.height])\n .sticky(false)\n .value(function(d) { return d.size; });\n\n // create a new for each node in the treemap\n // this may be a little redundant, since we expect the calling\n // selection to contain their own g elements\n var gEnter = d3.select(this)\n .append('g')\n .classed('rnatreemap', true)\n var treemapGnodes = gEnter.datum(data).selectAll('.treemapnode')\n .data(treemap.nodes)\n .enter()\n .append('g')\n .classed('treemapnode', true)\n .call(rnaTreemapNode);\n });\n };\n\n chart.width = function(_) {\n if (!arguments.length) return options.width;\n options.width = _;\n return chart;\n };\n\n chart.height = function(_) {\n if (!arguments.length) return options.height;\n options.height = _;\n return chart;\n };\n\n chart.showNucleotideLabels = function(_) {\n if (!arguments.length) return options.showNucleotideLabels;\n options.showNucleotideLabels = _;\n return chart;\n };\n\n chart.rnaEdgePadding = function(_) {\n if (!arguments.length) return options.rnaEdgePadding;\n options.rnaEdgePadding = _;\n return chart;\n };\n\n chart.nucleotideRadius = function(_) {\n if (!arguments.length) return options.nucleotideRadius;\n options.nucleotideRadius = _;\n return chart;\n };\n\n chart.labelInterval = function(_) {\n if (!arguments.length) return options.labelInterval;\n options.labelInterval = _;\n return chart;\n };\n\n chart.showNucleotideLabels = function(_) {\n if (!arguments.length) return options.showNucleotideLabels;\n options.showNucleotideLabels = _;\n return chart;\n };\n\n chart.startNucleotideNumber = function(_) {\n if (!arguments.length) return options.startNucleotideNumber;\n options.startNucleotideNumber = _;\n return chart;\n };\n\n chart.bundleExternalLinks = function(_) {\n if (!arguments.length) return options.bundleExternalLinks;\n options.bundleExternalLinks = _;\n return chart;\n };\n\n chart.rnaLayout = function(_) {\n if (!arguments.length) return options.rnaLayout;\n options.rnaLayout = _;\n return chart;\n };\n\n chart.namePosition = function(_) {\n if (!arguments.length) return options.namePosition;\n options.namePosition = _;\n return chart;\n };\n\n chart.zoom = function(_) {\n if (!arguments.length) return options.zoom;\n options.zoom = _;\n return chart;\n };\n\n return chart;\n}\n"],"names":["root","factory","exports","module","require","define","amd","self","__WEBPACK_EXTERNAL_MODULE__893__","Connection","this","loop","Loop","region","Region","start","end","xrad","yrad","angle","extruded","broken","_isNull","prototype","isNull","setNull","getLoop","setLoop","getRegion","setRegion","getStart","setStart","getEnd","setEnd","getXrad","setXrad","getYrad","setYrad","getAngle","setAngle","isExtruded","setExtruded","isBroken","setBroken","nconnection","connections","_connections","number","depth","mark","x","y","radius","getNconnection","setNconnection","setConnection","i","c","getConnection","addConnection","push","getNumber","setNumber","getDepth","setDepth","isMark","setMark","getX","setX","getY","setY","getRadius","setRadius","_start1","_end1","_start2","_end2","getStart1","setStart1","start1","getEnd1","setEnd1","end1","getStart2","setStart2","start2","getEnd2","setEnd2","end2","byteLength","b64","lens","getLens","validLen","placeHoldersLen","toByteArray","tmp","arr","Arr","_byteLength","curByte","len","revLookup","charCodeAt","fromByteArray","uint8","length","extraBytes","parts","maxChunkLength","len2","encodeChunk","lookup","join","Uint8Array","Array","code","Error","indexOf","num","output","base64","ieee754","customInspectSymbol","Symbol","Buffer","K_MAX_LENGTH","createBuffer","RangeError","buf","Object","setPrototypeOf","arg","encodingOrOffset","TypeError","allocUnsafe","from","value","string","encoding","isEncoding","actual","write","slice","fromString","ArrayBuffer","isView","arrayView","isInstance","copy","fromArrayBuffer","buffer","byteOffset","fromArrayLike","fromArrayView","SharedArrayBuffer","valueOf","b","obj","isBuffer","checked","undefined","numberIsNaN","type","isArray","data","fromObject","toPrimitive","assertSize","size","array","toString","mustMatch","arguments","loweredCase","utf8ToBytes","base64ToBytes","toLowerCase","slowToString","hexSlice","utf8Slice","asciiSlice","latin1Slice","base64Slice","utf16leSlice","swap","n","m","bidirectionalIndexOf","val","dir","arrayIndexOf","call","lastIndexOf","indexSize","arrLength","valLength","String","read","readUInt16BE","foundIndex","found","j","hexWrite","offset","Number","remaining","strLen","parsed","parseInt","substr","utf8Write","blitBuffer","asciiWrite","str","byteArray","asciiToBytes","base64Write","ucs2Write","units","hi","lo","utf16leToBytes","Math","min","res","firstByte","codePoint","bytesPerSequence","secondByte","thirdByte","fourthByte","tempCodePoint","codePoints","MAX_ARGUMENTS_LENGTH","fromCharCode","apply","decodeCodePointsArray","TYPED_ARRAY_SUPPORT","proto","foo","e","typedArraySupport","console","error","defineProperty","enumerable","get","poolSize","alloc","fill","allocUnsafeSlow","_isBuffer","compare","a","concat","list","pos","set","swap16","swap32","swap64","toLocaleString","equals","inspect","max","replace","trim","target","thisStart","thisEnd","thisCopy","targetCopy","includes","isFinite","toJSON","_arr","ret","out","hexSliceLookupTable","bytes","checkOffset","ext","checkInt","wrtBigUInt64LE","checkIntBI","BigInt","wrtBigUInt64BE","checkIEEE754","writeFloat","littleEndian","noAssert","writeDouble","newBuf","subarray","readUintLE","readUIntLE","mul","readUintBE","readUIntBE","readUint8","readUInt8","readUint16LE","readUInt16LE","readUint16BE","readUint32LE","readUInt32LE","readUint32BE","readUInt32BE","readBigUInt64LE","defineBigIntMethod","validateNumber","first","last","boundsError","readBigUInt64BE","readIntLE","pow","readIntBE","readInt8","readInt16LE","readInt16BE","readInt32LE","readInt32BE","readBigInt64LE","readBigInt64BE","readFloatLE","readFloatBE","readDoubleLE","readDoubleBE","writeUintLE","writeUIntLE","writeUintBE","writeUIntBE","writeUint8","writeUInt8","writeUint16LE","writeUInt16LE","writeUint16BE","writeUInt16BE","writeUint32LE","writeUInt32LE","writeUint32BE","writeUInt32BE","writeBigUInt64LE","writeBigUInt64BE","writeIntLE","limit","sub","writeIntBE","writeInt8","writeInt16LE","writeInt16BE","writeInt32LE","writeInt32BE","writeBigInt64LE","writeBigInt64BE","writeFloatLE","writeFloatBE","writeDoubleLE","writeDoubleBE","targetStart","copyWithin","errors","E","sym","getMessage","Base","constructor","super","writable","configurable","name","stack","message","addNumericalSeparator","range","ERR_OUT_OF_RANGE","checkBounds","ERR_INVALID_ARG_TYPE","floor","ERR_BUFFER_OUT_OF_BOUNDS","input","msg","received","isInteger","abs","INVALID_BASE64_RE","Infinity","leadSurrogate","split","base64clean","src","dst","alphabet","table","i16","fn","BufferBigIntNotDefined","isLE","mLen","nBytes","eLen","eMax","eBias","nBits","d","s","NaN","rt","isNaN","log","LN2","uuid","toBase64","btoa","fromBase64","atob","encode","uuid_","parse","substring","decode","slug","stringify","v4","nice","getRandomValues","rnds8","rng","crypto","bind","msCrypto","test","byteToHex","_nodeId","_clockseq","_lastMSecs","_lastNSecs","options","node","clockseq","seedBytes","random","msecs","Date","now","nsecs","dt","tl","tmh","v","version","hashfunc","generateUUID","namespace","unescape","encodeURIComponent","stringToBytes","err","DNS","URL","getOutputLength","inputLength8","safeAdd","lsw","md5cmn","q","t","cnt","md5ff","md5gg","md5hh","md5ii","v35","length32","hexTab","hex","charAt","md5ToHexEncodedArray","olda","oldb","oldc","oldd","wordsToMd5","length8","Uint32Array","bytesToWords","rnds","f","z","ROTL","K","H","l","N","ceil","M","_i","_i2","W","_t","_t2","T","__webpack_module_cache__","__webpack_require__","moduleId","cachedModule","__webpack_modules__","getter","__esModule","definition","key","o","g","globalThis","Function","window","prop","hasOwnProperty","r","toStringTag","scriptUrl","importScripts","location","document","currentScript","scripts","getElementsByTagName","p","contextMenu","menu","opts","openCallback","closeCallback","previouslyMouseUp","uid","slugid","rootElement","orientation","initialPos","parentStart","onOpen","onClose","d3","enter","append","classed","on","style","index","mousePos","pMouseUp","elm","currentThis","openChildMenuUid","html","preventDefault","stopPropagation","selectAll","attr","divider","disabled","action","title","children","childUid","boundingRect","getBoundingClientRect","childrenContextMenu","left","pageXOffset","top","pageYOffset","width","ArrowIcon","contextMenuSelection","pageX","pageY","innerWidth","numberSort","RNAUtilities","bracketLeft","bracketRight","inverseBrackets","bracket","maximumMatching","pt","mm","maximum","backtrackMaximumMatching","oldPt","map","mmBt","dotbracketToPairtable","dotbracket","inverseBracketLeft","inverseBracketRight","ni","pop","insertIntoStack","k","deleteFromStack","pairtableToDotbracket","seen","findUnmatched","to","toRemove","unmatched","origFrom","origTo","removePseudoknotsFromPairtable","newPt","removed","ptToElements","level","dotBracketBreaks","elements","u5","u3","sort","external","right","rnaUtilities","ColorScheme","colorsText","parseRange","rangeText","nums","parts1","parseColorText","colorText","lines","currMolecule","counter","colorsJson","colorValues","domainValues","words","search","partsRight","domain","color","normalizeColors","moleculeName","minNum","MAX_VALUE","maxNum","MIN_VALUE","resnum","RNAGraph","seq","structName","startNumber","circularizeExternal","circular","pseudoknotPairs","nucsToNodes","addUids","uids","nucleotideNodes","nodes","filter","nodeType","computePairtable","pairtable","removeBreaks","targetString","breaks","seqBreaks","rnaLength","arraysEqual","addPositions","positions","labelNodes","breakNodesToFakeNodes","_loop","elemType","getPositions","getUids","reinforceStems","relevantElements","allNucs","nucs","addFakeNode","reinforceLoops","filterNucs","newNode1","px","py","newNode2","updateLinkUids","links","source","tan","fakeNodeUid","newNode","newX","newY","coordsCounted","cos","ia","fromNode","connectFakeNodes","fakeNodes","linked","thisNode","thisNuc","JSON","distance","addExtraLinks","extraLinks","newLink","getNodeFromNucleotides","linkType","elementsToJson","elemTypes","nodeName","prevNode","nextNode","addLabels","labelInterval","prevVec","nextVec","combinedVec","vecLength","sqrt","normedVec","offsetVec","recalculateElements","removePseudoknots","externalLoop","eloop","prev","hloop","numGreater","reassignLinkUids","addPseudoknots","addName","simpleXyCoordinates","pair_table","alpha","loop_size","stack_size","lp","stk","PIHALF","PI","i_old","partner","start_k","start_l","ladder","begin","diff","polygon","count","bubble","remember","poss","sin","Radloop","loopnumber","next","getLoopnumber","setLoopnumber","getNext","setNext","getPrev","setPrev","mate","extracted","getMate","setMate","isExtracted","setExtracted","NAView","ANUM","MAXITER","bases","nbase","nregion","loop_count","loops","regions","rlphead","lencut","RADIUS_REDUCTION_FACTOR","angleinc","_h","HELIX_FACTOR","BACKBONE_DISTANCE","determine_depths","FornaContainer","element","passedOptions","assign","initialSize","svgW","svgH","linkStrengths","displayParameters","colorScheme","customColors","rnas","mousedownNode","mouseupNode","linkContextMenuShown","resetMouseVars","graph","editable","animation","shiftKeydown","ctrlKeydown","keyCode","getStructuresDotBracket","centerView","zoomable","disableZooming","enableBrushing","enableZooming","disableBrushing","backgroundMenu","canvasMousePos","xScale","invert","yScale","addRNA","nodeMenu","deleteNode","changeNode","insertNodeBeforeOrAfter","nodeContextMenu","backgroundContextMenu","select","remove","svg","each","focus","mouseEventHelper","mpos","vis","dragLine","fstyle","deselectAllNodes","visLinks","visNodes","linear","zoomer","zoom","scaleExtent","translate","scale","toggleSelectNode","selected","selectedNodes","brusher","brush","extent","clear","force","charge","middleCharge","otherCharge","friction","linkDistance","linkDistanceMultiplier","linkStrength","other","gravity","chargeDistance","drag","sourceEvent","d1","fixed","dx","dy","resumeForce","createInitialLayout","structure","rg","sequence","rnaJson","layout","naViewPositions","naview_xy_coordinates","createNewNodes","gnodesEnter","previouslySelected","rna","transition","duration","ease","nodeMousedown","nodeMouseup","labelAndProteinNodes","text","createNewLinks","linksEnter","linkLines","linkClick","drawDirectionArrow","magnitude","endPoint","startPoint","nodeStroke","parseFloat","lengthMult","arrowWidth","u","arrowTip","path","realLinkFilter","recalculateGraph","uidsToNodes","forEach","link","fakeLinks","linkIndex","splice","update","allLinks","elementKey","exit","gnodes","realNodes","quadtree","collide","nx1","nx2","ny1","ny2","quad","x1","y1","x2","y2","point","visit","changeColorScheme","updateStyle","transitionRNA","newStructure","nextFunction","transitionDuration","newRNAJson","newNodes","callback","setTimeout","bbTransform","minX","minY","maxX","maxY","maxRadius","molWidth","molHeight","widthRatio","heightRatio","minRatio","maxNodeRadius","newMolWidth","newMolHeight","getBoundingBoxTransform","setSize","offsetWidth","offsetHeight","setOutlineColor","addCustomColors","json","addCustomColorsText","customColorsText","cs","newColorScheme","ordinal","category10","interpolate","changeColors","moleculeColors","displayNumbering","displayNodeOutline","displayNodeLabel","displayLinks","displayPseudoknotLinks","displayProteinLinks","displayAllLinks","displayDirectionArrows","referenceNode","newNodeNum","newDotbracket","newSequence","newPositions","positionOffset","newUids","pair","updateRnaGraph","nucleotidePositions","labelPositions","basepairPossible","linkMenu","rna1","rna2","dotbracket1","dotbracket2","seq1","seq2","positions1","positions2","newSeq","toAddExternal","toDelete","newRna","addBackBoneLink","addLink","linkContextMenu","sequence1","sequence2","rnaDotBracket","dotBracket1","dotBracket2","uids1","uids2","removeBackBoneLink","extraLinkIndex","removeLink","fromJSON","jsonString","ProteinGraph","addRNAJSON","newLinks","addExternalLinks","centerPos","avoidOthers","rnaGraph","_ref","_ref$avoidOthers","_ref$centerPos","_ref$centerView","totalX","totalY","nodeCount","addNodes","entry","clearNodes","externalLinks","currIdx","nodeIdxs","idx1","idx2","startAnimation","stopAnimation","stop","resume","setFriction","setCharge","setGravity","setPseudoknotStrength","pseudoknot","rnaPlot","chart","selection","plot","startNucleotideNumber","rnaLayout","fillViewportTransform","xValues","yValues","xExtent","yExtent","nucleotideRadius","rnaEdgePadding","xRange","yRange","createOtherScale","firstScale","newDomain","newRange","scaleFactor","newWidth","newMargin","height","createTransformToFillViewport","extraLinkType","createLinks","gs","showNucleotideLabels","struct_name","createNucleotides","createLabels","nameLabel","xyPos","namePosition","xy","textBBox","getBBox","textSize","plotSize","createName","bundleExternalLinks","nodesDict","linksList","results","ForceEdgeBundling","edges","compatibility_threshold","step_size","fbundling","d3line","line","edge_subpoint_data","makeExternalLinksBundle","_","rnaTreemap","rnaTreemapNode","treemap","sticky","datum","read_in_bases","find_regions","construct_loop","find_central_loop","traverse_loop","npairs","nb1","ibase","retloop","cp","rp","rlp","maxconn","maxdepth","anchor_connection","xs","ys","xe","xn","yn","xc","yc","xo","yo","astart","aend","cpnext","acp","cpprev","ic","da","maxang","icstart","icend","icmiddle","icroot","done","done_all_connections","rooted","sign","midx","midy","nrx","nry","mx","my","vx","vy","dotmv","nmidx","nmidy","icstart1","icup","icdown","icnext","direction","dan","rr","cpx","cpy","cpnextx","cpnexty","cnx","rcn","rc","lnx","lny","rl","ac","acn","sx","sy","dcp","imaxloop","indice","atan2","set_radius","determine_radius","connected_connection","find_ic_middle","asin","construct_extruded_segment","generate_region","mindit","ci","sumn","sumd","dit","imindit","rt2_2","aend1","aend2","aave","a1","a2","dac","nstart","nend","collision","construct_circle_segment","minf2","maxf2","find_center_for_arc","h","hhi","hlow","disc","theta","iter","acos","noIterationFailureYet"],"sourceRoot":""} \ No newline at end of file +{"version":3,"file":"fornac.js","mappings":"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","sources":["webpack://fornac/webpack/universalModuleDefinition","webpack://fornac/./src/naview/connection.js","webpack://fornac/./src/naview/loop.js","webpack://fornac/./src/naview/region.js","webpack://fornac/./node_modules/base64-js/index.js","webpack://fornac/./node_modules/buffer/index.js","webpack://fornac/./src/d3-context-menu.css?fe1f","webpack://fornac/./src/fornac.css?7f8e","webpack://fornac/./node_modules/ieee754/index.js","webpack://fornac/./node_modules/slugid/index.js","webpack://fornac/./node_modules/slugid/slugid.js","webpack://fornac/./node_modules/uuid/dist/esm-browser/rng.js","webpack://fornac/./node_modules/uuid/dist/esm-browser/regex.js","webpack://fornac/./node_modules/uuid/dist/esm-browser/validate.js","webpack://fornac/./node_modules/uuid/dist/esm-browser/stringify.js","webpack://fornac/./node_modules/uuid/dist/esm-browser/v1.js","webpack://fornac/./node_modules/uuid/dist/esm-browser/parse.js","webpack://fornac/./node_modules/uuid/dist/esm-browser/v35.js","webpack://fornac/./node_modules/uuid/dist/esm-browser/md5.js","webpack://fornac/./node_modules/uuid/dist/esm-browser/v3.js","webpack://fornac/./node_modules/uuid/dist/esm-browser/v4.js","webpack://fornac/./node_modules/uuid/dist/esm-browser/sha1.js","webpack://fornac/./node_modules/uuid/dist/esm-browser/v5.js","webpack://fornac/./node_modules/uuid/dist/esm-browser/nil.js","webpack://fornac/./node_modules/uuid/dist/esm-browser/version.js","webpack://fornac/external umd \"d3\"","webpack://fornac/webpack/bootstrap","webpack://fornac/webpack/runtime/compat get default export","webpack://fornac/webpack/runtime/define property getters","webpack://fornac/webpack/runtime/global","webpack://fornac/webpack/runtime/hasOwnProperty shorthand","webpack://fornac/webpack/runtime/make namespace object","webpack://fornac/webpack/runtime/publicPath","webpack://fornac/./src/img/play.svg","webpack://fornac/./src/d3-context-menu.js","webpack://fornac/./src/rnautils.js","webpack://fornac/./src/rnagraph.js","webpack://fornac/./src/simplernaplot.js","webpack://fornac/./src/naview/radloop.js","webpack://fornac/./src/naview/base.js","webpack://fornac/./src/naview/naview.js","webpack://fornac/./src/fornac.js","webpack://fornac/./src/rnaplot.js","webpack://fornac/./src/rnatreemap.js"],"sourcesContent":["(function webpackUniversalModuleDefinition(root, factory) {\n\tif(typeof exports === 'object' && typeof module === 'object')\n\t\tmodule.exports = factory(require(\"d3\"));\n\telse if(typeof define === 'function' && define.amd)\n\t\tdefine([\"d3\"], factory);\n\telse if(typeof exports === 'object')\n\t\texports[\"fornac\"] = factory(require(\"d3\"));\n\telse\n\t\troot[\"fornac\"] = factory(root[\"d3\"]);\n})(self, (__WEBPACK_EXTERNAL_MODULE__893__) => {\nreturn ","import {Loop} from './loop.js';\nimport {Region} from './region.js';\n\nexport function Connection() {\n\tthis.loop = new Loop();\n\tthis.region = new Region();\n\t// Start and end form the 1st base pair of the region.\n\tthis.start = null;\n this.end = null;\n\tthis.xrad = null;\n this.yrad = null;\n this.angle = null;\n\t// True if segment between this connection and the\n\t// next must be extruded out of the circle\n\tthis.extruded = null;\n\t// True if the extruded segment must be drawn long.\n\tthis.broken = null;\n\n\tthis._isNull = false;\n}\n\nConnection.prototype.isNull = function(){\n\treturn this._isNull;\n}\n\nConnection.prototype.setNull = function(isNull){\n\tthis._isNull = isNull;\n}\n\nConnection.prototype.getLoop = function(){\n\treturn this.loop;\n}\n\nConnection.prototype.setLoop = function(loop) {\n\tthis.loop = loop;\n}\n\nConnection.prototype.getRegion = function(){\n\treturn this.region;\n}\n\nConnection.prototype.setRegion = function(region){\n\tthis.region = region;\n}\n\nConnection.prototype.getStart = function(){\n\treturn this.start;\n}\n\nConnection.prototype.setStart = function(start) {\n\tthis.start = start;\n}\n\nConnection.prototype.getEnd = function(){\n\treturn this.end;\n}\n\nConnection.prototype.setEnd = function(end){\n\tthis.end = end;\n}\n\nConnection.prototype.getXrad = function(){\n\treturn this.xrad;\n}\n\nConnection.prototype.setXrad = function(xrad){\n\tthis.xrad = xrad;\n}\n\nConnection.prototype.getYrad = function(){\n\treturn this.yrad;\n}\n\nConnection.prototype.setYrad = function(yrad) {\n\tthis.yrad = yrad;\n}\n\nConnection.prototype.getAngle = function(){\n\treturn this.angle;\n}\n\nConnection.prototype.setAngle = function(angle){\n\tthis.angle = angle;\n}\n\nConnection.prototype.isExtruded = function(){\n\treturn this.extruded;\n}\n\nConnection.prototype.setExtruded = function(extruded){\n\tthis.extruded = extruded;\n}\n\nConnection.prototype.isBroken = function(){\n\treturn this.broken;\n}\n\nConnection.prototype.setBroken = function(broken){\n\tthis.broken = broken;\n}\n","import {Connection} from './connection.js';\n\nexport function Loop() {\n\tthis.nconnection = null;\n\tthis.connections = [];\n\tthis._connections = [];\n\tthis.number = null;\n\tthis.depth = null;\n\tthis.mark = null;\n\tthis.x = null;\n this.y = null;\n this.radius = null;\n}\n\nLoop.prototype.getNconnection = function() {\n\treturn this.nconnection;\n}\n\nLoop.prototype.setNconnection = function(nconnection) {\n\tthis.nconnection = nconnection;\n}\n\nLoop.prototype.setConnection = function(i, c){\n\tif (c != null){\n\t\tthis._connections[i] = c;\n }\n\telse {\n\t\tif (!this._connections[i]){\n\t\t\tthis._connections[i] = new Connection();\n\t\t}\n\t\tthis._connections[i].setNull(true);\n\t}\n}\n\nLoop.prototype.getConnection = function(i){\n\tvar Connection = require(\"./connection\");\n\tif (!this._connections[i]){\n this._connections[i] = new Connection();\n }\n\tvar c = this._connections[i];\n\tif (c.isNull()){\n\t\treturn null;\n }\n\telse {\n\t\treturn c;\n }\n}\n\nLoop.prototype.addConnection = function(i, c){\n\tthis._connections.push(c);\n}\n\nLoop.prototype.getNumber = function(){\n\treturn this.number;\n}\n\nLoop.prototype.setNumber = function(number){\n\tthis.number = number;\n}\n\nLoop.prototype.getDepth = function(){\n\treturn this.depth;\n}\n\nLoop.prototype.setDepth = function(depth){\n\tthis.depth = depth;\n}\n\nLoop.prototype.isMark = function(){\n\treturn this.mark;\n}\n\nLoop.prototype.setMark = function(mark){\n\tthis.mark = mark;\n}\n\nLoop.prototype.getX = function(){\n\treturn this.x;\n}\n\nLoop.prototype.setX = function(x){\n\tthis.x = x;\n}\n\nLoop.prototype.getY = function(){\n\treturn this.y;\n}\n\nLoop.prototype.setY = function(y){\n\tthis.y = y;\n}\n\nLoop.prototype.getRadius = function(){\n\treturn this.radius;\n}\n\nLoop.prototype.setRadius = function(radius){\n\tthis.radius = radius;\n}\n","export function Region() {\n\tthis._start1 = null;\n this._end1 = null;\n this._start2 = null;\n this._end2 = null;\n}\n\nRegion.prototype.getStart1 = function(){\n\treturn this._start1;\n}\n\nRegion.prototype.setStart1 = function(start1){\n\tthis._start1 = start1;\n}\n\nRegion.prototype.getEnd1 = function(){\n\treturn this._end1;\n}\n\nRegion.prototype.setEnd1 = function(end1){\n\tthis._end1 = end1;\n}\n\nRegion.prototype.getStart2 = function(){\n\treturn this._start2;\n}\n\nRegion.prototype.setStart2 = function(start2){\n\tthis._start2 = start2;\n}\n\nRegion.prototype.getEnd2 = function(){\n\treturn this._end2;\n}\n\nRegion.prototype.setEnd2 = function(end2){\n\tthis._end2 = end2;\n}\n","'use strict'\n\nexports.byteLength = byteLength\nexports.toByteArray = toByteArray\nexports.fromByteArray = fromByteArray\n\nvar lookup = []\nvar revLookup = []\nvar Arr = typeof Uint8Array !== 'undefined' ? Uint8Array : Array\n\nvar code = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/'\nfor (var i = 0, len = code.length; i < len; ++i) {\n lookup[i] = code[i]\n revLookup[code.charCodeAt(i)] = i\n}\n\n// Support decoding URL-safe base64 strings, as Node.js does.\n// See: https://en.wikipedia.org/wiki/Base64#URL_applications\nrevLookup['-'.charCodeAt(0)] = 62\nrevLookup['_'.charCodeAt(0)] = 63\n\nfunction getLens (b64) {\n var len = b64.length\n\n if (len % 4 > 0) {\n throw new Error('Invalid string. Length must be a multiple of 4')\n }\n\n // Trim off extra bytes after placeholder bytes are found\n // See: https://github.com/beatgammit/base64-js/issues/42\n var validLen = b64.indexOf('=')\n if (validLen === -1) validLen = len\n\n var placeHoldersLen = validLen === len\n ? 0\n : 4 - (validLen % 4)\n\n return [validLen, placeHoldersLen]\n}\n\n// base64 is 4/3 + up to two characters of the original data\nfunction byteLength (b64) {\n var lens = getLens(b64)\n var validLen = lens[0]\n var placeHoldersLen = lens[1]\n return ((validLen + placeHoldersLen) * 3 / 4) - placeHoldersLen\n}\n\nfunction _byteLength (b64, validLen, placeHoldersLen) {\n return ((validLen + placeHoldersLen) * 3 / 4) - placeHoldersLen\n}\n\nfunction toByteArray (b64) {\n var tmp\n var lens = getLens(b64)\n var validLen = lens[0]\n var placeHoldersLen = lens[1]\n\n var arr = new Arr(_byteLength(b64, validLen, placeHoldersLen))\n\n var curByte = 0\n\n // if there are placeholders, only get up to the last complete 4 chars\n var len = placeHoldersLen > 0\n ? validLen - 4\n : validLen\n\n var i\n for (i = 0; i < len; i += 4) {\n tmp =\n (revLookup[b64.charCodeAt(i)] << 18) |\n (revLookup[b64.charCodeAt(i + 1)] << 12) |\n (revLookup[b64.charCodeAt(i + 2)] << 6) |\n revLookup[b64.charCodeAt(i + 3)]\n arr[curByte++] = (tmp >> 16) & 0xFF\n arr[curByte++] = (tmp >> 8) & 0xFF\n arr[curByte++] = tmp & 0xFF\n }\n\n if (placeHoldersLen === 2) {\n tmp =\n (revLookup[b64.charCodeAt(i)] << 2) |\n (revLookup[b64.charCodeAt(i + 1)] >> 4)\n arr[curByte++] = tmp & 0xFF\n }\n\n if (placeHoldersLen === 1) {\n tmp =\n (revLookup[b64.charCodeAt(i)] << 10) |\n (revLookup[b64.charCodeAt(i + 1)] << 4) |\n (revLookup[b64.charCodeAt(i + 2)] >> 2)\n arr[curByte++] = (tmp >> 8) & 0xFF\n arr[curByte++] = tmp & 0xFF\n }\n\n return arr\n}\n\nfunction tripletToBase64 (num) {\n return lookup[num >> 18 & 0x3F] +\n lookup[num >> 12 & 0x3F] +\n lookup[num >> 6 & 0x3F] +\n lookup[num & 0x3F]\n}\n\nfunction encodeChunk (uint8, start, end) {\n var tmp\n var output = []\n for (var i = start; i < end; i += 3) {\n tmp =\n ((uint8[i] << 16) & 0xFF0000) +\n ((uint8[i + 1] << 8) & 0xFF00) +\n (uint8[i + 2] & 0xFF)\n output.push(tripletToBase64(tmp))\n }\n return output.join('')\n}\n\nfunction fromByteArray (uint8) {\n var tmp\n var len = uint8.length\n var extraBytes = len % 3 // if we have 1 byte left, pad 2 bytes\n var parts = []\n var maxChunkLength = 16383 // must be multiple of 3\n\n // go through the array every three bytes, we'll deal with trailing stuff later\n for (var i = 0, len2 = len - extraBytes; i < len2; i += maxChunkLength) {\n parts.push(encodeChunk(uint8, i, (i + maxChunkLength) > len2 ? len2 : (i + maxChunkLength)))\n }\n\n // pad the end with zeros, but make sure to not forget the extra bytes\n if (extraBytes === 1) {\n tmp = uint8[len - 1]\n parts.push(\n lookup[tmp >> 2] +\n lookup[(tmp << 4) & 0x3F] +\n '=='\n )\n } else if (extraBytes === 2) {\n tmp = (uint8[len - 2] << 8) + uint8[len - 1]\n parts.push(\n lookup[tmp >> 10] +\n lookup[(tmp >> 4) & 0x3F] +\n lookup[(tmp << 2) & 0x3F] +\n '='\n )\n }\n\n return parts.join('')\n}\n","/*!\n * The buffer module from node.js, for the browser.\n *\n * @author Feross Aboukhadijeh \n * @license MIT\n */\n/* eslint-disable no-proto */\n\n'use strict'\n\nconst base64 = require('base64-js')\nconst ieee754 = require('ieee754')\nconst customInspectSymbol =\n (typeof Symbol === 'function' && typeof Symbol['for'] === 'function') // eslint-disable-line dot-notation\n ? Symbol['for']('nodejs.util.inspect.custom') // eslint-disable-line dot-notation\n : null\n\nexports.Buffer = Buffer\nexports.SlowBuffer = SlowBuffer\nexports.INSPECT_MAX_BYTES = 50\n\nconst K_MAX_LENGTH = 0x7fffffff\nexports.kMaxLength = K_MAX_LENGTH\n\n/**\n * If `Buffer.TYPED_ARRAY_SUPPORT`:\n * === true Use Uint8Array implementation (fastest)\n * === false Print warning and recommend using `buffer` v4.x which has an Object\n * implementation (most compatible, even IE6)\n *\n * Browsers that support typed arrays are IE 10+, Firefox 4+, Chrome 7+, Safari 5.1+,\n * Opera 11.6+, iOS 4.2+.\n *\n * We report that the browser does not support typed arrays if the are not subclassable\n * using __proto__. Firefox 4-29 lacks support for adding new properties to `Uint8Array`\n * (See: https://bugzilla.mozilla.org/show_bug.cgi?id=695438). IE 10 lacks support\n * for __proto__ and has a buggy typed array implementation.\n */\nBuffer.TYPED_ARRAY_SUPPORT = typedArraySupport()\n\nif (!Buffer.TYPED_ARRAY_SUPPORT && typeof console !== 'undefined' &&\n typeof console.error === 'function') {\n console.error(\n 'This browser lacks typed array (Uint8Array) support which is required by ' +\n '`buffer` v5.x. Use `buffer` v4.x if you require old browser support.'\n )\n}\n\nfunction typedArraySupport () {\n // Can typed array instances can be augmented?\n try {\n const arr = new Uint8Array(1)\n const proto = { foo: function () { return 42 } }\n Object.setPrototypeOf(proto, Uint8Array.prototype)\n Object.setPrototypeOf(arr, proto)\n return arr.foo() === 42\n } catch (e) {\n return false\n }\n}\n\nObject.defineProperty(Buffer.prototype, 'parent', {\n enumerable: true,\n get: function () {\n if (!Buffer.isBuffer(this)) return undefined\n return this.buffer\n }\n})\n\nObject.defineProperty(Buffer.prototype, 'offset', {\n enumerable: true,\n get: function () {\n if (!Buffer.isBuffer(this)) return undefined\n return this.byteOffset\n }\n})\n\nfunction createBuffer (length) {\n if (length > K_MAX_LENGTH) {\n throw new RangeError('The value \"' + length + '\" is invalid for option \"size\"')\n }\n // Return an augmented `Uint8Array` instance\n const buf = new Uint8Array(length)\n Object.setPrototypeOf(buf, Buffer.prototype)\n return buf\n}\n\n/**\n * The Buffer constructor returns instances of `Uint8Array` that have their\n * prototype changed to `Buffer.prototype`. Furthermore, `Buffer` is a subclass of\n * `Uint8Array`, so the returned instances will have all the node `Buffer` methods\n * and the `Uint8Array` methods. Square bracket notation works as expected -- it\n * returns a single octet.\n *\n * The `Uint8Array` prototype remains unmodified.\n */\n\nfunction Buffer (arg, encodingOrOffset, length) {\n // Common case.\n if (typeof arg === 'number') {\n if (typeof encodingOrOffset === 'string') {\n throw new TypeError(\n 'The \"string\" argument must be of type string. Received type number'\n )\n }\n return allocUnsafe(arg)\n }\n return from(arg, encodingOrOffset, length)\n}\n\nBuffer.poolSize = 8192 // not used by this implementation\n\nfunction from (value, encodingOrOffset, length) {\n if (typeof value === 'string') {\n return fromString(value, encodingOrOffset)\n }\n\n if (ArrayBuffer.isView(value)) {\n return fromArrayView(value)\n }\n\n if (value == null) {\n throw new TypeError(\n 'The first argument must be one of type string, Buffer, ArrayBuffer, Array, ' +\n 'or Array-like Object. Received type ' + (typeof value)\n )\n }\n\n if (isInstance(value, ArrayBuffer) ||\n (value && isInstance(value.buffer, ArrayBuffer))) {\n return fromArrayBuffer(value, encodingOrOffset, length)\n }\n\n if (typeof SharedArrayBuffer !== 'undefined' &&\n (isInstance(value, SharedArrayBuffer) ||\n (value && isInstance(value.buffer, SharedArrayBuffer)))) {\n return fromArrayBuffer(value, encodingOrOffset, length)\n }\n\n if (typeof value === 'number') {\n throw new TypeError(\n 'The \"value\" argument must not be of type number. Received type number'\n )\n }\n\n const valueOf = value.valueOf && value.valueOf()\n if (valueOf != null && valueOf !== value) {\n return Buffer.from(valueOf, encodingOrOffset, length)\n }\n\n const b = fromObject(value)\n if (b) return b\n\n if (typeof Symbol !== 'undefined' && Symbol.toPrimitive != null &&\n typeof value[Symbol.toPrimitive] === 'function') {\n return Buffer.from(value[Symbol.toPrimitive]('string'), encodingOrOffset, length)\n }\n\n throw new TypeError(\n 'The first argument must be one of type string, Buffer, ArrayBuffer, Array, ' +\n 'or Array-like Object. Received type ' + (typeof value)\n )\n}\n\n/**\n * Functionally equivalent to Buffer(arg, encoding) but throws a TypeError\n * if value is a number.\n * Buffer.from(str[, encoding])\n * Buffer.from(array)\n * Buffer.from(buffer)\n * Buffer.from(arrayBuffer[, byteOffset[, length]])\n **/\nBuffer.from = function (value, encodingOrOffset, length) {\n return from(value, encodingOrOffset, length)\n}\n\n// Note: Change prototype *after* Buffer.from is defined to workaround Chrome bug:\n// https://github.com/feross/buffer/pull/148\nObject.setPrototypeOf(Buffer.prototype, Uint8Array.prototype)\nObject.setPrototypeOf(Buffer, Uint8Array)\n\nfunction assertSize (size) {\n if (typeof size !== 'number') {\n throw new TypeError('\"size\" argument must be of type number')\n } else if (size < 0) {\n throw new RangeError('The value \"' + size + '\" is invalid for option \"size\"')\n }\n}\n\nfunction alloc (size, fill, encoding) {\n assertSize(size)\n if (size <= 0) {\n return createBuffer(size)\n }\n if (fill !== undefined) {\n // Only pay attention to encoding if it's a string. This\n // prevents accidentally sending in a number that would\n // be interpreted as a start offset.\n return typeof encoding === 'string'\n ? createBuffer(size).fill(fill, encoding)\n : createBuffer(size).fill(fill)\n }\n return createBuffer(size)\n}\n\n/**\n * Creates a new filled Buffer instance.\n * alloc(size[, fill[, encoding]])\n **/\nBuffer.alloc = function (size, fill, encoding) {\n return alloc(size, fill, encoding)\n}\n\nfunction allocUnsafe (size) {\n assertSize(size)\n return createBuffer(size < 0 ? 0 : checked(size) | 0)\n}\n\n/**\n * Equivalent to Buffer(num), by default creates a non-zero-filled Buffer instance.\n * */\nBuffer.allocUnsafe = function (size) {\n return allocUnsafe(size)\n}\n/**\n * Equivalent to SlowBuffer(num), by default creates a non-zero-filled Buffer instance.\n */\nBuffer.allocUnsafeSlow = function (size) {\n return allocUnsafe(size)\n}\n\nfunction fromString (string, encoding) {\n if (typeof encoding !== 'string' || encoding === '') {\n encoding = 'utf8'\n }\n\n if (!Buffer.isEncoding(encoding)) {\n throw new TypeError('Unknown encoding: ' + encoding)\n }\n\n const length = byteLength(string, encoding) | 0\n let buf = createBuffer(length)\n\n const actual = buf.write(string, encoding)\n\n if (actual !== length) {\n // Writing a hex string, for example, that contains invalid characters will\n // cause everything after the first invalid character to be ignored. (e.g.\n // 'abxxcd' will be treated as 'ab')\n buf = buf.slice(0, actual)\n }\n\n return buf\n}\n\nfunction fromArrayLike (array) {\n const length = array.length < 0 ? 0 : checked(array.length) | 0\n const buf = createBuffer(length)\n for (let i = 0; i < length; i += 1) {\n buf[i] = array[i] & 255\n }\n return buf\n}\n\nfunction fromArrayView (arrayView) {\n if (isInstance(arrayView, Uint8Array)) {\n const copy = new Uint8Array(arrayView)\n return fromArrayBuffer(copy.buffer, copy.byteOffset, copy.byteLength)\n }\n return fromArrayLike(arrayView)\n}\n\nfunction fromArrayBuffer (array, byteOffset, length) {\n if (byteOffset < 0 || array.byteLength < byteOffset) {\n throw new RangeError('\"offset\" is outside of buffer bounds')\n }\n\n if (array.byteLength < byteOffset + (length || 0)) {\n throw new RangeError('\"length\" is outside of buffer bounds')\n }\n\n let buf\n if (byteOffset === undefined && length === undefined) {\n buf = new Uint8Array(array)\n } else if (length === undefined) {\n buf = new Uint8Array(array, byteOffset)\n } else {\n buf = new Uint8Array(array, byteOffset, length)\n }\n\n // Return an augmented `Uint8Array` instance\n Object.setPrototypeOf(buf, Buffer.prototype)\n\n return buf\n}\n\nfunction fromObject (obj) {\n if (Buffer.isBuffer(obj)) {\n const len = checked(obj.length) | 0\n const buf = createBuffer(len)\n\n if (buf.length === 0) {\n return buf\n }\n\n obj.copy(buf, 0, 0, len)\n return buf\n }\n\n if (obj.length !== undefined) {\n if (typeof obj.length !== 'number' || numberIsNaN(obj.length)) {\n return createBuffer(0)\n }\n return fromArrayLike(obj)\n }\n\n if (obj.type === 'Buffer' && Array.isArray(obj.data)) {\n return fromArrayLike(obj.data)\n }\n}\n\nfunction checked (length) {\n // Note: cannot use `length < K_MAX_LENGTH` here because that fails when\n // length is NaN (which is otherwise coerced to zero.)\n if (length >= K_MAX_LENGTH) {\n throw new RangeError('Attempt to allocate Buffer larger than maximum ' +\n 'size: 0x' + K_MAX_LENGTH.toString(16) + ' bytes')\n }\n return length | 0\n}\n\nfunction SlowBuffer (length) {\n if (+length != length) { // eslint-disable-line eqeqeq\n length = 0\n }\n return Buffer.alloc(+length)\n}\n\nBuffer.isBuffer = function isBuffer (b) {\n return b != null && b._isBuffer === true &&\n b !== Buffer.prototype // so Buffer.isBuffer(Buffer.prototype) will be false\n}\n\nBuffer.compare = function compare (a, b) {\n if (isInstance(a, Uint8Array)) a = Buffer.from(a, a.offset, a.byteLength)\n if (isInstance(b, Uint8Array)) b = Buffer.from(b, b.offset, b.byteLength)\n if (!Buffer.isBuffer(a) || !Buffer.isBuffer(b)) {\n throw new TypeError(\n 'The \"buf1\", \"buf2\" arguments must be one of type Buffer or Uint8Array'\n )\n }\n\n if (a === b) return 0\n\n let x = a.length\n let y = b.length\n\n for (let i = 0, len = Math.min(x, y); i < len; ++i) {\n if (a[i] !== b[i]) {\n x = a[i]\n y = b[i]\n break\n }\n }\n\n if (x < y) return -1\n if (y < x) return 1\n return 0\n}\n\nBuffer.isEncoding = function isEncoding (encoding) {\n switch (String(encoding).toLowerCase()) {\n case 'hex':\n case 'utf8':\n case 'utf-8':\n case 'ascii':\n case 'latin1':\n case 'binary':\n case 'base64':\n case 'ucs2':\n case 'ucs-2':\n case 'utf16le':\n case 'utf-16le':\n return true\n default:\n return false\n }\n}\n\nBuffer.concat = function concat (list, length) {\n if (!Array.isArray(list)) {\n throw new TypeError('\"list\" argument must be an Array of Buffers')\n }\n\n if (list.length === 0) {\n return Buffer.alloc(0)\n }\n\n let i\n if (length === undefined) {\n length = 0\n for (i = 0; i < list.length; ++i) {\n length += list[i].length\n }\n }\n\n const buffer = Buffer.allocUnsafe(length)\n let pos = 0\n for (i = 0; i < list.length; ++i) {\n let buf = list[i]\n if (isInstance(buf, Uint8Array)) {\n if (pos + buf.length > buffer.length) {\n if (!Buffer.isBuffer(buf)) buf = Buffer.from(buf)\n buf.copy(buffer, pos)\n } else {\n Uint8Array.prototype.set.call(\n buffer,\n buf,\n pos\n )\n }\n } else if (!Buffer.isBuffer(buf)) {\n throw new TypeError('\"list\" argument must be an Array of Buffers')\n } else {\n buf.copy(buffer, pos)\n }\n pos += buf.length\n }\n return buffer\n}\n\nfunction byteLength (string, encoding) {\n if (Buffer.isBuffer(string)) {\n return string.length\n }\n if (ArrayBuffer.isView(string) || isInstance(string, ArrayBuffer)) {\n return string.byteLength\n }\n if (typeof string !== 'string') {\n throw new TypeError(\n 'The \"string\" argument must be one of type string, Buffer, or ArrayBuffer. ' +\n 'Received type ' + typeof string\n )\n }\n\n const len = string.length\n const mustMatch = (arguments.length > 2 && arguments[2] === true)\n if (!mustMatch && len === 0) return 0\n\n // Use a for loop to avoid recursion\n let loweredCase = false\n for (;;) {\n switch (encoding) {\n case 'ascii':\n case 'latin1':\n case 'binary':\n return len\n case 'utf8':\n case 'utf-8':\n return utf8ToBytes(string).length\n case 'ucs2':\n case 'ucs-2':\n case 'utf16le':\n case 'utf-16le':\n return len * 2\n case 'hex':\n return len >>> 1\n case 'base64':\n return base64ToBytes(string).length\n default:\n if (loweredCase) {\n return mustMatch ? -1 : utf8ToBytes(string).length // assume utf8\n }\n encoding = ('' + encoding).toLowerCase()\n loweredCase = true\n }\n }\n}\nBuffer.byteLength = byteLength\n\nfunction slowToString (encoding, start, end) {\n let loweredCase = false\n\n // No need to verify that \"this.length <= MAX_UINT32\" since it's a read-only\n // property of a typed array.\n\n // This behaves neither like String nor Uint8Array in that we set start/end\n // to their upper/lower bounds if the value passed is out of range.\n // undefined is handled specially as per ECMA-262 6th Edition,\n // Section 13.3.3.7 Runtime Semantics: KeyedBindingInitialization.\n if (start === undefined || start < 0) {\n start = 0\n }\n // Return early if start > this.length. Done here to prevent potential uint32\n // coercion fail below.\n if (start > this.length) {\n return ''\n }\n\n if (end === undefined || end > this.length) {\n end = this.length\n }\n\n if (end <= 0) {\n return ''\n }\n\n // Force coercion to uint32. This will also coerce falsey/NaN values to 0.\n end >>>= 0\n start >>>= 0\n\n if (end <= start) {\n return ''\n }\n\n if (!encoding) encoding = 'utf8'\n\n while (true) {\n switch (encoding) {\n case 'hex':\n return hexSlice(this, start, end)\n\n case 'utf8':\n case 'utf-8':\n return utf8Slice(this, start, end)\n\n case 'ascii':\n return asciiSlice(this, start, end)\n\n case 'latin1':\n case 'binary':\n return latin1Slice(this, start, end)\n\n case 'base64':\n return base64Slice(this, start, end)\n\n case 'ucs2':\n case 'ucs-2':\n case 'utf16le':\n case 'utf-16le':\n return utf16leSlice(this, start, end)\n\n default:\n if (loweredCase) throw new TypeError('Unknown encoding: ' + encoding)\n encoding = (encoding + '').toLowerCase()\n loweredCase = true\n }\n }\n}\n\n// This property is used by `Buffer.isBuffer` (and the `is-buffer` npm package)\n// to detect a Buffer instance. It's not possible to use `instanceof Buffer`\n// reliably in a browserify context because there could be multiple different\n// copies of the 'buffer' package in use. This method works even for Buffer\n// instances that were created from another copy of the `buffer` package.\n// See: https://github.com/feross/buffer/issues/154\nBuffer.prototype._isBuffer = true\n\nfunction swap (b, n, m) {\n const i = b[n]\n b[n] = b[m]\n b[m] = i\n}\n\nBuffer.prototype.swap16 = function swap16 () {\n const len = this.length\n if (len % 2 !== 0) {\n throw new RangeError('Buffer size must be a multiple of 16-bits')\n }\n for (let i = 0; i < len; i += 2) {\n swap(this, i, i + 1)\n }\n return this\n}\n\nBuffer.prototype.swap32 = function swap32 () {\n const len = this.length\n if (len % 4 !== 0) {\n throw new RangeError('Buffer size must be a multiple of 32-bits')\n }\n for (let i = 0; i < len; i += 4) {\n swap(this, i, i + 3)\n swap(this, i + 1, i + 2)\n }\n return this\n}\n\nBuffer.prototype.swap64 = function swap64 () {\n const len = this.length\n if (len % 8 !== 0) {\n throw new RangeError('Buffer size must be a multiple of 64-bits')\n }\n for (let i = 0; i < len; i += 8) {\n swap(this, i, i + 7)\n swap(this, i + 1, i + 6)\n swap(this, i + 2, i + 5)\n swap(this, i + 3, i + 4)\n }\n return this\n}\n\nBuffer.prototype.toString = function toString () {\n const length = this.length\n if (length === 0) return ''\n if (arguments.length === 0) return utf8Slice(this, 0, length)\n return slowToString.apply(this, arguments)\n}\n\nBuffer.prototype.toLocaleString = Buffer.prototype.toString\n\nBuffer.prototype.equals = function equals (b) {\n if (!Buffer.isBuffer(b)) throw new TypeError('Argument must be a Buffer')\n if (this === b) return true\n return Buffer.compare(this, b) === 0\n}\n\nBuffer.prototype.inspect = function inspect () {\n let str = ''\n const max = exports.INSPECT_MAX_BYTES\n str = this.toString('hex', 0, max).replace(/(.{2})/g, '$1 ').trim()\n if (this.length > max) str += ' ... '\n return ''\n}\nif (customInspectSymbol) {\n Buffer.prototype[customInspectSymbol] = Buffer.prototype.inspect\n}\n\nBuffer.prototype.compare = function compare (target, start, end, thisStart, thisEnd) {\n if (isInstance(target, Uint8Array)) {\n target = Buffer.from(target, target.offset, target.byteLength)\n }\n if (!Buffer.isBuffer(target)) {\n throw new TypeError(\n 'The \"target\" argument must be one of type Buffer or Uint8Array. ' +\n 'Received type ' + (typeof target)\n )\n }\n\n if (start === undefined) {\n start = 0\n }\n if (end === undefined) {\n end = target ? target.length : 0\n }\n if (thisStart === undefined) {\n thisStart = 0\n }\n if (thisEnd === undefined) {\n thisEnd = this.length\n }\n\n if (start < 0 || end > target.length || thisStart < 0 || thisEnd > this.length) {\n throw new RangeError('out of range index')\n }\n\n if (thisStart >= thisEnd && start >= end) {\n return 0\n }\n if (thisStart >= thisEnd) {\n return -1\n }\n if (start >= end) {\n return 1\n }\n\n start >>>= 0\n end >>>= 0\n thisStart >>>= 0\n thisEnd >>>= 0\n\n if (this === target) return 0\n\n let x = thisEnd - thisStart\n let y = end - start\n const len = Math.min(x, y)\n\n const thisCopy = this.slice(thisStart, thisEnd)\n const targetCopy = target.slice(start, end)\n\n for (let i = 0; i < len; ++i) {\n if (thisCopy[i] !== targetCopy[i]) {\n x = thisCopy[i]\n y = targetCopy[i]\n break\n }\n }\n\n if (x < y) return -1\n if (y < x) return 1\n return 0\n}\n\n// Finds either the first index of `val` in `buffer` at offset >= `byteOffset`,\n// OR the last index of `val` in `buffer` at offset <= `byteOffset`.\n//\n// Arguments:\n// - buffer - a Buffer to search\n// - val - a string, Buffer, or number\n// - byteOffset - an index into `buffer`; will be clamped to an int32\n// - encoding - an optional encoding, relevant is val is a string\n// - dir - true for indexOf, false for lastIndexOf\nfunction bidirectionalIndexOf (buffer, val, byteOffset, encoding, dir) {\n // Empty buffer means no match\n if (buffer.length === 0) return -1\n\n // Normalize byteOffset\n if (typeof byteOffset === 'string') {\n encoding = byteOffset\n byteOffset = 0\n } else if (byteOffset > 0x7fffffff) {\n byteOffset = 0x7fffffff\n } else if (byteOffset < -0x80000000) {\n byteOffset = -0x80000000\n }\n byteOffset = +byteOffset // Coerce to Number.\n if (numberIsNaN(byteOffset)) {\n // byteOffset: it it's undefined, null, NaN, \"foo\", etc, search whole buffer\n byteOffset = dir ? 0 : (buffer.length - 1)\n }\n\n // Normalize byteOffset: negative offsets start from the end of the buffer\n if (byteOffset < 0) byteOffset = buffer.length + byteOffset\n if (byteOffset >= buffer.length) {\n if (dir) return -1\n else byteOffset = buffer.length - 1\n } else if (byteOffset < 0) {\n if (dir) byteOffset = 0\n else return -1\n }\n\n // Normalize val\n if (typeof val === 'string') {\n val = Buffer.from(val, encoding)\n }\n\n // Finally, search either indexOf (if dir is true) or lastIndexOf\n if (Buffer.isBuffer(val)) {\n // Special case: looking for empty string/buffer always fails\n if (val.length === 0) {\n return -1\n }\n return arrayIndexOf(buffer, val, byteOffset, encoding, dir)\n } else if (typeof val === 'number') {\n val = val & 0xFF // Search for a byte value [0-255]\n if (typeof Uint8Array.prototype.indexOf === 'function') {\n if (dir) {\n return Uint8Array.prototype.indexOf.call(buffer, val, byteOffset)\n } else {\n return Uint8Array.prototype.lastIndexOf.call(buffer, val, byteOffset)\n }\n }\n return arrayIndexOf(buffer, [val], byteOffset, encoding, dir)\n }\n\n throw new TypeError('val must be string, number or Buffer')\n}\n\nfunction arrayIndexOf (arr, val, byteOffset, encoding, dir) {\n let indexSize = 1\n let arrLength = arr.length\n let valLength = val.length\n\n if (encoding !== undefined) {\n encoding = String(encoding).toLowerCase()\n if (encoding === 'ucs2' || encoding === 'ucs-2' ||\n encoding === 'utf16le' || encoding === 'utf-16le') {\n if (arr.length < 2 || val.length < 2) {\n return -1\n }\n indexSize = 2\n arrLength /= 2\n valLength /= 2\n byteOffset /= 2\n }\n }\n\n function read (buf, i) {\n if (indexSize === 1) {\n return buf[i]\n } else {\n return buf.readUInt16BE(i * indexSize)\n }\n }\n\n let i\n if (dir) {\n let foundIndex = -1\n for (i = byteOffset; i < arrLength; i++) {\n if (read(arr, i) === read(val, foundIndex === -1 ? 0 : i - foundIndex)) {\n if (foundIndex === -1) foundIndex = i\n if (i - foundIndex + 1 === valLength) return foundIndex * indexSize\n } else {\n if (foundIndex !== -1) i -= i - foundIndex\n foundIndex = -1\n }\n }\n } else {\n if (byteOffset + valLength > arrLength) byteOffset = arrLength - valLength\n for (i = byteOffset; i >= 0; i--) {\n let found = true\n for (let j = 0; j < valLength; j++) {\n if (read(arr, i + j) !== read(val, j)) {\n found = false\n break\n }\n }\n if (found) return i\n }\n }\n\n return -1\n}\n\nBuffer.prototype.includes = function includes (val, byteOffset, encoding) {\n return this.indexOf(val, byteOffset, encoding) !== -1\n}\n\nBuffer.prototype.indexOf = function indexOf (val, byteOffset, encoding) {\n return bidirectionalIndexOf(this, val, byteOffset, encoding, true)\n}\n\nBuffer.prototype.lastIndexOf = function lastIndexOf (val, byteOffset, encoding) {\n return bidirectionalIndexOf(this, val, byteOffset, encoding, false)\n}\n\nfunction hexWrite (buf, string, offset, length) {\n offset = Number(offset) || 0\n const remaining = buf.length - offset\n if (!length) {\n length = remaining\n } else {\n length = Number(length)\n if (length > remaining) {\n length = remaining\n }\n }\n\n const strLen = string.length\n\n if (length > strLen / 2) {\n length = strLen / 2\n }\n let i\n for (i = 0; i < length; ++i) {\n const parsed = parseInt(string.substr(i * 2, 2), 16)\n if (numberIsNaN(parsed)) return i\n buf[offset + i] = parsed\n }\n return i\n}\n\nfunction utf8Write (buf, string, offset, length) {\n return blitBuffer(utf8ToBytes(string, buf.length - offset), buf, offset, length)\n}\n\nfunction asciiWrite (buf, string, offset, length) {\n return blitBuffer(asciiToBytes(string), buf, offset, length)\n}\n\nfunction base64Write (buf, string, offset, length) {\n return blitBuffer(base64ToBytes(string), buf, offset, length)\n}\n\nfunction ucs2Write (buf, string, offset, length) {\n return blitBuffer(utf16leToBytes(string, buf.length - offset), buf, offset, length)\n}\n\nBuffer.prototype.write = function write (string, offset, length, encoding) {\n // Buffer#write(string)\n if (offset === undefined) {\n encoding = 'utf8'\n length = this.length\n offset = 0\n // Buffer#write(string, encoding)\n } else if (length === undefined && typeof offset === 'string') {\n encoding = offset\n length = this.length\n offset = 0\n // Buffer#write(string, offset[, length][, encoding])\n } else if (isFinite(offset)) {\n offset = offset >>> 0\n if (isFinite(length)) {\n length = length >>> 0\n if (encoding === undefined) encoding = 'utf8'\n } else {\n encoding = length\n length = undefined\n }\n } else {\n throw new Error(\n 'Buffer.write(string, encoding, offset[, length]) is no longer supported'\n )\n }\n\n const remaining = this.length - offset\n if (length === undefined || length > remaining) length = remaining\n\n if ((string.length > 0 && (length < 0 || offset < 0)) || offset > this.length) {\n throw new RangeError('Attempt to write outside buffer bounds')\n }\n\n if (!encoding) encoding = 'utf8'\n\n let loweredCase = false\n for (;;) {\n switch (encoding) {\n case 'hex':\n return hexWrite(this, string, offset, length)\n\n case 'utf8':\n case 'utf-8':\n return utf8Write(this, string, offset, length)\n\n case 'ascii':\n case 'latin1':\n case 'binary':\n return asciiWrite(this, string, offset, length)\n\n case 'base64':\n // Warning: maxLength not taken into account in base64Write\n return base64Write(this, string, offset, length)\n\n case 'ucs2':\n case 'ucs-2':\n case 'utf16le':\n case 'utf-16le':\n return ucs2Write(this, string, offset, length)\n\n default:\n if (loweredCase) throw new TypeError('Unknown encoding: ' + encoding)\n encoding = ('' + encoding).toLowerCase()\n loweredCase = true\n }\n }\n}\n\nBuffer.prototype.toJSON = function toJSON () {\n return {\n type: 'Buffer',\n data: Array.prototype.slice.call(this._arr || this, 0)\n }\n}\n\nfunction base64Slice (buf, start, end) {\n if (start === 0 && end === buf.length) {\n return base64.fromByteArray(buf)\n } else {\n return base64.fromByteArray(buf.slice(start, end))\n }\n}\n\nfunction utf8Slice (buf, start, end) {\n end = Math.min(buf.length, end)\n const res = []\n\n let i = start\n while (i < end) {\n const firstByte = buf[i]\n let codePoint = null\n let bytesPerSequence = (firstByte > 0xEF)\n ? 4\n : (firstByte > 0xDF)\n ? 3\n : (firstByte > 0xBF)\n ? 2\n : 1\n\n if (i + bytesPerSequence <= end) {\n let secondByte, thirdByte, fourthByte, tempCodePoint\n\n switch (bytesPerSequence) {\n case 1:\n if (firstByte < 0x80) {\n codePoint = firstByte\n }\n break\n case 2:\n secondByte = buf[i + 1]\n if ((secondByte & 0xC0) === 0x80) {\n tempCodePoint = (firstByte & 0x1F) << 0x6 | (secondByte & 0x3F)\n if (tempCodePoint > 0x7F) {\n codePoint = tempCodePoint\n }\n }\n break\n case 3:\n secondByte = buf[i + 1]\n thirdByte = buf[i + 2]\n if ((secondByte & 0xC0) === 0x80 && (thirdByte & 0xC0) === 0x80) {\n tempCodePoint = (firstByte & 0xF) << 0xC | (secondByte & 0x3F) << 0x6 | (thirdByte & 0x3F)\n if (tempCodePoint > 0x7FF && (tempCodePoint < 0xD800 || tempCodePoint > 0xDFFF)) {\n codePoint = tempCodePoint\n }\n }\n break\n case 4:\n secondByte = buf[i + 1]\n thirdByte = buf[i + 2]\n fourthByte = buf[i + 3]\n if ((secondByte & 0xC0) === 0x80 && (thirdByte & 0xC0) === 0x80 && (fourthByte & 0xC0) === 0x80) {\n tempCodePoint = (firstByte & 0xF) << 0x12 | (secondByte & 0x3F) << 0xC | (thirdByte & 0x3F) << 0x6 | (fourthByte & 0x3F)\n if (tempCodePoint > 0xFFFF && tempCodePoint < 0x110000) {\n codePoint = tempCodePoint\n }\n }\n }\n }\n\n if (codePoint === null) {\n // we did not generate a valid codePoint so insert a\n // replacement char (U+FFFD) and advance only 1 byte\n codePoint = 0xFFFD\n bytesPerSequence = 1\n } else if (codePoint > 0xFFFF) {\n // encode to utf16 (surrogate pair dance)\n codePoint -= 0x10000\n res.push(codePoint >>> 10 & 0x3FF | 0xD800)\n codePoint = 0xDC00 | codePoint & 0x3FF\n }\n\n res.push(codePoint)\n i += bytesPerSequence\n }\n\n return decodeCodePointsArray(res)\n}\n\n// Based on http://stackoverflow.com/a/22747272/680742, the browser with\n// the lowest limit is Chrome, with 0x10000 args.\n// We go 1 magnitude less, for safety\nconst MAX_ARGUMENTS_LENGTH = 0x1000\n\nfunction decodeCodePointsArray (codePoints) {\n const len = codePoints.length\n if (len <= MAX_ARGUMENTS_LENGTH) {\n return String.fromCharCode.apply(String, codePoints) // avoid extra slice()\n }\n\n // Decode in chunks to avoid \"call stack size exceeded\".\n let res = ''\n let i = 0\n while (i < len) {\n res += String.fromCharCode.apply(\n String,\n codePoints.slice(i, i += MAX_ARGUMENTS_LENGTH)\n )\n }\n return res\n}\n\nfunction asciiSlice (buf, start, end) {\n let ret = ''\n end = Math.min(buf.length, end)\n\n for (let i = start; i < end; ++i) {\n ret += String.fromCharCode(buf[i] & 0x7F)\n }\n return ret\n}\n\nfunction latin1Slice (buf, start, end) {\n let ret = ''\n end = Math.min(buf.length, end)\n\n for (let i = start; i < end; ++i) {\n ret += String.fromCharCode(buf[i])\n }\n return ret\n}\n\nfunction hexSlice (buf, start, end) {\n const len = buf.length\n\n if (!start || start < 0) start = 0\n if (!end || end < 0 || end > len) end = len\n\n let out = ''\n for (let i = start; i < end; ++i) {\n out += hexSliceLookupTable[buf[i]]\n }\n return out\n}\n\nfunction utf16leSlice (buf, start, end) {\n const bytes = buf.slice(start, end)\n let res = ''\n // If bytes.length is odd, the last 8 bits must be ignored (same as node.js)\n for (let i = 0; i < bytes.length - 1; i += 2) {\n res += String.fromCharCode(bytes[i] + (bytes[i + 1] * 256))\n }\n return res\n}\n\nBuffer.prototype.slice = function slice (start, end) {\n const len = this.length\n start = ~~start\n end = end === undefined ? len : ~~end\n\n if (start < 0) {\n start += len\n if (start < 0) start = 0\n } else if (start > len) {\n start = len\n }\n\n if (end < 0) {\n end += len\n if (end < 0) end = 0\n } else if (end > len) {\n end = len\n }\n\n if (end < start) end = start\n\n const newBuf = this.subarray(start, end)\n // Return an augmented `Uint8Array` instance\n Object.setPrototypeOf(newBuf, Buffer.prototype)\n\n return newBuf\n}\n\n/*\n * Need to make sure that buffer isn't trying to write out of bounds.\n */\nfunction checkOffset (offset, ext, length) {\n if ((offset % 1) !== 0 || offset < 0) throw new RangeError('offset is not uint')\n if (offset + ext > length) throw new RangeError('Trying to access beyond buffer length')\n}\n\nBuffer.prototype.readUintLE =\nBuffer.prototype.readUIntLE = function readUIntLE (offset, byteLength, noAssert) {\n offset = offset >>> 0\n byteLength = byteLength >>> 0\n if (!noAssert) checkOffset(offset, byteLength, this.length)\n\n let val = this[offset]\n let mul = 1\n let i = 0\n while (++i < byteLength && (mul *= 0x100)) {\n val += this[offset + i] * mul\n }\n\n return val\n}\n\nBuffer.prototype.readUintBE =\nBuffer.prototype.readUIntBE = function readUIntBE (offset, byteLength, noAssert) {\n offset = offset >>> 0\n byteLength = byteLength >>> 0\n if (!noAssert) {\n checkOffset(offset, byteLength, this.length)\n }\n\n let val = this[offset + --byteLength]\n let mul = 1\n while (byteLength > 0 && (mul *= 0x100)) {\n val += this[offset + --byteLength] * mul\n }\n\n return val\n}\n\nBuffer.prototype.readUint8 =\nBuffer.prototype.readUInt8 = function readUInt8 (offset, noAssert) {\n offset = offset >>> 0\n if (!noAssert) checkOffset(offset, 1, this.length)\n return this[offset]\n}\n\nBuffer.prototype.readUint16LE =\nBuffer.prototype.readUInt16LE = function readUInt16LE (offset, noAssert) {\n offset = offset >>> 0\n if (!noAssert) checkOffset(offset, 2, this.length)\n return this[offset] | (this[offset + 1] << 8)\n}\n\nBuffer.prototype.readUint16BE =\nBuffer.prototype.readUInt16BE = function readUInt16BE (offset, noAssert) {\n offset = offset >>> 0\n if (!noAssert) checkOffset(offset, 2, this.length)\n return (this[offset] << 8) | this[offset + 1]\n}\n\nBuffer.prototype.readUint32LE =\nBuffer.prototype.readUInt32LE = function readUInt32LE (offset, noAssert) {\n offset = offset >>> 0\n if (!noAssert) checkOffset(offset, 4, this.length)\n\n return ((this[offset]) |\n (this[offset + 1] << 8) |\n (this[offset + 2] << 16)) +\n (this[offset + 3] * 0x1000000)\n}\n\nBuffer.prototype.readUint32BE =\nBuffer.prototype.readUInt32BE = function readUInt32BE (offset, noAssert) {\n offset = offset >>> 0\n if (!noAssert) checkOffset(offset, 4, this.length)\n\n return (this[offset] * 0x1000000) +\n ((this[offset + 1] << 16) |\n (this[offset + 2] << 8) |\n this[offset + 3])\n}\n\nBuffer.prototype.readBigUInt64LE = defineBigIntMethod(function readBigUInt64LE (offset) {\n offset = offset >>> 0\n validateNumber(offset, 'offset')\n const first = this[offset]\n const last = this[offset + 7]\n if (first === undefined || last === undefined) {\n boundsError(offset, this.length - 8)\n }\n\n const lo = first +\n this[++offset] * 2 ** 8 +\n this[++offset] * 2 ** 16 +\n this[++offset] * 2 ** 24\n\n const hi = this[++offset] +\n this[++offset] * 2 ** 8 +\n this[++offset] * 2 ** 16 +\n last * 2 ** 24\n\n return BigInt(lo) + (BigInt(hi) << BigInt(32))\n})\n\nBuffer.prototype.readBigUInt64BE = defineBigIntMethod(function readBigUInt64BE (offset) {\n offset = offset >>> 0\n validateNumber(offset, 'offset')\n const first = this[offset]\n const last = this[offset + 7]\n if (first === undefined || last === undefined) {\n boundsError(offset, this.length - 8)\n }\n\n const hi = first * 2 ** 24 +\n this[++offset] * 2 ** 16 +\n this[++offset] * 2 ** 8 +\n this[++offset]\n\n const lo = this[++offset] * 2 ** 24 +\n this[++offset] * 2 ** 16 +\n this[++offset] * 2 ** 8 +\n last\n\n return (BigInt(hi) << BigInt(32)) + BigInt(lo)\n})\n\nBuffer.prototype.readIntLE = function readIntLE (offset, byteLength, noAssert) {\n offset = offset >>> 0\n byteLength = byteLength >>> 0\n if (!noAssert) checkOffset(offset, byteLength, this.length)\n\n let val = this[offset]\n let mul = 1\n let i = 0\n while (++i < byteLength && (mul *= 0x100)) {\n val += this[offset + i] * mul\n }\n mul *= 0x80\n\n if (val >= mul) val -= Math.pow(2, 8 * byteLength)\n\n return val\n}\n\nBuffer.prototype.readIntBE = function readIntBE (offset, byteLength, noAssert) {\n offset = offset >>> 0\n byteLength = byteLength >>> 0\n if (!noAssert) checkOffset(offset, byteLength, this.length)\n\n let i = byteLength\n let mul = 1\n let val = this[offset + --i]\n while (i > 0 && (mul *= 0x100)) {\n val += this[offset + --i] * mul\n }\n mul *= 0x80\n\n if (val >= mul) val -= Math.pow(2, 8 * byteLength)\n\n return val\n}\n\nBuffer.prototype.readInt8 = function readInt8 (offset, noAssert) {\n offset = offset >>> 0\n if (!noAssert) checkOffset(offset, 1, this.length)\n if (!(this[offset] & 0x80)) return (this[offset])\n return ((0xff - this[offset] + 1) * -1)\n}\n\nBuffer.prototype.readInt16LE = function readInt16LE (offset, noAssert) {\n offset = offset >>> 0\n if (!noAssert) checkOffset(offset, 2, this.length)\n const val = this[offset] | (this[offset + 1] << 8)\n return (val & 0x8000) ? val | 0xFFFF0000 : val\n}\n\nBuffer.prototype.readInt16BE = function readInt16BE (offset, noAssert) {\n offset = offset >>> 0\n if (!noAssert) checkOffset(offset, 2, this.length)\n const val = this[offset + 1] | (this[offset] << 8)\n return (val & 0x8000) ? val | 0xFFFF0000 : val\n}\n\nBuffer.prototype.readInt32LE = function readInt32LE (offset, noAssert) {\n offset = offset >>> 0\n if (!noAssert) checkOffset(offset, 4, this.length)\n\n return (this[offset]) |\n (this[offset + 1] << 8) |\n (this[offset + 2] << 16) |\n (this[offset + 3] << 24)\n}\n\nBuffer.prototype.readInt32BE = function readInt32BE (offset, noAssert) {\n offset = offset >>> 0\n if (!noAssert) checkOffset(offset, 4, this.length)\n\n return (this[offset] << 24) |\n (this[offset + 1] << 16) |\n (this[offset + 2] << 8) |\n (this[offset + 3])\n}\n\nBuffer.prototype.readBigInt64LE = defineBigIntMethod(function readBigInt64LE (offset) {\n offset = offset >>> 0\n validateNumber(offset, 'offset')\n const first = this[offset]\n const last = this[offset + 7]\n if (first === undefined || last === undefined) {\n boundsError(offset, this.length - 8)\n }\n\n const val = this[offset + 4] +\n this[offset + 5] * 2 ** 8 +\n this[offset + 6] * 2 ** 16 +\n (last << 24) // Overflow\n\n return (BigInt(val) << BigInt(32)) +\n BigInt(first +\n this[++offset] * 2 ** 8 +\n this[++offset] * 2 ** 16 +\n this[++offset] * 2 ** 24)\n})\n\nBuffer.prototype.readBigInt64BE = defineBigIntMethod(function readBigInt64BE (offset) {\n offset = offset >>> 0\n validateNumber(offset, 'offset')\n const first = this[offset]\n const last = this[offset + 7]\n if (first === undefined || last === undefined) {\n boundsError(offset, this.length - 8)\n }\n\n const val = (first << 24) + // Overflow\n this[++offset] * 2 ** 16 +\n this[++offset] * 2 ** 8 +\n this[++offset]\n\n return (BigInt(val) << BigInt(32)) +\n BigInt(this[++offset] * 2 ** 24 +\n this[++offset] * 2 ** 16 +\n this[++offset] * 2 ** 8 +\n last)\n})\n\nBuffer.prototype.readFloatLE = function readFloatLE (offset, noAssert) {\n offset = offset >>> 0\n if (!noAssert) checkOffset(offset, 4, this.length)\n return ieee754.read(this, offset, true, 23, 4)\n}\n\nBuffer.prototype.readFloatBE = function readFloatBE (offset, noAssert) {\n offset = offset >>> 0\n if (!noAssert) checkOffset(offset, 4, this.length)\n return ieee754.read(this, offset, false, 23, 4)\n}\n\nBuffer.prototype.readDoubleLE = function readDoubleLE (offset, noAssert) {\n offset = offset >>> 0\n if (!noAssert) checkOffset(offset, 8, this.length)\n return ieee754.read(this, offset, true, 52, 8)\n}\n\nBuffer.prototype.readDoubleBE = function readDoubleBE (offset, noAssert) {\n offset = offset >>> 0\n if (!noAssert) checkOffset(offset, 8, this.length)\n return ieee754.read(this, offset, false, 52, 8)\n}\n\nfunction checkInt (buf, value, offset, ext, max, min) {\n if (!Buffer.isBuffer(buf)) throw new TypeError('\"buffer\" argument must be a Buffer instance')\n if (value > max || value < min) throw new RangeError('\"value\" argument is out of bounds')\n if (offset + ext > buf.length) throw new RangeError('Index out of range')\n}\n\nBuffer.prototype.writeUintLE =\nBuffer.prototype.writeUIntLE = function writeUIntLE (value, offset, byteLength, noAssert) {\n value = +value\n offset = offset >>> 0\n byteLength = byteLength >>> 0\n if (!noAssert) {\n const maxBytes = Math.pow(2, 8 * byteLength) - 1\n checkInt(this, value, offset, byteLength, maxBytes, 0)\n }\n\n let mul = 1\n let i = 0\n this[offset] = value & 0xFF\n while (++i < byteLength && (mul *= 0x100)) {\n this[offset + i] = (value / mul) & 0xFF\n }\n\n return offset + byteLength\n}\n\nBuffer.prototype.writeUintBE =\nBuffer.prototype.writeUIntBE = function writeUIntBE (value, offset, byteLength, noAssert) {\n value = +value\n offset = offset >>> 0\n byteLength = byteLength >>> 0\n if (!noAssert) {\n const maxBytes = Math.pow(2, 8 * byteLength) - 1\n checkInt(this, value, offset, byteLength, maxBytes, 0)\n }\n\n let i = byteLength - 1\n let mul = 1\n this[offset + i] = value & 0xFF\n while (--i >= 0 && (mul *= 0x100)) {\n this[offset + i] = (value / mul) & 0xFF\n }\n\n return offset + byteLength\n}\n\nBuffer.prototype.writeUint8 =\nBuffer.prototype.writeUInt8 = function writeUInt8 (value, offset, noAssert) {\n value = +value\n offset = offset >>> 0\n if (!noAssert) checkInt(this, value, offset, 1, 0xff, 0)\n this[offset] = (value & 0xff)\n return offset + 1\n}\n\nBuffer.prototype.writeUint16LE =\nBuffer.prototype.writeUInt16LE = function writeUInt16LE (value, offset, noAssert) {\n value = +value\n offset = offset >>> 0\n if (!noAssert) checkInt(this, value, offset, 2, 0xffff, 0)\n this[offset] = (value & 0xff)\n this[offset + 1] = (value >>> 8)\n return offset + 2\n}\n\nBuffer.prototype.writeUint16BE =\nBuffer.prototype.writeUInt16BE = function writeUInt16BE (value, offset, noAssert) {\n value = +value\n offset = offset >>> 0\n if (!noAssert) checkInt(this, value, offset, 2, 0xffff, 0)\n this[offset] = (value >>> 8)\n this[offset + 1] = (value & 0xff)\n return offset + 2\n}\n\nBuffer.prototype.writeUint32LE =\nBuffer.prototype.writeUInt32LE = function writeUInt32LE (value, offset, noAssert) {\n value = +value\n offset = offset >>> 0\n if (!noAssert) checkInt(this, value, offset, 4, 0xffffffff, 0)\n this[offset + 3] = (value >>> 24)\n this[offset + 2] = (value >>> 16)\n this[offset + 1] = (value >>> 8)\n this[offset] = (value & 0xff)\n return offset + 4\n}\n\nBuffer.prototype.writeUint32BE =\nBuffer.prototype.writeUInt32BE = function writeUInt32BE (value, offset, noAssert) {\n value = +value\n offset = offset >>> 0\n if (!noAssert) checkInt(this, value, offset, 4, 0xffffffff, 0)\n this[offset] = (value >>> 24)\n this[offset + 1] = (value >>> 16)\n this[offset + 2] = (value >>> 8)\n this[offset + 3] = (value & 0xff)\n return offset + 4\n}\n\nfunction wrtBigUInt64LE (buf, value, offset, min, max) {\n checkIntBI(value, min, max, buf, offset, 7)\n\n let lo = Number(value & BigInt(0xffffffff))\n buf[offset++] = lo\n lo = lo >> 8\n buf[offset++] = lo\n lo = lo >> 8\n buf[offset++] = lo\n lo = lo >> 8\n buf[offset++] = lo\n let hi = Number(value >> BigInt(32) & BigInt(0xffffffff))\n buf[offset++] = hi\n hi = hi >> 8\n buf[offset++] = hi\n hi = hi >> 8\n buf[offset++] = hi\n hi = hi >> 8\n buf[offset++] = hi\n return offset\n}\n\nfunction wrtBigUInt64BE (buf, value, offset, min, max) {\n checkIntBI(value, min, max, buf, offset, 7)\n\n let lo = Number(value & BigInt(0xffffffff))\n buf[offset + 7] = lo\n lo = lo >> 8\n buf[offset + 6] = lo\n lo = lo >> 8\n buf[offset + 5] = lo\n lo = lo >> 8\n buf[offset + 4] = lo\n let hi = Number(value >> BigInt(32) & BigInt(0xffffffff))\n buf[offset + 3] = hi\n hi = hi >> 8\n buf[offset + 2] = hi\n hi = hi >> 8\n buf[offset + 1] = hi\n hi = hi >> 8\n buf[offset] = hi\n return offset + 8\n}\n\nBuffer.prototype.writeBigUInt64LE = defineBigIntMethod(function writeBigUInt64LE (value, offset = 0) {\n return wrtBigUInt64LE(this, value, offset, BigInt(0), BigInt('0xffffffffffffffff'))\n})\n\nBuffer.prototype.writeBigUInt64BE = defineBigIntMethod(function writeBigUInt64BE (value, offset = 0) {\n return wrtBigUInt64BE(this, value, offset, BigInt(0), BigInt('0xffffffffffffffff'))\n})\n\nBuffer.prototype.writeIntLE = function writeIntLE (value, offset, byteLength, noAssert) {\n value = +value\n offset = offset >>> 0\n if (!noAssert) {\n const limit = Math.pow(2, (8 * byteLength) - 1)\n\n checkInt(this, value, offset, byteLength, limit - 1, -limit)\n }\n\n let i = 0\n let mul = 1\n let sub = 0\n this[offset] = value & 0xFF\n while (++i < byteLength && (mul *= 0x100)) {\n if (value < 0 && sub === 0 && this[offset + i - 1] !== 0) {\n sub = 1\n }\n this[offset + i] = ((value / mul) >> 0) - sub & 0xFF\n }\n\n return offset + byteLength\n}\n\nBuffer.prototype.writeIntBE = function writeIntBE (value, offset, byteLength, noAssert) {\n value = +value\n offset = offset >>> 0\n if (!noAssert) {\n const limit = Math.pow(2, (8 * byteLength) - 1)\n\n checkInt(this, value, offset, byteLength, limit - 1, -limit)\n }\n\n let i = byteLength - 1\n let mul = 1\n let sub = 0\n this[offset + i] = value & 0xFF\n while (--i >= 0 && (mul *= 0x100)) {\n if (value < 0 && sub === 0 && this[offset + i + 1] !== 0) {\n sub = 1\n }\n this[offset + i] = ((value / mul) >> 0) - sub & 0xFF\n }\n\n return offset + byteLength\n}\n\nBuffer.prototype.writeInt8 = function writeInt8 (value, offset, noAssert) {\n value = +value\n offset = offset >>> 0\n if (!noAssert) checkInt(this, value, offset, 1, 0x7f, -0x80)\n if (value < 0) value = 0xff + value + 1\n this[offset] = (value & 0xff)\n return offset + 1\n}\n\nBuffer.prototype.writeInt16LE = function writeInt16LE (value, offset, noAssert) {\n value = +value\n offset = offset >>> 0\n if (!noAssert) checkInt(this, value, offset, 2, 0x7fff, -0x8000)\n this[offset] = (value & 0xff)\n this[offset + 1] = (value >>> 8)\n return offset + 2\n}\n\nBuffer.prototype.writeInt16BE = function writeInt16BE (value, offset, noAssert) {\n value = +value\n offset = offset >>> 0\n if (!noAssert) checkInt(this, value, offset, 2, 0x7fff, -0x8000)\n this[offset] = (value >>> 8)\n this[offset + 1] = (value & 0xff)\n return offset + 2\n}\n\nBuffer.prototype.writeInt32LE = function writeInt32LE (value, offset, noAssert) {\n value = +value\n offset = offset >>> 0\n if (!noAssert) checkInt(this, value, offset, 4, 0x7fffffff, -0x80000000)\n this[offset] = (value & 0xff)\n this[offset + 1] = (value >>> 8)\n this[offset + 2] = (value >>> 16)\n this[offset + 3] = (value >>> 24)\n return offset + 4\n}\n\nBuffer.prototype.writeInt32BE = function writeInt32BE (value, offset, noAssert) {\n value = +value\n offset = offset >>> 0\n if (!noAssert) checkInt(this, value, offset, 4, 0x7fffffff, -0x80000000)\n if (value < 0) value = 0xffffffff + value + 1\n this[offset] = (value >>> 24)\n this[offset + 1] = (value >>> 16)\n this[offset + 2] = (value >>> 8)\n this[offset + 3] = (value & 0xff)\n return offset + 4\n}\n\nBuffer.prototype.writeBigInt64LE = defineBigIntMethod(function writeBigInt64LE (value, offset = 0) {\n return wrtBigUInt64LE(this, value, offset, -BigInt('0x8000000000000000'), BigInt('0x7fffffffffffffff'))\n})\n\nBuffer.prototype.writeBigInt64BE = defineBigIntMethod(function writeBigInt64BE (value, offset = 0) {\n return wrtBigUInt64BE(this, value, offset, -BigInt('0x8000000000000000'), BigInt('0x7fffffffffffffff'))\n})\n\nfunction checkIEEE754 (buf, value, offset, ext, max, min) {\n if (offset + ext > buf.length) throw new RangeError('Index out of range')\n if (offset < 0) throw new RangeError('Index out of range')\n}\n\nfunction writeFloat (buf, value, offset, littleEndian, noAssert) {\n value = +value\n offset = offset >>> 0\n if (!noAssert) {\n checkIEEE754(buf, value, offset, 4, 3.4028234663852886e+38, -3.4028234663852886e+38)\n }\n ieee754.write(buf, value, offset, littleEndian, 23, 4)\n return offset + 4\n}\n\nBuffer.prototype.writeFloatLE = function writeFloatLE (value, offset, noAssert) {\n return writeFloat(this, value, offset, true, noAssert)\n}\n\nBuffer.prototype.writeFloatBE = function writeFloatBE (value, offset, noAssert) {\n return writeFloat(this, value, offset, false, noAssert)\n}\n\nfunction writeDouble (buf, value, offset, littleEndian, noAssert) {\n value = +value\n offset = offset >>> 0\n if (!noAssert) {\n checkIEEE754(buf, value, offset, 8, 1.7976931348623157E+308, -1.7976931348623157E+308)\n }\n ieee754.write(buf, value, offset, littleEndian, 52, 8)\n return offset + 8\n}\n\nBuffer.prototype.writeDoubleLE = function writeDoubleLE (value, offset, noAssert) {\n return writeDouble(this, value, offset, true, noAssert)\n}\n\nBuffer.prototype.writeDoubleBE = function writeDoubleBE (value, offset, noAssert) {\n return writeDouble(this, value, offset, false, noAssert)\n}\n\n// copy(targetBuffer, targetStart=0, sourceStart=0, sourceEnd=buffer.length)\nBuffer.prototype.copy = function copy (target, targetStart, start, end) {\n if (!Buffer.isBuffer(target)) throw new TypeError('argument should be a Buffer')\n if (!start) start = 0\n if (!end && end !== 0) end = this.length\n if (targetStart >= target.length) targetStart = target.length\n if (!targetStart) targetStart = 0\n if (end > 0 && end < start) end = start\n\n // Copy 0 bytes; we're done\n if (end === start) return 0\n if (target.length === 0 || this.length === 0) return 0\n\n // Fatal error conditions\n if (targetStart < 0) {\n throw new RangeError('targetStart out of bounds')\n }\n if (start < 0 || start >= this.length) throw new RangeError('Index out of range')\n if (end < 0) throw new RangeError('sourceEnd out of bounds')\n\n // Are we oob?\n if (end > this.length) end = this.length\n if (target.length - targetStart < end - start) {\n end = target.length - targetStart + start\n }\n\n const len = end - start\n\n if (this === target && typeof Uint8Array.prototype.copyWithin === 'function') {\n // Use built-in when available, missing from IE11\n this.copyWithin(targetStart, start, end)\n } else {\n Uint8Array.prototype.set.call(\n target,\n this.subarray(start, end),\n targetStart\n )\n }\n\n return len\n}\n\n// Usage:\n// buffer.fill(number[, offset[, end]])\n// buffer.fill(buffer[, offset[, end]])\n// buffer.fill(string[, offset[, end]][, encoding])\nBuffer.prototype.fill = function fill (val, start, end, encoding) {\n // Handle string cases:\n if (typeof val === 'string') {\n if (typeof start === 'string') {\n encoding = start\n start = 0\n end = this.length\n } else if (typeof end === 'string') {\n encoding = end\n end = this.length\n }\n if (encoding !== undefined && typeof encoding !== 'string') {\n throw new TypeError('encoding must be a string')\n }\n if (typeof encoding === 'string' && !Buffer.isEncoding(encoding)) {\n throw new TypeError('Unknown encoding: ' + encoding)\n }\n if (val.length === 1) {\n const code = val.charCodeAt(0)\n if ((encoding === 'utf8' && code < 128) ||\n encoding === 'latin1') {\n // Fast path: If `val` fits into a single byte, use that numeric value.\n val = code\n }\n }\n } else if (typeof val === 'number') {\n val = val & 255\n } else if (typeof val === 'boolean') {\n val = Number(val)\n }\n\n // Invalid ranges are not set to a default, so can range check early.\n if (start < 0 || this.length < start || this.length < end) {\n throw new RangeError('Out of range index')\n }\n\n if (end <= start) {\n return this\n }\n\n start = start >>> 0\n end = end === undefined ? this.length : end >>> 0\n\n if (!val) val = 0\n\n let i\n if (typeof val === 'number') {\n for (i = start; i < end; ++i) {\n this[i] = val\n }\n } else {\n const bytes = Buffer.isBuffer(val)\n ? val\n : Buffer.from(val, encoding)\n const len = bytes.length\n if (len === 0) {\n throw new TypeError('The value \"' + val +\n '\" is invalid for argument \"value\"')\n }\n for (i = 0; i < end - start; ++i) {\n this[i + start] = bytes[i % len]\n }\n }\n\n return this\n}\n\n// CUSTOM ERRORS\n// =============\n\n// Simplified versions from Node, changed for Buffer-only usage\nconst errors = {}\nfunction E (sym, getMessage, Base) {\n errors[sym] = class NodeError extends Base {\n constructor () {\n super()\n\n Object.defineProperty(this, 'message', {\n value: getMessage.apply(this, arguments),\n writable: true,\n configurable: true\n })\n\n // Add the error code to the name to include it in the stack trace.\n this.name = `${this.name} [${sym}]`\n // Access the stack to generate the error message including the error code\n // from the name.\n this.stack // eslint-disable-line no-unused-expressions\n // Reset the name to the actual name.\n delete this.name\n }\n\n get code () {\n return sym\n }\n\n set code (value) {\n Object.defineProperty(this, 'code', {\n configurable: true,\n enumerable: true,\n value,\n writable: true\n })\n }\n\n toString () {\n return `${this.name} [${sym}]: ${this.message}`\n }\n }\n}\n\nE('ERR_BUFFER_OUT_OF_BOUNDS',\n function (name) {\n if (name) {\n return `${name} is outside of buffer bounds`\n }\n\n return 'Attempt to access memory outside buffer bounds'\n }, RangeError)\nE('ERR_INVALID_ARG_TYPE',\n function (name, actual) {\n return `The \"${name}\" argument must be of type number. Received type ${typeof actual}`\n }, TypeError)\nE('ERR_OUT_OF_RANGE',\n function (str, range, input) {\n let msg = `The value of \"${str}\" is out of range.`\n let received = input\n if (Number.isInteger(input) && Math.abs(input) > 2 ** 32) {\n received = addNumericalSeparator(String(input))\n } else if (typeof input === 'bigint') {\n received = String(input)\n if (input > BigInt(2) ** BigInt(32) || input < -(BigInt(2) ** BigInt(32))) {\n received = addNumericalSeparator(received)\n }\n received += 'n'\n }\n msg += ` It must be ${range}. Received ${received}`\n return msg\n }, RangeError)\n\nfunction addNumericalSeparator (val) {\n let res = ''\n let i = val.length\n const start = val[0] === '-' ? 1 : 0\n for (; i >= start + 4; i -= 3) {\n res = `_${val.slice(i - 3, i)}${res}`\n }\n return `${val.slice(0, i)}${res}`\n}\n\n// CHECK FUNCTIONS\n// ===============\n\nfunction checkBounds (buf, offset, byteLength) {\n validateNumber(offset, 'offset')\n if (buf[offset] === undefined || buf[offset + byteLength] === undefined) {\n boundsError(offset, buf.length - (byteLength + 1))\n }\n}\n\nfunction checkIntBI (value, min, max, buf, offset, byteLength) {\n if (value > max || value < min) {\n const n = typeof min === 'bigint' ? 'n' : ''\n let range\n if (byteLength > 3) {\n if (min === 0 || min === BigInt(0)) {\n range = `>= 0${n} and < 2${n} ** ${(byteLength + 1) * 8}${n}`\n } else {\n range = `>= -(2${n} ** ${(byteLength + 1) * 8 - 1}${n}) and < 2 ** ` +\n `${(byteLength + 1) * 8 - 1}${n}`\n }\n } else {\n range = `>= ${min}${n} and <= ${max}${n}`\n }\n throw new errors.ERR_OUT_OF_RANGE('value', range, value)\n }\n checkBounds(buf, offset, byteLength)\n}\n\nfunction validateNumber (value, name) {\n if (typeof value !== 'number') {\n throw new errors.ERR_INVALID_ARG_TYPE(name, 'number', value)\n }\n}\n\nfunction boundsError (value, length, type) {\n if (Math.floor(value) !== value) {\n validateNumber(value, type)\n throw new errors.ERR_OUT_OF_RANGE(type || 'offset', 'an integer', value)\n }\n\n if (length < 0) {\n throw new errors.ERR_BUFFER_OUT_OF_BOUNDS()\n }\n\n throw new errors.ERR_OUT_OF_RANGE(type || 'offset',\n `>= ${type ? 1 : 0} and <= ${length}`,\n value)\n}\n\n// HELPER FUNCTIONS\n// ================\n\nconst INVALID_BASE64_RE = /[^+/0-9A-Za-z-_]/g\n\nfunction base64clean (str) {\n // Node takes equal signs as end of the Base64 encoding\n str = str.split('=')[0]\n // Node strips out invalid characters like \\n and \\t from the string, base64-js does not\n str = str.trim().replace(INVALID_BASE64_RE, '')\n // Node converts strings with length < 2 to ''\n if (str.length < 2) return ''\n // Node allows for non-padded base64 strings (missing trailing ===), base64-js does not\n while (str.length % 4 !== 0) {\n str = str + '='\n }\n return str\n}\n\nfunction utf8ToBytes (string, units) {\n units = units || Infinity\n let codePoint\n const length = string.length\n let leadSurrogate = null\n const bytes = []\n\n for (let i = 0; i < length; ++i) {\n codePoint = string.charCodeAt(i)\n\n // is surrogate component\n if (codePoint > 0xD7FF && codePoint < 0xE000) {\n // last char was a lead\n if (!leadSurrogate) {\n // no lead yet\n if (codePoint > 0xDBFF) {\n // unexpected trail\n if ((units -= 3) > -1) bytes.push(0xEF, 0xBF, 0xBD)\n continue\n } else if (i + 1 === length) {\n // unpaired lead\n if ((units -= 3) > -1) bytes.push(0xEF, 0xBF, 0xBD)\n continue\n }\n\n // valid lead\n leadSurrogate = codePoint\n\n continue\n }\n\n // 2 leads in a row\n if (codePoint < 0xDC00) {\n if ((units -= 3) > -1) bytes.push(0xEF, 0xBF, 0xBD)\n leadSurrogate = codePoint\n continue\n }\n\n // valid surrogate pair\n codePoint = (leadSurrogate - 0xD800 << 10 | codePoint - 0xDC00) + 0x10000\n } else if (leadSurrogate) {\n // valid bmp char, but last char was a lead\n if ((units -= 3) > -1) bytes.push(0xEF, 0xBF, 0xBD)\n }\n\n leadSurrogate = null\n\n // encode utf8\n if (codePoint < 0x80) {\n if ((units -= 1) < 0) break\n bytes.push(codePoint)\n } else if (codePoint < 0x800) {\n if ((units -= 2) < 0) break\n bytes.push(\n codePoint >> 0x6 | 0xC0,\n codePoint & 0x3F | 0x80\n )\n } else if (codePoint < 0x10000) {\n if ((units -= 3) < 0) break\n bytes.push(\n codePoint >> 0xC | 0xE0,\n codePoint >> 0x6 & 0x3F | 0x80,\n codePoint & 0x3F | 0x80\n )\n } else if (codePoint < 0x110000) {\n if ((units -= 4) < 0) break\n bytes.push(\n codePoint >> 0x12 | 0xF0,\n codePoint >> 0xC & 0x3F | 0x80,\n codePoint >> 0x6 & 0x3F | 0x80,\n codePoint & 0x3F | 0x80\n )\n } else {\n throw new Error('Invalid code point')\n }\n }\n\n return bytes\n}\n\nfunction asciiToBytes (str) {\n const byteArray = []\n for (let i = 0; i < str.length; ++i) {\n // Node's code seems to be doing this and not & 0x7F..\n byteArray.push(str.charCodeAt(i) & 0xFF)\n }\n return byteArray\n}\n\nfunction utf16leToBytes (str, units) {\n let c, hi, lo\n const byteArray = []\n for (let i = 0; i < str.length; ++i) {\n if ((units -= 2) < 0) break\n\n c = str.charCodeAt(i)\n hi = c >> 8\n lo = c % 256\n byteArray.push(lo)\n byteArray.push(hi)\n }\n\n return byteArray\n}\n\nfunction base64ToBytes (str) {\n return base64.toByteArray(base64clean(str))\n}\n\nfunction blitBuffer (src, dst, offset, length) {\n let i\n for (i = 0; i < length; ++i) {\n if ((i + offset >= dst.length) || (i >= src.length)) break\n dst[i + offset] = src[i]\n }\n return i\n}\n\n// ArrayBuffer or Uint8Array objects from other contexts (i.e. iframes) do not pass\n// the `instanceof` check but they should be treated as of that type.\n// See: https://github.com/feross/buffer/issues/166\nfunction isInstance (obj, type) {\n return obj instanceof type ||\n (obj != null && obj.constructor != null && obj.constructor.name != null &&\n obj.constructor.name === type.name)\n}\nfunction numberIsNaN (obj) {\n // For IE11 support\n return obj !== obj // eslint-disable-line no-self-compare\n}\n\n// Create lookup table for `toString('hex')`\n// See: https://github.com/feross/buffer/issues/219\nconst hexSliceLookupTable = (function () {\n const alphabet = '0123456789abcdef'\n const table = new Array(256)\n for (let i = 0; i < 16; ++i) {\n const i16 = i * 16\n for (let j = 0; j < 16; ++j) {\n table[i16 + j] = alphabet[i] + alphabet[j]\n }\n }\n return table\n})()\n\n// Return not function with Error if BigInt not supported\nfunction defineBigIntMethod (fn) {\n return typeof BigInt === 'undefined' ? BufferBigIntNotDefined : fn\n}\n\nfunction BufferBigIntNotDefined () {\n throw new Error('BigInt not supported')\n}\n","// extracted by extract-css-chunks-webpack-plugin\nmodule.exports = {};","// extracted by extract-css-chunks-webpack-plugin\nmodule.exports = {\"nodeStrokeWidth\":\"0.8\",\"directionArrowSize\":\"6\",\"directionArrowWidth\":\"0.7\",\"node\":\"fornac-node\",\"directionArrow\":\"fornac-directionArrow\",\"plot\":\"fornac-plot\",\"selectedNode\":\"fornac-selectedNode\",\"nodeLabel\":\"fornac-nodeLabel\",\"link\":\"fornac-link\",\"plotLabel\":\"fornac-plotLabel\",\"transparent\":\"fornac-transparent\",\"dragLine\":\"fornac-dragLine\",\"mouseEventHelper\":\"fornac-mouseEventHelper\"};","/*! ieee754. BSD-3-Clause License. Feross Aboukhadijeh */\nexports.read = function (buffer, offset, isLE, mLen, nBytes) {\n var e, m\n var eLen = (nBytes * 8) - mLen - 1\n var eMax = (1 << eLen) - 1\n var eBias = eMax >> 1\n var nBits = -7\n var i = isLE ? (nBytes - 1) : 0\n var d = isLE ? -1 : 1\n var s = buffer[offset + i]\n\n i += d\n\n e = s & ((1 << (-nBits)) - 1)\n s >>= (-nBits)\n nBits += eLen\n for (; nBits > 0; e = (e * 256) + buffer[offset + i], i += d, nBits -= 8) {}\n\n m = e & ((1 << (-nBits)) - 1)\n e >>= (-nBits)\n nBits += mLen\n for (; nBits > 0; m = (m * 256) + buffer[offset + i], i += d, nBits -= 8) {}\n\n if (e === 0) {\n e = 1 - eBias\n } else if (e === eMax) {\n return m ? NaN : ((s ? -1 : 1) * Infinity)\n } else {\n m = m + Math.pow(2, mLen)\n e = e - eBias\n }\n return (s ? -1 : 1) * m * Math.pow(2, e - mLen)\n}\n\nexports.write = function (buffer, value, offset, isLE, mLen, nBytes) {\n var e, m, c\n var eLen = (nBytes * 8) - mLen - 1\n var eMax = (1 << eLen) - 1\n var eBias = eMax >> 1\n var rt = (mLen === 23 ? Math.pow(2, -24) - Math.pow(2, -77) : 0)\n var i = isLE ? 0 : (nBytes - 1)\n var d = isLE ? 1 : -1\n var s = value < 0 || (value === 0 && 1 / value < 0) ? 1 : 0\n\n value = Math.abs(value)\n\n if (isNaN(value) || value === Infinity) {\n m = isNaN(value) ? 1 : 0\n e = eMax\n } else {\n e = Math.floor(Math.log(value) / Math.LN2)\n if (value * (c = Math.pow(2, -e)) < 1) {\n e--\n c *= 2\n }\n if (e + eBias >= 1) {\n value += rt / c\n } else {\n value += rt * Math.pow(2, 1 - eBias)\n }\n if (value * c >= 2) {\n e++\n c /= 2\n }\n\n if (e + eBias >= eMax) {\n m = 0\n e = eMax\n } else if (e + eBias >= 1) {\n m = ((value * c) - 1) * Math.pow(2, mLen)\n e = e + eBias\n } else {\n m = value * Math.pow(2, eBias - 1) * Math.pow(2, mLen)\n e = 0\n }\n }\n\n for (; mLen >= 8; buffer[offset + i] = m & 0xff, i += d, m /= 256, mLen -= 8) {}\n\n e = (e << mLen) | m\n eLen += mLen\n for (; eLen > 0; buffer[offset + i] = e & 0xff, i += d, e /= 256, eLen -= 8) {}\n\n buffer[offset + i - d] |= s * 128\n}\n","// The MIT License (MIT)\n//\n// Copyright (c) 2014 Jonas Finnemann Jensen\n//\n// Permission is hereby granted, free of charge, to any person obtaining a copy\n// of this software and associated documentation files (the \"Software\"), to deal\n// in the Software without restriction, including without limitation the rights\n// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n// copies of the Software, and to permit persons to whom the Software is\n// furnished to do so, subject to the following conditions:\n//\n// The above copyright notice and this permission notice shall be included in\n// all copies or substantial portions of the Software.\n//\n// THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n// THE SOFTWARE.\n\nmodule.exports = require('./slugid');\n","// The MIT License (MIT)\n//\n// Copyright (c) 2014 Jonas Finnemann Jensen\n//\n// Permission is hereby granted, free of charge, to any person obtaining a copy\n// of this software and associated documentation files (the \"Software\"), to deal\n// in the Software without restriction, including without limitation the rights\n// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n// copies of the Software, and to permit persons to whom the Software is\n// furnished to do so, subject to the following conditions:\n//\n// The above copyright notice and this permission notice shall be included in\n// all copies or substantial portions of the Software.\n//\n// THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n// THE SOFTWARE.\n\nvar uuid = require('uuid');\n\n/** @type {(bytes: Uint8Array) => string} */\nvar toBase64 = (() => {\n if (typeof Buffer !== 'undefined') {\n return (bytes) => Buffer.from(bytes).toString('base64');\n }\n return (bytes) => btoa(String.fromCharCode(...bytes));\n})();\n\n/** @type {(base64: string) => Uint8Array | Buffer} */\nvar fromBase64 = (() => {\n if (typeof Buffer !== 'undefined') {\n return (base64) => Buffer.from(base64, 'base64');\n }\n return (base64) => Uint8Array.from(atob(base64), c => c.charCodeAt(0));\n})();\n\n/**\n * Returns the given uuid as a 22 character slug. This can be a regular v4\n * slug or a \"nice\" slug.\n */\nexports.encode = function(uuid_) {\n var bytes = uuid.parse(uuid_);\n var base64 = toBase64(bytes);\n var slug = base64\n .replace(/\\+/g, '-') // Replace + with - (see RFC 4648, sec. 5)\n .replace(/\\//g, '_') // Replace / with _ (see RFC 4648, sec. 5)\n .substring(0, 22); // Drop '==' padding\n return slug;\n};\n\n/**\n * Returns the uuid represented by the given v4 or \"nice\" slug\n */\nexports.decode = function(slug) {\n var base64 = slug\n .replace(/-/g, '+')\n .replace(/_/g, '/')\n + '==';\n return uuid.stringify(fromBase64(base64));\n};\n\n/**\n * Returns a randomly generated uuid v4 compliant slug\n */\nexports.v4 = function() {\n var bytes = uuid.v4(null, new Uint8Array(16));\n var base64 = toBase64(bytes);\n var slug = base64\n .replace(/\\+/g, '-') // Replace + with - (see RFC 4648, sec. 5)\n .replace(/\\//g, '_') // Replace / with _ (see RFC 4648, sec. 5)\n .substring(0, 22); // Drop '==' padding\n return slug;\n};\n\n/**\n * Returns a randomly generated uuid v4 compliant slug which conforms to a set\n * of \"nice\" properties, at the cost of some entropy. Currently this means one\n * extra fixed bit (the first bit of the uuid is set to 0) which guarantees the\n * slug will begin with [A-Za-f]. For example such slugs don't require special\n * handling when used as command line parameters (whereas non-nice slugs may\n * start with `-` which can confuse command line tools).\n *\n * Potentially other \"nice\" properties may be added in future to further\n * restrict the range of potential uuids that may be generated.\n */\nexports.nice = function() {\n var bytes = uuid.v4(null, new Uint8Array(16));\n bytes[0] = bytes[0] & 0x7f; // unset first bit to ensure [A-Za-f] first char\n var base64 = toBase64(bytes);\n var slug = base64\n .replace(/\\+/g, '-') // Replace + with - (see RFC 4648, sec. 5)\n .replace(/\\//g, '_') // Replace / with _ (see RFC 4648, sec. 5)\n .substring(0, 22); // Drop '==' padding\n return slug;\n};\n","// Unique ID creation requires a high quality random # generator. In the browser we therefore\n// require the crypto API and do not support built-in fallback to lower quality random number\n// generators (like Math.random()).\nvar getRandomValues;\nvar rnds8 = new Uint8Array(16);\nexport default function rng() {\n // lazy load so that environments that need to polyfill have a chance to do so\n if (!getRandomValues) {\n // getRandomValues needs to be invoked in a context where \"this\" is a Crypto implementation. Also,\n // find the complete implementation of crypto (msCrypto) on IE11.\n getRandomValues = typeof crypto !== 'undefined' && crypto.getRandomValues && crypto.getRandomValues.bind(crypto) || typeof msCrypto !== 'undefined' && typeof msCrypto.getRandomValues === 'function' && msCrypto.getRandomValues.bind(msCrypto);\n\n if (!getRandomValues) {\n throw new Error('crypto.getRandomValues() not supported. See https://github.com/uuidjs/uuid#getrandomvalues-not-supported');\n }\n }\n\n return getRandomValues(rnds8);\n}","export default /^(?:[0-9a-f]{8}-[0-9a-f]{4}-[1-5][0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}|00000000-0000-0000-0000-000000000000)$/i;","import REGEX from './regex.js';\n\nfunction validate(uuid) {\n return typeof uuid === 'string' && REGEX.test(uuid);\n}\n\nexport default validate;","import validate from './validate.js';\n/**\n * Convert array of 16 byte values to UUID string format of the form:\n * XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX\n */\n\nvar byteToHex = [];\n\nfor (var i = 0; i < 256; ++i) {\n byteToHex.push((i + 0x100).toString(16).substr(1));\n}\n\nfunction stringify(arr) {\n var offset = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 0;\n // Note: Be careful editing this code! It's been tuned for performance\n // and works in ways you may not expect. See https://github.com/uuidjs/uuid/pull/434\n var uuid = (byteToHex[arr[offset + 0]] + byteToHex[arr[offset + 1]] + byteToHex[arr[offset + 2]] + byteToHex[arr[offset + 3]] + '-' + byteToHex[arr[offset + 4]] + byteToHex[arr[offset + 5]] + '-' + byteToHex[arr[offset + 6]] + byteToHex[arr[offset + 7]] + '-' + byteToHex[arr[offset + 8]] + byteToHex[arr[offset + 9]] + '-' + byteToHex[arr[offset + 10]] + byteToHex[arr[offset + 11]] + byteToHex[arr[offset + 12]] + byteToHex[arr[offset + 13]] + byteToHex[arr[offset + 14]] + byteToHex[arr[offset + 15]]).toLowerCase(); // Consistency check for valid UUID. If this throws, it's likely due to one\n // of the following:\n // - One or more input array values don't map to a hex octet (leading to\n // \"undefined\" in the uuid)\n // - Invalid input values for the RFC `version` or `variant` fields\n\n if (!validate(uuid)) {\n throw TypeError('Stringified UUID is invalid');\n }\n\n return uuid;\n}\n\nexport default stringify;","import rng from './rng.js';\nimport stringify from './stringify.js'; // **`v1()` - Generate time-based UUID**\n//\n// Inspired by https://github.com/LiosK/UUID.js\n// and http://docs.python.org/library/uuid.html\n\nvar _nodeId;\n\nvar _clockseq; // Previous uuid creation time\n\n\nvar _lastMSecs = 0;\nvar _lastNSecs = 0; // See https://github.com/uuidjs/uuid for API details\n\nfunction v1(options, buf, offset) {\n var i = buf && offset || 0;\n var b = buf || new Array(16);\n options = options || {};\n var node = options.node || _nodeId;\n var clockseq = options.clockseq !== undefined ? options.clockseq : _clockseq; // node and clockseq need to be initialized to random values if they're not\n // specified. We do this lazily to minimize issues related to insufficient\n // system entropy. See #189\n\n if (node == null || clockseq == null) {\n var seedBytes = options.random || (options.rng || rng)();\n\n if (node == null) {\n // Per 4.5, create and 48-bit node id, (47 random bits + multicast bit = 1)\n node = _nodeId = [seedBytes[0] | 0x01, seedBytes[1], seedBytes[2], seedBytes[3], seedBytes[4], seedBytes[5]];\n }\n\n if (clockseq == null) {\n // Per 4.2.2, randomize (14 bit) clockseq\n clockseq = _clockseq = (seedBytes[6] << 8 | seedBytes[7]) & 0x3fff;\n }\n } // UUID timestamps are 100 nano-second units since the Gregorian epoch,\n // (1582-10-15 00:00). JSNumbers aren't precise enough for this, so\n // time is handled internally as 'msecs' (integer milliseconds) and 'nsecs'\n // (100-nanoseconds offset from msecs) since unix epoch, 1970-01-01 00:00.\n\n\n var msecs = options.msecs !== undefined ? options.msecs : Date.now(); // Per 4.2.1.2, use count of uuid's generated during the current clock\n // cycle to simulate higher resolution clock\n\n var nsecs = options.nsecs !== undefined ? options.nsecs : _lastNSecs + 1; // Time since last uuid creation (in msecs)\n\n var dt = msecs - _lastMSecs + (nsecs - _lastNSecs) / 10000; // Per 4.2.1.2, Bump clockseq on clock regression\n\n if (dt < 0 && options.clockseq === undefined) {\n clockseq = clockseq + 1 & 0x3fff;\n } // Reset nsecs if clock regresses (new clockseq) or we've moved onto a new\n // time interval\n\n\n if ((dt < 0 || msecs > _lastMSecs) && options.nsecs === undefined) {\n nsecs = 0;\n } // Per 4.2.1.2 Throw error if too many uuids are requested\n\n\n if (nsecs >= 10000) {\n throw new Error(\"uuid.v1(): Can't create more than 10M uuids/sec\");\n }\n\n _lastMSecs = msecs;\n _lastNSecs = nsecs;\n _clockseq = clockseq; // Per 4.1.4 - Convert from unix epoch to Gregorian epoch\n\n msecs += 12219292800000; // `time_low`\n\n var tl = ((msecs & 0xfffffff) * 10000 + nsecs) % 0x100000000;\n b[i++] = tl >>> 24 & 0xff;\n b[i++] = tl >>> 16 & 0xff;\n b[i++] = tl >>> 8 & 0xff;\n b[i++] = tl & 0xff; // `time_mid`\n\n var tmh = msecs / 0x100000000 * 10000 & 0xfffffff;\n b[i++] = tmh >>> 8 & 0xff;\n b[i++] = tmh & 0xff; // `time_high_and_version`\n\n b[i++] = tmh >>> 24 & 0xf | 0x10; // include version\n\n b[i++] = tmh >>> 16 & 0xff; // `clock_seq_hi_and_reserved` (Per 4.2.2 - include variant)\n\n b[i++] = clockseq >>> 8 | 0x80; // `clock_seq_low`\n\n b[i++] = clockseq & 0xff; // `node`\n\n for (var n = 0; n < 6; ++n) {\n b[i + n] = node[n];\n }\n\n return buf || stringify(b);\n}\n\nexport default v1;","import validate from './validate.js';\n\nfunction parse(uuid) {\n if (!validate(uuid)) {\n throw TypeError('Invalid UUID');\n }\n\n var v;\n var arr = new Uint8Array(16); // Parse ########-....-....-....-............\n\n arr[0] = (v = parseInt(uuid.slice(0, 8), 16)) >>> 24;\n arr[1] = v >>> 16 & 0xff;\n arr[2] = v >>> 8 & 0xff;\n arr[3] = v & 0xff; // Parse ........-####-....-....-............\n\n arr[4] = (v = parseInt(uuid.slice(9, 13), 16)) >>> 8;\n arr[5] = v & 0xff; // Parse ........-....-####-....-............\n\n arr[6] = (v = parseInt(uuid.slice(14, 18), 16)) >>> 8;\n arr[7] = v & 0xff; // Parse ........-....-....-####-............\n\n arr[8] = (v = parseInt(uuid.slice(19, 23), 16)) >>> 8;\n arr[9] = v & 0xff; // Parse ........-....-....-....-############\n // (Use \"/\" to avoid 32-bit truncation when bit-shifting high-order bytes)\n\n arr[10] = (v = parseInt(uuid.slice(24, 36), 16)) / 0x10000000000 & 0xff;\n arr[11] = v / 0x100000000 & 0xff;\n arr[12] = v >>> 24 & 0xff;\n arr[13] = v >>> 16 & 0xff;\n arr[14] = v >>> 8 & 0xff;\n arr[15] = v & 0xff;\n return arr;\n}\n\nexport default parse;","import stringify from './stringify.js';\nimport parse from './parse.js';\n\nfunction stringToBytes(str) {\n str = unescape(encodeURIComponent(str)); // UTF8 escape\n\n var bytes = [];\n\n for (var i = 0; i < str.length; ++i) {\n bytes.push(str.charCodeAt(i));\n }\n\n return bytes;\n}\n\nexport var DNS = '6ba7b810-9dad-11d1-80b4-00c04fd430c8';\nexport var URL = '6ba7b811-9dad-11d1-80b4-00c04fd430c8';\nexport default function (name, version, hashfunc) {\n function generateUUID(value, namespace, buf, offset) {\n if (typeof value === 'string') {\n value = stringToBytes(value);\n }\n\n if (typeof namespace === 'string') {\n namespace = parse(namespace);\n }\n\n if (namespace.length !== 16) {\n throw TypeError('Namespace must be array-like (16 iterable integer values, 0-255)');\n } // Compute hash of namespace and value, Per 4.3\n // Future: Use spread syntax when supported on all platforms, e.g. `bytes =\n // hashfunc([...namespace, ... value])`\n\n\n var bytes = new Uint8Array(16 + value.length);\n bytes.set(namespace);\n bytes.set(value, namespace.length);\n bytes = hashfunc(bytes);\n bytes[6] = bytes[6] & 0x0f | version;\n bytes[8] = bytes[8] & 0x3f | 0x80;\n\n if (buf) {\n offset = offset || 0;\n\n for (var i = 0; i < 16; ++i) {\n buf[offset + i] = bytes[i];\n }\n\n return buf;\n }\n\n return stringify(bytes);\n } // Function#name is not settable on some platforms (#270)\n\n\n try {\n generateUUID.name = name; // eslint-disable-next-line no-empty\n } catch (err) {} // For CommonJS default export support\n\n\n generateUUID.DNS = DNS;\n generateUUID.URL = URL;\n return generateUUID;\n}","/*\n * Browser-compatible JavaScript MD5\n *\n * Modification of JavaScript MD5\n * https://github.com/blueimp/JavaScript-MD5\n *\n * Copyright 2011, Sebastian Tschan\n * https://blueimp.net\n *\n * Licensed under the MIT license:\n * https://opensource.org/licenses/MIT\n *\n * Based on\n * A JavaScript implementation of the RSA Data Security, Inc. MD5 Message\n * Digest Algorithm, as defined in RFC 1321.\n * Version 2.2 Copyright (C) Paul Johnston 1999 - 2009\n * Other contributors: Greg Holt, Andrew Kepert, Ydnar, Lostinet\n * Distributed under the BSD License\n * See http://pajhome.org.uk/crypt/md5 for more info.\n */\nfunction md5(bytes) {\n if (typeof bytes === 'string') {\n var msg = unescape(encodeURIComponent(bytes)); // UTF8 escape\n\n bytes = new Uint8Array(msg.length);\n\n for (var i = 0; i < msg.length; ++i) {\n bytes[i] = msg.charCodeAt(i);\n }\n }\n\n return md5ToHexEncodedArray(wordsToMd5(bytesToWords(bytes), bytes.length * 8));\n}\n/*\n * Convert an array of little-endian words to an array of bytes\n */\n\n\nfunction md5ToHexEncodedArray(input) {\n var output = [];\n var length32 = input.length * 32;\n var hexTab = '0123456789abcdef';\n\n for (var i = 0; i < length32; i += 8) {\n var x = input[i >> 5] >>> i % 32 & 0xff;\n var hex = parseInt(hexTab.charAt(x >>> 4 & 0x0f) + hexTab.charAt(x & 0x0f), 16);\n output.push(hex);\n }\n\n return output;\n}\n/**\n * Calculate output length with padding and bit length\n */\n\n\nfunction getOutputLength(inputLength8) {\n return (inputLength8 + 64 >>> 9 << 4) + 14 + 1;\n}\n/*\n * Calculate the MD5 of an array of little-endian words, and a bit length.\n */\n\n\nfunction wordsToMd5(x, len) {\n /* append padding */\n x[len >> 5] |= 0x80 << len % 32;\n x[getOutputLength(len) - 1] = len;\n var a = 1732584193;\n var b = -271733879;\n var c = -1732584194;\n var d = 271733878;\n\n for (var i = 0; i < x.length; i += 16) {\n var olda = a;\n var oldb = b;\n var oldc = c;\n var oldd = d;\n a = md5ff(a, b, c, d, x[i], 7, -680876936);\n d = md5ff(d, a, b, c, x[i + 1], 12, -389564586);\n c = md5ff(c, d, a, b, x[i + 2], 17, 606105819);\n b = md5ff(b, c, d, a, x[i + 3], 22, -1044525330);\n a = md5ff(a, b, c, d, x[i + 4], 7, -176418897);\n d = md5ff(d, a, b, c, x[i + 5], 12, 1200080426);\n c = md5ff(c, d, a, b, x[i + 6], 17, -1473231341);\n b = md5ff(b, c, d, a, x[i + 7], 22, -45705983);\n a = md5ff(a, b, c, d, x[i + 8], 7, 1770035416);\n d = md5ff(d, a, b, c, x[i + 9], 12, -1958414417);\n c = md5ff(c, d, a, b, x[i + 10], 17, -42063);\n b = md5ff(b, c, d, a, x[i + 11], 22, -1990404162);\n a = md5ff(a, b, c, d, x[i + 12], 7, 1804603682);\n d = md5ff(d, a, b, c, x[i + 13], 12, -40341101);\n c = md5ff(c, d, a, b, x[i + 14], 17, -1502002290);\n b = md5ff(b, c, d, a, x[i + 15], 22, 1236535329);\n a = md5gg(a, b, c, d, x[i + 1], 5, -165796510);\n d = md5gg(d, a, b, c, x[i + 6], 9, -1069501632);\n c = md5gg(c, d, a, b, x[i + 11], 14, 643717713);\n b = md5gg(b, c, d, a, x[i], 20, -373897302);\n a = md5gg(a, b, c, d, x[i + 5], 5, -701558691);\n d = md5gg(d, a, b, c, x[i + 10], 9, 38016083);\n c = md5gg(c, d, a, b, x[i + 15], 14, -660478335);\n b = md5gg(b, c, d, a, x[i + 4], 20, -405537848);\n a = md5gg(a, b, c, d, x[i + 9], 5, 568446438);\n d = md5gg(d, a, b, c, x[i + 14], 9, -1019803690);\n c = md5gg(c, d, a, b, x[i + 3], 14, -187363961);\n b = md5gg(b, c, d, a, x[i + 8], 20, 1163531501);\n a = md5gg(a, b, c, d, x[i + 13], 5, -1444681467);\n d = md5gg(d, a, b, c, x[i + 2], 9, -51403784);\n c = md5gg(c, d, a, b, x[i + 7], 14, 1735328473);\n b = md5gg(b, c, d, a, x[i + 12], 20, -1926607734);\n a = md5hh(a, b, c, d, x[i + 5], 4, -378558);\n d = md5hh(d, a, b, c, x[i + 8], 11, -2022574463);\n c = md5hh(c, d, a, b, x[i + 11], 16, 1839030562);\n b = md5hh(b, c, d, a, x[i + 14], 23, -35309556);\n a = md5hh(a, b, c, d, x[i + 1], 4, -1530992060);\n d = md5hh(d, a, b, c, x[i + 4], 11, 1272893353);\n c = md5hh(c, d, a, b, x[i + 7], 16, -155497632);\n b = md5hh(b, c, d, a, x[i + 10], 23, -1094730640);\n a = md5hh(a, b, c, d, x[i + 13], 4, 681279174);\n d = md5hh(d, a, b, c, x[i], 11, -358537222);\n c = md5hh(c, d, a, b, x[i + 3], 16, -722521979);\n b = md5hh(b, c, d, a, x[i + 6], 23, 76029189);\n a = md5hh(a, b, c, d, x[i + 9], 4, -640364487);\n d = md5hh(d, a, b, c, x[i + 12], 11, -421815835);\n c = md5hh(c, d, a, b, x[i + 15], 16, 530742520);\n b = md5hh(b, c, d, a, x[i + 2], 23, -995338651);\n a = md5ii(a, b, c, d, x[i], 6, -198630844);\n d = md5ii(d, a, b, c, x[i + 7], 10, 1126891415);\n c = md5ii(c, d, a, b, x[i + 14], 15, -1416354905);\n b = md5ii(b, c, d, a, x[i + 5], 21, -57434055);\n a = md5ii(a, b, c, d, x[i + 12], 6, 1700485571);\n d = md5ii(d, a, b, c, x[i + 3], 10, -1894986606);\n c = md5ii(c, d, a, b, x[i + 10], 15, -1051523);\n b = md5ii(b, c, d, a, x[i + 1], 21, -2054922799);\n a = md5ii(a, b, c, d, x[i + 8], 6, 1873313359);\n d = md5ii(d, a, b, c, x[i + 15], 10, -30611744);\n c = md5ii(c, d, a, b, x[i + 6], 15, -1560198380);\n b = md5ii(b, c, d, a, x[i + 13], 21, 1309151649);\n a = md5ii(a, b, c, d, x[i + 4], 6, -145523070);\n d = md5ii(d, a, b, c, x[i + 11], 10, -1120210379);\n c = md5ii(c, d, a, b, x[i + 2], 15, 718787259);\n b = md5ii(b, c, d, a, x[i + 9], 21, -343485551);\n a = safeAdd(a, olda);\n b = safeAdd(b, oldb);\n c = safeAdd(c, oldc);\n d = safeAdd(d, oldd);\n }\n\n return [a, b, c, d];\n}\n/*\n * Convert an array bytes to an array of little-endian words\n * Characters >255 have their high-byte silently ignored.\n */\n\n\nfunction bytesToWords(input) {\n if (input.length === 0) {\n return [];\n }\n\n var length8 = input.length * 8;\n var output = new Uint32Array(getOutputLength(length8));\n\n for (var i = 0; i < length8; i += 8) {\n output[i >> 5] |= (input[i / 8] & 0xff) << i % 32;\n }\n\n return output;\n}\n/*\n * Add integers, wrapping at 2^32. This uses 16-bit operations internally\n * to work around bugs in some JS interpreters.\n */\n\n\nfunction safeAdd(x, y) {\n var lsw = (x & 0xffff) + (y & 0xffff);\n var msw = (x >> 16) + (y >> 16) + (lsw >> 16);\n return msw << 16 | lsw & 0xffff;\n}\n/*\n * Bitwise rotate a 32-bit number to the left.\n */\n\n\nfunction bitRotateLeft(num, cnt) {\n return num << cnt | num >>> 32 - cnt;\n}\n/*\n * These functions implement the four basic operations the algorithm uses.\n */\n\n\nfunction md5cmn(q, a, b, x, s, t) {\n return safeAdd(bitRotateLeft(safeAdd(safeAdd(a, q), safeAdd(x, t)), s), b);\n}\n\nfunction md5ff(a, b, c, d, x, s, t) {\n return md5cmn(b & c | ~b & d, a, b, x, s, t);\n}\n\nfunction md5gg(a, b, c, d, x, s, t) {\n return md5cmn(b & d | c & ~d, a, b, x, s, t);\n}\n\nfunction md5hh(a, b, c, d, x, s, t) {\n return md5cmn(b ^ c ^ d, a, b, x, s, t);\n}\n\nfunction md5ii(a, b, c, d, x, s, t) {\n return md5cmn(c ^ (b | ~d), a, b, x, s, t);\n}\n\nexport default md5;","import v35 from './v35.js';\nimport md5 from './md5.js';\nvar v3 = v35('v3', 0x30, md5);\nexport default v3;","import rng from './rng.js';\nimport stringify from './stringify.js';\n\nfunction v4(options, buf, offset) {\n options = options || {};\n var rnds = options.random || (options.rng || rng)(); // Per 4.4, set bits for version and `clock_seq_hi_and_reserved`\n\n rnds[6] = rnds[6] & 0x0f | 0x40;\n rnds[8] = rnds[8] & 0x3f | 0x80; // Copy bytes to buffer, if provided\n\n if (buf) {\n offset = offset || 0;\n\n for (var i = 0; i < 16; ++i) {\n buf[offset + i] = rnds[i];\n }\n\n return buf;\n }\n\n return stringify(rnds);\n}\n\nexport default v4;","// Adapted from Chris Veness' SHA1 code at\n// http://www.movable-type.co.uk/scripts/sha1.html\nfunction f(s, x, y, z) {\n switch (s) {\n case 0:\n return x & y ^ ~x & z;\n\n case 1:\n return x ^ y ^ z;\n\n case 2:\n return x & y ^ x & z ^ y & z;\n\n case 3:\n return x ^ y ^ z;\n }\n}\n\nfunction ROTL(x, n) {\n return x << n | x >>> 32 - n;\n}\n\nfunction sha1(bytes) {\n var K = [0x5a827999, 0x6ed9eba1, 0x8f1bbcdc, 0xca62c1d6];\n var H = [0x67452301, 0xefcdab89, 0x98badcfe, 0x10325476, 0xc3d2e1f0];\n\n if (typeof bytes === 'string') {\n var msg = unescape(encodeURIComponent(bytes)); // UTF8 escape\n\n bytes = [];\n\n for (var i = 0; i < msg.length; ++i) {\n bytes.push(msg.charCodeAt(i));\n }\n } else if (!Array.isArray(bytes)) {\n // Convert Array-like to Array\n bytes = Array.prototype.slice.call(bytes);\n }\n\n bytes.push(0x80);\n var l = bytes.length / 4 + 2;\n var N = Math.ceil(l / 16);\n var M = new Array(N);\n\n for (var _i = 0; _i < N; ++_i) {\n var arr = new Uint32Array(16);\n\n for (var j = 0; j < 16; ++j) {\n arr[j] = bytes[_i * 64 + j * 4] << 24 | bytes[_i * 64 + j * 4 + 1] << 16 | bytes[_i * 64 + j * 4 + 2] << 8 | bytes[_i * 64 + j * 4 + 3];\n }\n\n M[_i] = arr;\n }\n\n M[N - 1][14] = (bytes.length - 1) * 8 / Math.pow(2, 32);\n M[N - 1][14] = Math.floor(M[N - 1][14]);\n M[N - 1][15] = (bytes.length - 1) * 8 & 0xffffffff;\n\n for (var _i2 = 0; _i2 < N; ++_i2) {\n var W = new Uint32Array(80);\n\n for (var t = 0; t < 16; ++t) {\n W[t] = M[_i2][t];\n }\n\n for (var _t = 16; _t < 80; ++_t) {\n W[_t] = ROTL(W[_t - 3] ^ W[_t - 8] ^ W[_t - 14] ^ W[_t - 16], 1);\n }\n\n var a = H[0];\n var b = H[1];\n var c = H[2];\n var d = H[3];\n var e = H[4];\n\n for (var _t2 = 0; _t2 < 80; ++_t2) {\n var s = Math.floor(_t2 / 20);\n var T = ROTL(a, 5) + f(s, b, c, d) + e + K[s] + W[_t2] >>> 0;\n e = d;\n d = c;\n c = ROTL(b, 30) >>> 0;\n b = a;\n a = T;\n }\n\n H[0] = H[0] + a >>> 0;\n H[1] = H[1] + b >>> 0;\n H[2] = H[2] + c >>> 0;\n H[3] = H[3] + d >>> 0;\n H[4] = H[4] + e >>> 0;\n }\n\n return [H[0] >> 24 & 0xff, H[0] >> 16 & 0xff, H[0] >> 8 & 0xff, H[0] & 0xff, H[1] >> 24 & 0xff, H[1] >> 16 & 0xff, H[1] >> 8 & 0xff, H[1] & 0xff, H[2] >> 24 & 0xff, H[2] >> 16 & 0xff, H[2] >> 8 & 0xff, H[2] & 0xff, H[3] >> 24 & 0xff, H[3] >> 16 & 0xff, H[3] >> 8 & 0xff, H[3] & 0xff, H[4] >> 24 & 0xff, H[4] >> 16 & 0xff, H[4] >> 8 & 0xff, H[4] & 0xff];\n}\n\nexport default sha1;","import v35 from './v35.js';\nimport sha1 from './sha1.js';\nvar v5 = v35('v5', 0x50, sha1);\nexport default v5;","export default '00000000-0000-0000-0000-000000000000';","import validate from './validate.js';\n\nfunction version(uuid) {\n if (!validate(uuid)) {\n throw TypeError('Invalid UUID');\n }\n\n return parseInt(uuid.substr(14, 1), 16);\n}\n\nexport default version;","module.exports = __WEBPACK_EXTERNAL_MODULE__893__;","// The module cache\nvar __webpack_module_cache__ = {};\n\n// The require function\nfunction __webpack_require__(moduleId) {\n\t// Check if module is in cache\n\tvar cachedModule = __webpack_module_cache__[moduleId];\n\tif (cachedModule !== undefined) {\n\t\treturn cachedModule.exports;\n\t}\n\t// Create a new module (and put it into the cache)\n\tvar module = __webpack_module_cache__[moduleId] = {\n\t\t// no module.id needed\n\t\t// no module.loaded needed\n\t\texports: {}\n\t};\n\n\t// Execute the module function\n\t__webpack_modules__[moduleId](module, module.exports, __webpack_require__);\n\n\t// Return the exports of the module\n\treturn module.exports;\n}\n\n","// getDefaultExport function for compatibility with non-harmony modules\n__webpack_require__.n = (module) => {\n\tvar getter = module && module.__esModule ?\n\t\t() => (module['default']) :\n\t\t() => (module);\n\t__webpack_require__.d(getter, { a: getter });\n\treturn getter;\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__.g = (function() {\n\tif (typeof globalThis === 'object') return globalThis;\n\ttry {\n\t\treturn this || new Function('return this')();\n\t} catch (e) {\n\t\tif (typeof window === 'object') return window;\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};","var scriptUrl;\nif (__webpack_require__.g.importScripts) scriptUrl = __webpack_require__.g.location + \"\";\nvar document = __webpack_require__.g.document;\nif (!scriptUrl && document) {\n\tif (document.currentScript)\n\t\tscriptUrl = document.currentScript.src;\n\tif (!scriptUrl) {\n\t\tvar scripts = document.getElementsByTagName(\"script\");\n\t\tif(scripts.length) {\n\t\t\tvar i = scripts.length - 1;\n\t\t\twhile (i > -1 && (!scriptUrl || !/^http(s?):/.test(scriptUrl))) scriptUrl = scripts[i--].src;\n\t\t}\n\t}\n}\n// When supporting browsers where an automatic publicPath is not supported you must specify an output.publicPath manually via configuration\n// or pass an empty string (\"\") and set the __webpack_public_path__ variable from your code to use your own logic.\nif (!scriptUrl) throw new Error(\"Automatic publicPath is not supported in this browser\");\nscriptUrl = scriptUrl.replace(/#.*$/, \"\").replace(/\\?.*$/, \"\").replace(/\\/[^\\/]+$/, \"/\");\n__webpack_require__.p = scriptUrl;","export default __webpack_public_path__ + \"02188894d5236b1517df3210b79c2a7f.svg\";","import './d3-context-menu.css';\nimport ArrowIcon from './img/play.svg';\n\nimport d3 from 'd3';\nimport slugid from 'slugid';\n\nexport function contextMenu(menu, opts) {\n let previouslyMouseUp = false;\n let clickAway = () => {};\n let uid = slugid.nice();\n let rootElement = null;\n let orientation = 'right'; // display the menu to the right of the mouse click\n // or parent elemement\n let initialPos = null;\n let parentStart = null;\n\n var openCallback,\n closeCallback;\n\n if (typeof opts === 'function') {\n openCallback = opts;\n } else {\n opts = opts || {};\n openCallback = opts.onOpen;\n closeCallback = opts.onClose;\n }\n\n if ('rootElement' in opts)\n rootElement = opts['rootElement']\n\n if ('pos' in opts) {\n // do we want to place this menu somewhere specific?\n initialPos = opts.pos;\n }\n\n if ('orientation' in opts) {\n orientation = opts.orientation;\n }\n\n if ('parentStart' in opts) {\n parentStart = opts.parentStart;\n }\n\n // create the div element that will hold the context menu\n d3.selectAll('.d3-context-menu-' + uid).data([1])\n .enter()\n .append('div')\n .classed('d3-context-menu', true)\n .classed('d3-context-menu-' + uid, true)\n\n // close menu\n d3.select('body').on('click.d3-context-menu-' + uid, function() {\n if (previouslyMouseUp) {\n previouslyMouseUp = false;\n return;\n }\n console.log('body click close');\n\n d3.select('.d3-context-menu-' + uid).style('display', 'none');\n orientation = 'right';\n\n if (closeCallback) {\n closeCallback();\n }\n });\n\n // this gets executed when a contextmenu event occurs\n return function(data, index, pMouseUp=false,\n clickAwayFunc = function() { } ) {\n var elm = this;\n var contextMenuPos = null;\n let mousePos = null;\n let currentThis = this;\n\n if (rootElement == null)\n mousePos = d3.mouse(this);\n else\n mousePos = d3.mouse(rootElement); // for recursive menus, we need the mouse\n // position relative to another element\n\n clickAway = clickAwayFunc;\n let openChildMenuUid = null;\n\n previouslyMouseUp = pMouseUp;\n\n d3.selectAll('.d3-context-menu-' + uid).html('');\n var list = d3.selectAll('.d3-context-menu-' + uid)\n .on('contextmenu', function(d) {\n console.log('context-menu close');\n d3.select('.d3-context-menu-' + uid).style('display', 'none'); \n orientation = 'right';\n\n d3.event.preventDefault();\n d3.event.stopPropagation();\n })\n .append('ul');\n\n list.selectAll('li').data(typeof menu === 'function' ? menu(data) : menu).enter()\n .append('li')\n .attr('class', function(d) {\n console.log('d:', d);\n var ret = '';\n if (d.divider) {\n ret += ' is-divider';\n }\n if (d.disabled) {\n ret += ' is-disabled';\n }\n if (!d.action) {\n ret += ' is-header';\n }\n if ('children' in d) {\n ret += ' d3-context-menu-recursive';\n }\n return ret;\n })\n .html(function(d) {\n if (d.divider) {\n return '
';\n }\n if (!d.title) {\n console.error('No title attribute set. Check the spelling of your options.');\n }\n return (typeof d.title === 'string') ? d.title : d.title(data);\n })\n .on('click', function(d, i) {\n if (d.disabled) return; // do nothing if disabled\n if (!d.action) return; // headers have no \"action\"\n d.action(elm, data, index, mousePos);\n console.log('click close');\n\n // close all context menus\n d3.selectAll('.d3-context-menu').style('display', 'none');\n orientation = 'right';\n\n if (closeCallback) {\n closeCallback();\n }\n })\n .on('mouseenter', function(d, i) {\n d3.select(this)\n .classed('d3-context-menu-selected', true)\n\n if (openChildMenuUid != null) {\n // there's a child menu open\n\n // unselect all items\n d3.select('.d3-context-menu-' + uid)\n .selectAll('li')\n .classed('d3-context-menu-selected', false);\n\n if (typeof d.children == 'undefined') {\n console.log(\"no children close\");\n // no children, so hide any open child menus\n d3.select('.d3-context-menu-' + openChildMenuUid)\n .style('display', 'none');\n\n openChildMenuUid = null;\n return;\n }\n\n if (d.childUid == openChildMenuUid) {\n // the correct child menu is already open\n return;\n\n } else {\n // need to open a different child menu\n console.log('open different child menu close');\n \n // close the already open one\n d3.select('.d3-context-menu-' + openChildMenuUid)\n .style('display', 'none');\n\n openChildMenuUid = null;\n\n }\n } \n\n // there should be no menu open right now\n if (typeof d.children != 'undefined') {\n let boundingRect = this.getBoundingClientRect();\n\n let childrenContextMenu = null\n if (orientation == 'left') {\n childrenContextMenu = contextMenu(d.children, {'rootElement': currentThis,\n 'pos': [ boundingRect.left + window.pageXOffset,\n boundingRect.top - 2 + window.pageYOffset],\n 'orientation': 'left'});\n } else {\n childrenContextMenu = contextMenu(d.children, \n {\n 'pos': [ boundingRect.left + boundingRect.width + window.pageXOffset,\n boundingRect.top - 2 + window.pageYOffset],\n 'rootElement': currentThis,\n 'parentStart': [boundingRect.left + window.pageXOffset,\n boundingRect.top - 2 + window.pageYOffset]});\n }\n\n d.childUid = childrenContextMenu.apply(this, [data,i,true,\n function() { }]);\n openChildMenuUid = d.childUid;\n }\n\n\n d3.select(this)\n .classed('d3-context-menu-selected', true)\n \n })\n .on('mouseleave', function(d, i) {\n\n if (openChildMenuUid == null) {\n d3.select(this)\n .classed('d3-context-menu-selected', false);\n }\n });\n\n list.selectAll('.d3-context-menu-recursive')\n .append('img')\n .attr('src', ArrowIcon)\n .attr('width', '14px')\n .attr('height', '14px')\n .style('position', 'absolute')\n .style('right', '5px')\n ;\n\n // the openCallback allows an action to fire before the menu is displayed\n // an example usage would be closing a tooltip\n if (openCallback) {\n if (openCallback(data, index) === false) {\n return uid;\n }\n }\n\n let contextMenuSelection = d3.select('.d3-context-menu-' + uid)\n .style('display', 'block');\n\n if (initialPos == null) {\n d3.select('.d3-context-menu-' + uid)\n .style('left', (d3.event.pageX - 2) + 'px')\n .style('top', (d3.event.pageY - 2) + 'px')\n } else {\n d3.select('.d3-context-menu-' + uid)\n .style('left', initialPos[0] + 'px')\n .style('top', initialPos[1] + 'px')\n }\n\n // check if the menu disappears off the side of the window\n let boundingRect = contextMenuSelection.node().getBoundingClientRect();\n\n if (boundingRect.left + boundingRect.width > window.innerWidth || orientation == 'left') {\n orientation = 'left';\n\n // menu goes of the end of the window, position it the other way\n if (initialPos == null) {\n // place the menu where the user clicked\n d3.select('.d3-context-menu-' + uid)\n .style('left', (d3.event.pageX - 2 - boundingRect.width) + 'px')\n .style('top', (d3.event.pageY - 2) + 'px')\n } else {\n if (parentStart != null) {\n d3.select('.d3-context-menu-' + uid)\n .style('left', (parentStart[0] - boundingRect.width) + 'px')\n .style('top', parentStart[1] + 'px')\n } else {\n d3.select('.d3-context-menu-' + uid)\n .style('left', (initialPos[0] - boundingRect.width) + 'px')\n .style('top', initialPos[1] + 'px')\n }\n }\n \n }\n\n // display context menu\n\n if (previouslyMouseUp)\n return uid;\n\n d3.event.preventDefault();\n d3.event.stopPropagation();\n //d3.event.stopImmediatePropagation();\n //\n return uid;\n };\n};\n","var numberSort = function(a,b) { return a - b; };\n\nexport function arraysEqual(a, b) {\n // courtesy of \n // http://stackoverflow.com/questions/3115982/how-to-check-if-two-arrays-are-equal-with-javascript\n if (a === b) return true;\n if (a === null || b === null) return false;\n if (a.length != b.length) return false;\n\n // If you don't care about the order of the elements inside\n // the array, you should sort both arrays here.\n\n for (var i = 0; i < a.length; ++i) {\n if (a[i] !== b[i]) return false;\n }\n return true;\n}\n\nexport function RNAUtilities() {\n var self = this;\n\n // the brackets to use when constructing dotbracket strings\n // with pseudoknots\n self.bracketLeft = \"([{abcdefghijklmnopqrstuvwxyz\".split(\"\");\n\n self.inverseBrackets = function(bracket) {\n var res = {};\n for (var i = 0; i < bracket.length; i++) {\n res[bracket[i]] = i;\n }\n return res;\n };\n\n self.maximumMatching = function maximumMatching(pt){\n // Courtesy of the great Ronny Lorenz\n\n var n = pt[0];\n var TURN = 0; //minimal number of nucleotides in the hairpin\n\n /* array init */\n var mm = new Array(n + 1);\n for(var i = 0; i <= n; i++){\n mm[i] = new Array(n + 1);\n for(var j = i; j <= n; j++)\n mm[i][j] = 0;\n }\n var maximum = 0;\n\n /* actual computation */\n for(var i = n - TURN - 1; i > 0; i--)\n\n for(var j = i + TURN + 1; j <= n; j++){\n maximum = mm[i][j-1];\n\n for(var l = j - TURN - 1; l >= i; l--) {\n if(pt[l] === j) {\n\n // we have a base pair here\n maximum = Math.max(maximum, ((l > i) ? mm[i][l-1] : 0) + 1 + ((j - l - 1 > 0) ? mm[l+1][j-1] : 0));\n }\n }\n\n mm[i][j] = maximum;\n }\n\n maximum = mm[1][n];\n\n return mm;\n };\n\n self.backtrackMaximumMatching = function(mm, oldPt) {\n var pt = Array.apply(null, \n Array(mm.length)).map(function() { return 0 }); \n //create an array containing zeros\n\n self.mmBt(mm, pt, oldPt, 1, mm.length-1);\n return pt;\n }\n\n self.mmBt = function(mm, pt, oldPt, i, j){\n // Create a pairtable from the backtracking\n var maximum = mm[i][j];\n var TURN = 0;\n\n if(j - i - 1 < TURN) return; /* no more pairs */\n\n if(mm[i][j-1] == maximum){ /* j is unpaired */\n self.mmBt(mm, pt, oldPt, i, j-1);\n return;\n }\n\n for(var q = j - TURN - 1; q >= i; q--){ /* j is paired with some q */\n if (oldPt[j] !== q)\n continue;\n\n var leftPart = (q > i) ? mm[i][q-1] : 0;\n var enclosedPart = (j - q - 1 > 0) ? mm[q+1][j-1] : 0;\n\n if(leftPart + enclosedPart + 1 == maximum) {\n // there's a base pair between j and q\n pt[q] = j;\n pt[j] = q;\n\n if(i < q) \n self.mmBt(mm, pt, oldPt, i, q - 1);\n\n self.mmBt(mm, pt, oldPt, q + 1, j - 1);\n return;\n }\n }\n\n //alert(i + \",\" + j + \": backtracking failed!\");\n console.log('FAILED!!!' + i + ',' + j + ': backtracking failed!');\n\n };\n\n self.dotbracketToPairtable = function(dotbracket) {\n // create an array and initialize it to 0\n var pt = Array.apply(null, new Array(dotbracket.length + 1)).map(Number.prototype.valueOf,0);\n \n // the first element is always the length of the RNA molecule\n pt[0] = dotbracket.length;\n\n // store the pairing partners for each symbol\n var stack = {};\n for (var i = 0; i < self.bracketLeft.length; i++) {\n stack[i] = [];\n }\n\n // lookup the index of each symbol in the bracket array\n var inverseBracketLeft = self.inverseBrackets(self.bracketLeft);\n var inverseBracketRight = self.inverseBrackets(self.bracketRight);\n\n for (var i = 0; i < dotbracket.length; i++) {\n var a = dotbracket[i];\n var ni = i + 1;\n\n if (a == '.' || a == 'o') {\n // unpaired\n pt[ni] = 0;\n } else {\n if (a in inverseBracketLeft) {\n // open pair?\n stack[inverseBracketLeft[a]].push(ni);\n } else if (a in inverseBracketRight){\n // close pair?\n var j = stack[inverseBracketRight[a]].pop();\n\n pt[ni] = j;\n pt[j] = ni;\n } else if (a == '&'){\n // there is a sequence break here, ignore it\n } else {\n throw \"Unknown symbol in dotbracket string\";\n }\n }\n }\n\n for (var key in stack) {\n if (stack[key].length > 0) {\n throw \"Unmatched base at position \" + stack[key][0];\n }\n }\n\n return pt;\n };\n\n self.insertIntoStack = function(stack, i, j) {\n var k = 0;\n while (stack[k].length > 0 && stack[k][stack[k].length - 1] < j) {\n k += 1;\n }\n\n stack[k].push(j);\n return k;\n };\n\n self.deleteFromStack = function(stack, j) {\n var k = 0;\n while (stack[k].length === 0 || stack[k][stack[k].length-1] != j) {\n k += 1;\n }\n stack[k].pop();\n return k;\n };\n\n self.pairtableToDotbracket = function(pt) {\n // store the pairing partners for each symbol\n var stack = {};\n for (var i = 0; i < pt[0]; i++) {\n stack[i] = [];\n }\n\n var seen = {};\n var res = \"\";\n var i;\n for (var i = 1; i < pt[0] + 1; i++) {\n if (pt[i] !== 0 && pt[i] in seen) {\n throw \"Invalid pairtable contains duplicate entries\";\n }\n seen[pt[i]] = true;\n\n if (pt[i] === 0) {\n res += '.';\n } else {\n if (pt[i] > i) {\n res += self.bracketLeft[self.insertIntoStack(stack, i, pt[i])];\n } else {\n res += self.bracketRight[self.deleteFromStack(stack, i)];\n }\n }\n }\n\n return res;\n };\n\n self.findUnmatched = function(pt, from, to) {\n /*\n * Find unmatched nucleotides in this molecule.\n */\n var toRemove = [];\n var unmatched = [];\n\n var origFrom = from;\n var origTo = to;\n var i;\n\n for (var i = from; i <= to; i++)\n if (pt[i] !== 0 && (pt[i] < from || pt[i] > to))\n unmatched.push([i,pt[i]]);\n\n for (var i = origFrom; i <= origTo; i++) {\n while (pt[i] === 0 && i <= origTo) i++;\n\n to = pt[i];\n\n while (pt[i] === to) {\n i++;\n to--;\n }\n \n toRemove = toRemove.concat(self.findUnmatched(pt, i, to));\n }\n\n if (unmatched.length > 0)\n toRemove.push(unmatched);\n\n return toRemove;\n };\n\n self.removePseudoknotsFromPairtable = function(pt) {\n /* Remove the pseudoknots from this structure in such a fashion\n * that the least amount of base-pairs need to be broken\n *\n * The pairtable is manipulated in place and a list of tuples\n * indicating the broken base pairs is returned.\n */\n\n var mm = self.maximumMatching(pt);\n var newPt = self.backtrackMaximumMatching(mm, pt);\n var removed = [];\n\n for (var i = 1; i < pt.length; i++) {\n if (pt[i] < i)\n continue;\n\n if (newPt[i] != pt[i]) {\n removed.push([i, pt[i]]);\n pt[pt[i]] = 0;\n pt[i] = 0;\n }\n }\n\n return removed;\n };\n\n self.ptToElements = function(pt, level, i, j, dotBracketBreaks) {\n /* Convert a pair table to a list of secondary structure \n * elements:\n *\n * [['s',1,[2,3]]\n *\n * The 's' indicates that an element can be a stem. It can also be\n * an interior loop ('i'), a hairpin loop ('h') or a multiloop ('m')\n *\n * The second number (1 in this case) indicates the depth or\n * how many base pairs have to be broken to get to this element.\n *\n * Finally, there is the list of nucleotides which are part of\n * of this element.\n */\n var elements = [];\n var u5 = [i-1];\n var u3 = [j+1];\n\n if (arguments.length < 5)\n dotBracketBreaks = [];\n\n if (i > j)\n return [];\n \n //iterate over the unpaired regions on either side\n //this is either 5' and 3' unpaired if level == 0\n //or an interior loop or a multiloop\n for (; pt[i] === 0; i++) { u5.push(i); }\n for (; pt[j] === 0; j--) { u3.push(j); }\n\n if (i > j) {\n //hairpin loop or one large unpaired molecule\n u5.push(i);\n if (level === 0)\n return [['e',level, u5.sort(numberSort)]];\n else {\n // check to see if we have chain breaks due\n // to multiple strands in the input\n var external = false;\n var left = [];\n var right = [];\n for (var k = 0; k < u5.length; k++) {\n if (external)\n right.push(u5[k]);\n else\n left.push(u5[k]);\n\n if (dotBracketBreaks.indexOf(u5[k]) >= 0)\n external = true;\n }\n\n if (external) {\n return [['h',level, u5.sort(numberSort)]];\n }\n else\n // if not, this is a simple hairpin loop\n return [['h',level, u5.sort(numberSort)]];\n }\n }\n\n if (pt[i] != j) {\n //multiloop\n var m = u5;\n var k = i;\n\n // the nucleotide before and the starting nucleotide\n m.push(k);\n while (k <= j) {\n // recurse into a stem\n elements = elements.concat(self.ptToElements(pt, level, k, pt[k], dotBracketBreaks));\n\n // add the nucleotides between stems\n m.push(pt[k]);\n k = pt[k] + 1;\n for (; pt[k] === 0 && k <= j; k++) { m.push(k);}\n m.push(k);\n }\n m.pop();\n m = m.concat(u3);\n \n if (m.length > 0) {\n if (level === 0)\n elements.push(['e', level, m.sort(numberSort)]);\n else\n elements.push(['m', level, m.sort(numberSort)]);\n }\n \n return elements;\n }\n\n if (pt[i] === j) {\n //interior loop\n u5.push(i);\n u3.push(j);\n\n var combined = u5.concat(u3);\n if (combined.length > 4) {\n if (level === 0)\n elements.push(['e',level, u5.concat(u3).sort(numberSort)]);\n else\n elements.push(['i',level, u5.concat(u3).sort(numberSort)]);\n }\n } \n\n var s = [];\n //go through the stem\n while (pt[i] === j && i < j) {\n //one stem\n s.push(i);\n s.push(j);\n\n i += 1;\n j -= 1;\n\n level += 1;\n }\n\n u5 = [i-1];\n u3 = [j+1];\n elements.push(['s', level, s.sort(numberSort)]);\n\n return elements.concat(self.ptToElements(pt, level, i, j, dotBracketBreaks));\n };\n\n}\n\nexport var rnaUtilities = new RNAUtilities();\n\nexport function ColorScheme(colorsText) {\n var self = this;\n self.colorsText = colorsText;\n\n self.parseRange = function(rangeText) {\n //parse a number range such as 1-10 or 3,7,9 or just 7\n var parts = rangeText.split(',')\n var nums = [];\n\n for (var i = 0; i < parts.length; i++) {\n //could be 1 or 10-11 or something like that\n var parts1 = parts[i].split('-');\n\n if (parts1.length == 1)\n nums.push(parseInt(parts1[0]));\n else if (parts1.length == 2) {\n var from = parseInt(parts1[0]);\n var to = parseInt(parts1[1]);\n\n // add each number in this range\n for (var j = from; j <= to; j++) \n nums.push(j)\n } else {\n console.log('Malformed range (too many dashes):', rangeText);\n }\n }\n\n return nums;\n }\n\n self.parseColorText = function(colorText) {\n /* Parse the text of an RNA color string. Instructions and description\n * of the format are given below.\n *\n * The return is a json double dictionary indexed first by the \n * molecule name, then by the nucleotide. This is then applied\n * by force.js to the RNAs it is displaying. When no molecule\n * name is specified, the color is applied to all molecules*/\n var lines = colorText.split('\\n');\n var currMolecule = '';\n var counter = 1;\n var colorsJson = {colorValues: {'':{}}, range:['white', 'steelblue']};\n var domainValues = [];\n\n\n for (var i = 0; i < lines.length; i++) {\n\n if (lines[i][0] == '>') {\n // new molecule\n currMolecule = lines[i].trim().slice(1);\n counter = 1;\n\n colorsJson.colorValues[currMolecule] = {};\n continue;\n }\n\n let words = lines[i].trim().split(/[\\s]+/);\n\n for (var j = 0; j < words.length; j++) {\n if (isNaN(words[j])) {\n if (words[j].search('range') === 0) {\n //there's a color scale in this entry\n let parts = words[j].split('=');\n let partsRight = parts[1].split(':')\n colorsJson.range = [partsRight[0], partsRight[1]];\n continue;\n }\n\n if (words[j].search('domain') == 0) {\n //there's a color scale in this entry\n let parts = words[j].split('=');\n let partsRight = parts[1].split(':')\n colorsJson.domain = [partsRight[0], partsRight[1]];\n continue;\n }\n\n // it's not a number, should be a combination \n // of a number (nucleotide #) and a color\n let parts = words[j].split(':');\n let nums = self.parseRange(parts[0]);\n let color = parts[1]\n\n for (var k = 0; k < nums.length; k++) {\n if (isNaN(color)) {\n colorsJson.colorValues[currMolecule][nums[k]] = color;\n } else {\n colorsJson.colorValues[currMolecule][nums[k]] = +color;\n domainValues.push(Number(color));\n }\n }\n } else {\n //it's a number, so we add it to the list of values\n //seen for this molecule\n colorsJson.colorValues[currMolecule][counter] = Number(words[j]);\n counter += 1;\n\n domainValues.push(Number(words[j]));\n }\n }\n }\n\n if (!('domain' in colorsJson))\n colorsJson.domain = [Math.min.apply(null, domainValues), Math.max.apply(null, domainValues)];\n\n self.colorsJson = colorsJson;\n\n return self;\n };\n\n self.normalizeColors = function() {\n /* \n * Normalize the passed in values so that they range from\n * 0 to 1\n */\n var value;\n\n for (var moleculeName in self.colorsJson) {\n var minNum = Number.MAX_VALUE;\n var maxNum = Number.MIN_VALUE;\n\n // iterate once to find the min and max values;\n for (var resnum in self.colorsJson.colorValues[moleculeName]) {\n value = self.colorsJson.colorValues[moleculeName][resnum];\n if (typeof value == 'number') {\n if (value < minNum)\n minNum = value;\n if (value > maxNum)\n maxNum = value;\n }\n }\n\n // iterate again to normalize\n for (resnum in self.colorsJson.colorValues[moleculeName]) {\n value = self.colorsJson.colorValues[moleculeName][resnum];\n if (typeof value == 'number') {\n self.colorsJson.colorValues[moleculeName][resnum] = (value - minNum ) / (maxNum - minNum);\n }\n }\n }\n\n return self;\n };\n\n self.parseColorText(self.colorsText);\n return self;\n}\n","import {arraysEqual,RNAUtilities,rnaUtilities} from './rnautils.js';\nimport slugid from 'slugid';\n\nvar numberSort = function(a,b) { return a - b; };\n\nif (typeof(String.prototype.trim) === 'undefined') {\n String.prototype.trim = function() {\n return String(this).replace(/^\\s+|\\s+$/g, '');\n };\n}\n\nexport function ProteinGraph(structName, size, uid) {\n var self = this;\n\n self.type = 'protein';\n self.size = size;\n self.nodes = [{'name': 'P',\n 'num': 1,\n 'radius': 3 * Math.sqrt(size),\n 'rna': self,\n 'nodeType': 'protein',\n 'structName': structName,\n 'elemType': 'p',\n 'size': size,\n 'uid': slugid.nice()}];\n\n self.links = [];\n self.uid = slugid.nice();\n\n self.addUids = function(uids) {\n for (let i = 0; i < uids.length; i++)\n self.nodes[i].uid = uids[i];\n\n return self;\n };\n\n self.getUids = function() {\n /* Get the positions of each node so that they\n * can be passed to elementsToJson later\n */\n uids = [];\n for (let i = 0; i < self.dotbracket.length; i++)\n uids.push(self.nodes[i].uid);\n\n return uids;\n };\n\n}\n\nexport function RNAGraph(seq = '', dotbracket = '', structName = '', startNumber = 1) {\n var self = this;\n\n self.type = 'rna';\n self.circularizeExternal = false;\n self.seq = seq;\n self.dotbracket = dotbracket; //i.e. ..((..))..\n self.structName = structName;\n self.circular = false;\n\n if (self.dotbracket.slice(-1) == '*') {\n //circular RNA\n self.dotbracket = self.dotbracket.slice(0, -1);\n self.circular = true;\n }\n\n self.uid = slugid.nice();\n\n self.elements = []; //store the elements and the\n //nucleotides they contain\n self.pseudoknotPairs = [];\n self.nucsToNodes = {};\n\n self.addUids = function(uids) {\n let nucleotideNodes = self.nodes.filter(function(d) { return d.nodeType == 'nucleotide'; });\n\n for (let i = 0; i < uids.length && i < nucleotideNodes.length; i++) {\n nucleotideNodes[i].uid = uids[i];\n }\n\n return self;\n };\n\n self.computePairtable = function() {\n self.pairtable = rnaUtilities.dotbracketToPairtable(self.dotbracket);\n };\n\n // self.removeBreaks = function(targetString) {\n // // Collect the indexes of the chain breaks in the targetString\n // // chain breaks are indicated by '&'\n // var breaks = [];\n // for (var i = 0; i < targetString.length; i++) {\n // if (targetString[i] === '&') {\n // breaks.push(i);\n // }\n // }\n\n // return {targetString: targetString, breaks: breaks};\n // };\n\n // var ret = self.removeBreaks(self.dotbracket);\n // commented out to avoid removing the break node, let's keep it in the dotbracket\n // self.dotbracket = ret.targetString;\n // self.dotBracketBreaks = ret.breaks;\n\n // ret = self.removeBreaks(self.seq);\n // commented out to avoid removing the break node, let's keep it in the sequence\n // self.seq = ret.targetString;\n // self.seqBreaks = ret.breaks;\n\n self.rnaLength = self.dotbracket.length;\n\n // if (!arraysEqual(self.dotBracketBreaks, self.seqBreaks)) {\n // console.log('WARNING: Sequence and structure breaks not equal');\n // console.log('WARNING: Using the breaks in the structure');\n // }\n\n self.computePairtable();\n\n self.addPositions = function(nodeType, positions) {\n let labelNodes = self.nodes.filter(function(d) { return d.nodeType == nodeType; });\n\n for (let i = 0; i < labelNodes.length; i++) {\n labelNodes[i].x = positions[i][0];\n labelNodes[i].y = positions[i][1];\n }\n\n return self;\n };\n\n self.breakNodesToFakeNodes = function() {\n // convert all the nodes following breaks to fake nodes\n let labelNodes = self.nodes.filter(function(d) { return d.nodeType == 'nucleotide'; });\n\n // // if a node was an artifical break node, convert it to a middle\n // for (let i = 0; i < labelNodes.length; i++) {\n // if (self.dotBracketBreaks.indexOf(i) >= 0) {\n // labelNodes[i].nodeType = 'middle';\n // // commented out to avoid removing the node after the break\n // // labelNodes[i+1].nodeType = 'middle';\n // }\n // }\n\n for (let i = 0; i < self.elements.length; i++) {\n var broken = false;\n\n // // change the elemType of the other nodes in the element containing\n // // the break\n // for (let j = 0; j < self.elements[i][2].length; j++) {\n // if (self.dotBracketBreaks.indexOf(self.elements[i][2][j]) >= 0)\n // broken = true;\n // }\n\n if (broken) {\n self.elements[i][2].map(function(x) {\n if (x == 0)\n return;\n self.nodes[x-1].elemType = 'e';\n });\n } else {\n self.elements[i][2].map(function(x) {\n if (x == 0)\n return;\n self.nodes[x-1].elemType = self.elements[i][0];\n });\n }\n }\n return self;\n };\n\n self.getPositions = function(nodeType) {\n var positions = [];\n let nucleotideNodes = self.nodes.filter(function(d) { return d.nodeType == nodeType; });\n\n for (let i = 0; i < nucleotideNodes.length; i++)\n positions.push([nucleotideNodes[i].x, nucleotideNodes[i].y]);\n\n return positions;\n };\n\n self.getUids = function() {\n /* Get the positions of each node so that they\n * can be passed to elementsToJson later\n */\n var uids = [];\n for (let i = 0; i < self.dotbracket.length; i++)\n uids.push(self.nodes[i].uid);\n\n return uids;\n };\n\n self.reinforceStems = function() {\n var pt = self.pairtable;\n let relevantElements = self.elements.filter( function(d) {\n return d[0] == 's' && d[2].length >= 4;\n });\n\n for (let i = 0; i < relevantElements.length; i++) {\n let allNucs = relevantElements[i][2];\n let nucs = allNucs.slice(0, allNucs.length / 2);\n\n for (let j = 0; j < nucs.length-1; j++) {\n self.addFakeNode([nucs[j], nucs[j+1], pt[nucs[j+1]], pt[nucs[j]]]);\n }\n }\n\n return self;\n };\n\n self.reinforceLoops = function() {\n /*\n * Add a set of fake nodes to enforce the structure\n */\n var filterNucs = function(d) {\n return d !== 0 && d <= self.dotbracket.length;\n };\n\n for (let i = 0; i < self.elements.length; i++) {\n if (self.elements[i][0] == 's' || (!self.circularizeExternal && self.elements[i][0] == 'e'))\n continue;\n\n var nucs = self.elements[i][2].filter(filterNucs);\n\n if (self.elements[i][0] == 'e') {\n var newNode1 = {'name': '',\n 'num': -3,\n //'radius': 18 * radius -6,\n 'radius': 0,\n 'rna': self,\n 'nodeType': 'middle',\n 'elemType': 'f',\n 'nucs': [],\n 'x': self.nodes[self.rnaLength-1].x,\n 'y': self.nodes[self.rnaLength-1].y,\n 'px': self.nodes[self.rnaLength-1].px,\n 'py': self.nodes[self.rnaLength-1].py,\n 'uid': slugid.nice() };\n var newNode2 = {'name': '',\n 'num': -2,\n //'radius': 18 * radius -6,\n 'radius': 0,\n 'rna': self,\n 'nodeType': 'middle',\n 'elemType': 'f',\n 'nucs': [],\n 'x': self.nodes[0].x,\n 'y': self.nodes[0].y,\n 'px': self.nodes[0].px,\n 'py': self.nodes[0].py,\n 'uid': slugid.nice() };\n\n nucs.push(self.nodes.length+1);\n nucs.push(self.nodes.length+2);\n self.nodes.push(newNode1);\n self.nodes.push(newNode2);\n }\n\n\n self.addFakeNode(nucs);\n }\n\n return self;\n };\n\n self.updateLinkUids = function() {\n for (let i = 0; i < self.links.length; i++) {\n self.links[i].uid = self.links[i].source.uid + self.links[i].target.uid;\n }\n\n return self;\n };\n\n self.addFakeNode = function(nucs) {\n var linkLength = 18; //make sure this is consistent with the value in force.js\n var nodeWidth = 6;\n var angle = (3.1415 * 2) / (2 * nucs.length);\n var radius = linkLength / (2 * Math.tan(angle));\n\n var fakeNodeUid = '';\n\n for (let i = 0; i < nucs.length; i++)\n fakeNodeUid += self.nodes[nucs[i]-1].uid;\n\n var newNode = {'name': '',\n 'num': -1,\n //'radius': 18 * radius -6,\n 'radius': radius,\n 'rna': self,\n 'nodeType': 'middle',\n 'elemType': 'f',\n 'nucs': nucs,\n 'uid': fakeNodeUid };\n self.nodes.push(newNode);\n\n var newX = 0;\n var newY = 0;\n var coordsCounted = 0;\n\n angle = (nucs.length - 2) * 3.14159 / (2 * nucs.length);\n radius = 0.5 / Math.cos(angle);\n\n for (let j = 0; j < nucs.length; j++) {\n if (nucs[j] === 0 || nucs[j] > self.dotbracket.length)\n continue;\n\n //link to the center node\n self.links.push({'source': self.nodes[nucs[j] - 1],\n 'target': self.nodes[self.nodes.length-1],\n 'linkType': 'fake',\n 'value': radius,\n 'uid': slugid.nice() });\n\n if (nucs.length > 4) {\n //link across the loop\n self.links.push({'source': self.nodes[nucs[j] - 1],\n 'target': self.nodes[nucs[(j + Math.floor(nucs.length / 2)) % nucs.length] - 1],\n 'linkType': 'fake',\n 'value': radius * 2,\n 'uid': slugid.nice() });\n }\n\n var ia = ((nucs.length - 2) * 3.14159) / nucs.length;\n var c = 2 * Math.cos(3.14159 / 2 - ia / 2);\n //link to over-neighbor\n self.links.push({'source': self.nodes[nucs[j] - 1],\n 'target': self.nodes[nucs[(j + 2) % nucs.length] - 1],\n 'linkType': 'fake',\n 'value': c});\n\n // calculate the mean of the coordinats in this loop\n // and place the fake node there\n var fromNode = self.nodes[nucs[j]-1];\n if ('x' in fromNode) {\n newX += fromNode.x;\n newY += fromNode.y;\n\n coordsCounted += 1;\n }\n }\n\n if (coordsCounted > 0) {\n // the nucleotides had set positions so we can calculate the position\n // of the fake node\n newNode.x = newX / coordsCounted;\n newNode.y = newY / coordsCounted;\n newNode.px = newNode.x;\n newNode.py = newNode.y;\n }\n\n return self;\n };\n\n self.connectFakeNodes = function() {\n var linkLength = 18;\n\n // We want to be able to connect all of the fake nodes\n // and create a structure consisting of just them\n var filterOutNonFakeNodes = function(d) {\n return d.nodeType == 'middle';\n }\n\n var nucsToNodes = {};\n var fakeNodes = self.nodes.filter(filterOutNonFakeNodes);\n var linked = {};\n\n // initialize the nucleotides to nodes\n for (var i = 1; i <= self.nodes.length; i++)\n nucsToNodes[i] = [];\n\n for (var i = 0; i < fakeNodes.length; i++) {\n var thisNode = fakeNodes[i];\n\n // each fake node represents a certain set of nucleotides (thisNode.nucs)\n for (var j = 0; j < thisNode.nucs.length; j++) {\n var thisNuc = thisNode.nucs[j];\n\n // check to see if this nucleotide has been seen in another fake node\n // if it has, then we add a link between the two nodes\n for (var k = 0; k < nucsToNodes[thisNuc].length; k++) {\n if (JSON.stringify([nucsToNodes[thisNuc][k].uid, thisNode.uid].sort()) in linked)\n continue; //already linked\n\n var distance = nucsToNodes[thisNuc][k].radius + thisNode.radius;\n\n self.links.push({'source': nucsToNodes[thisNuc][k],\n 'target': thisNode,\n 'value': distance / linkLength,\n 'linkType': 'fake_fake'});\n\n // note that we've already seen this link\n linked[JSON.stringify([nucsToNodes[thisNuc][k].uid, thisNode.uid].sort())] = true;\n }\n\n nucsToNodes[thisNuc].push(thisNode);\n }\n }\n\n return self;\n\n };\n\n self.addExtraLinks = function(extraLinks) {\n if (typeof extraLinks == 'undefined')\n return self;\n\n for (var i = 0; i < extraLinks.length; i++) {\n var source = self.getNodeFromNucleotides(extraLinks[i].from);\n var target = self.getNodeFromNucleotides(extraLinks[i].to);\n\n var newLink = {'source': source, 'target': target, 'linkType': 'extra',\n 'extraLinkType': extraLinks[i].linkType, 'uid': slugid.nice() };\n\n self.links.push(newLink);\n }\n\n return self;\n }\n\n\n self.elementsToJson = function() {\n /* Convert a set of secondary structure elements to a json\n * representation of the graph that can be used with d3's\n * force-directed layout to generate a visualization of\n * the structure.\n */\n var pt = self.pairtable;\n var elements = self.elements;\n\n self.nodes = [];\n self.links = [];\n\n //create a reverse lookup so we can find out the type\n //of element that a node is part of\n var elemTypes = {};\n\n //sort so that we count stems last\n self.elements.sort();\n\n for (let i = 0; i < self.elements.length; i++) {\n var nucs = self.elements[i][2];\n for (let j = 0; j < nucs.length; j++) {\n elemTypes[nucs[j]] = self.elements[i][0];\n }\n }\n\n for (let i = 1; i <= pt[0]; i++) {\n var nodeName = self.seq[i-1];\n\n // // remove only the breaks that are in the sequence\n // if (self.dotBracketBreaks.indexOf(i-1) >= 0) {\n // nodeName = '';\n // }\n\n //create a node for each nucleotide\n self.nodes.push({'name': nodeName,\n 'num': startNumber + i - 1,\n 'radius': 5,\n 'rna': self,\n 'nodeType': 'nucleotide',\n 'structName': self.structName,\n 'elemType': elemTypes[i],\n 'uid': slugid.nice(),\n 'linked': false});\n }\n\n for (let i = 0; i < self.nodes.length; i++) {\n if (i === 0)\n self.nodes[i].prevNode = null;\n else {\n self.nodes[i].prevNode = self.nodes[i-1];\n }\n\n if (i == self.nodes.length-1)\n self.nodes[i].nextNode = null;\n else {\n self.nodes[i].nextNode = self.nodes[i+1];\n }\n }\n\n for (let i = 1; i <= pt[0]; i++) {\n\n if (pt[i] !== 0) {\n // base-pair links\n self.links.push({'source': self.nodes[i-1],\n 'target': self.nodes[pt[i]-1],\n 'linkType': 'basepair',\n 'value': 1,\n 'uid': slugid.nice() });\n }\n\n if (i > 1) {\n // backbone links\n // unlink only the break and the nucleotide before it\n // if (self.dotBracketBreaks.indexOf(i-1) === -1 &&\n // self.dotBracketBreaks.indexOf(i-2) == -1) {\n // there is no break in the strands here\n // we can add a backbone link\n self.links.push({'source': self.nodes[i-2],\n 'target': self.nodes[i-1],\n 'linkType': 'backbone',\n 'value': 1,\n 'uid': slugid.nice() });\n self.nodes[i-1].linked = true;\n // }\n }\n }\n\n //add the pseudoknot links\n for (let i = 0; i < self.pseudoknotPairs.length; i++) {\n self.links.push({'source': self.nodes[self.pseudoknotPairs[i][0]-1],\n 'target': self.nodes[self.pseudoknotPairs[i][1]-1],\n 'linkType': 'pseudoknot',\n 'value': 1,\n 'uid': slugid.nice()});\n }\n\n if (self.circular) {\n self.links.push({'source': self.nodes[0],\n 'target': self.nodes[self.rnaLength-1],\n 'linkType': 'backbone',\n 'value': 1,\n 'uid': slugid.nice() });\n\n }\n\n return self;\n };\n\n self.ptToElements = function(pt, level, i, j) {\n /* Convert a pair table to a list of secondary structure\n * elements:\n *\n * [['s',1,[2,3]]\n *\n * The 's' indicates that an element can be a stem. It can also be\n * an interior loop ('i'), a hairpin loop ('h') or a multiloop ('m')\n *\n * The second number (1 in this case) indicates the depth or\n * how many base pairs have to be broken to get to this element.\n *\n * Finally, there is the list of nucleotides which are part of\n * of this element.\n */\n var elements = [];\n var u5 = [i-1];\n var u3 = [j+1];\n\n if (i > j)\n return [];\n\n //iterate over the unpaired regions on either side\n //this is either 5' and 3' unpaired if level == 0\n //or an interior loop or a multiloop\n for (; pt[i] === 0; i++) { u5.push(i); }\n for (; pt[j] === 0; j--) { u3.push(j); }\n\n if (i > j) {\n //hairpin loop or one large unpaired molecule\n u5.push(i);\n // if (level === 0)\n return [['e',level, u5.sort(numberSort)]];\n // else {\n // // check to see if we have chain breaks due\n // // to multiple strands in the input\n // var external = false;\n // var left = [];\n // var right = [];\n // for (var k = 0; k < u5.length; k++) {\n // if (external)\n // right.push(u5[k]);\n // else\n // left.push(u5[k]);\n\n // if (self.dotBracketBreaks.indexOf(u5[k]) >= 0)\n // external = true;\n // }\n\n // if (external) {\n // return [['h',level, u5.sort(numberSort)]];\n // }\n // else\n // // if not, this is a simple hairpin loop\n // return [['h',level, u5.sort(numberSort)]];\n // }\n }\n\n if (pt[i] != j) {\n //multiloop\n var m = u5;\n var k = i;\n\n // the nucleotide before and the starting nucleotide\n m.push(k);\n while (k <= j) {\n // recurse into a stem\n elements = elements.concat(self.ptToElements(pt, level, k, pt[k]));\n\n // add the nucleotides between stems\n m.push(pt[k]);\n k = pt[k] + 1;\n for (; pt[k] === 0 && k <= j; k++) { m.push(k);}\n m.push(k);\n }\n m.pop();\n m = m.concat(u3);\n\n if (m.length > 0) {\n if (level === 0)\n elements.push(['e', level, m.sort(numberSort)]);\n else\n elements.push(['m', level, m.sort(numberSort)]);\n }\n\n return elements;\n }\n\n if (pt[i] === j) {\n //interior loop\n u5.push(i);\n u3.push(j);\n\n var combined = u5.concat(u3);\n if (combined.length > 4) {\n if (level === 0)\n elements.push(['e',level, u5.concat(u3).sort(numberSort)]);\n else\n elements.push(['i',level, u5.concat(u3).sort(numberSort)]);\n }\n }\n\n var s = [];\n //go through the stem\n while (pt[i] === j && i < j) {\n //one stem\n s.push(i);\n s.push(j);\n\n i += 1;\n j -= 1;\n\n level += 1;\n }\n\n u5 = [i-1];\n u3 = [j+1];\n elements.push(['s', level, s.sort(numberSort)]);\n\n return elements.concat(self.ptToElements(pt, level, i, j));\n };\n\n self.addLabels = function(startNumber = 1, labelInterval = 10) {\n if (labelInterval === 0)\n return self;\n\n for (let i = 1; i <= self.rnaLength; i++) {\n // add labels\n if (i % labelInterval === 0) {\n //create a node for each label\n let newX, newY;\n\n let thisNode = self.nodes[i-1];\n let prevNode, nextNode;\n let prevVec, nextVec;\n\n if (self.rnaLength == 1) {\n nextVec = [thisNode.x - 15, thisNode.y];\n prevVec = [thisNode.x - 15, thisNode.y];\n } else {\n // if we're labelling the first node, then label it in relation to the last\n if (i == 1)\n prevNode = self.nodes[self.rnaLength - 1];\n else\n prevNode = self.nodes[i - 2];\n\n // if we're labelling the last node, then label it in relation to the first\n if (i == self.rnaLength)\n nextNode = self.nodes[0];\n else\n nextNode = self.nodes[i];\n\n // this nucleotide and its neighbors are paired\n if (self.pairtable[nextNode.num - startNumber+1] !== 0 &&\n self.pairtable[prevNode.num - startNumber+1] !== 0 &&\n self.pairtable[thisNode.num - startNumber+1] !== 0) {\n\n prevNode = nextNode = self.nodes[self.pairtable[thisNode.num - startNumber+1]-1];\n }\n\n // this node is paired but at least one of its neighbors is unpaired\n // place the label in the direction of the two neighbors\n if (self.pairtable[thisNode.num - startNumber+1] !== 0 && (\n self.pairtable[nextNode.num - startNumber+1] === 0 ||\n self.pairtable[prevNode.num - startNumber+1] === 0)) {\n nextVec = [thisNode.x - nextNode.x, thisNode.y - nextNode.y];\n prevVec = [thisNode.x - prevNode.x, thisNode.y - prevNode.y];\n\n } else {\n nextVec = [nextNode.x - thisNode.x, nextNode.y - thisNode.y];\n prevVec = [prevNode.x - thisNode.x, prevNode.y - thisNode.y];\n }\n }\n\n var combinedVec = [nextVec[0] + prevVec[0], nextVec[1] + prevVec[1]];\n var vecLength = Math.sqrt(combinedVec[0] * combinedVec[0] + combinedVec[1] * combinedVec[1]);\n var normedVec = [combinedVec[0] / vecLength, combinedVec[1] / vecLength];\n var offsetVec = [-15 * normedVec[0], -15 * normedVec[1]];\n\n newX = self.nodes[i-1].x + offsetVec[0];\n newY = self.nodes[i-1].y + offsetVec[1];\n\n var newNode = {'name': i + startNumber -1,\n 'num': -1,\n 'radius': 6,\n 'rna': self,\n 'nodeType': 'label',\n 'structName': self.structName,\n 'elemType': 'l',\n 'x': newX,\n 'y': newY,\n 'px': newX,\n 'py': newY,\n 'uid': slugid.nice() };\n var newLink = {'source': self.nodes[i-1],\n 'target': newNode,\n 'value': 1,\n 'linkType': 'label_link',\n 'uid': slugid.nice() };\n\n self.nodes.push(newNode);\n self.links.push(newLink);\n }\n }\n\n return self;\n };\n\n self.recalculateElements = function() {\n self.removePseudoknots();\n self.elements = self.ptToElements(self.pairtable, 0, 1, self.dotbracket.length);\n\n if (self.circular) {\n //check to see if the external loop is a hairpin or a multiloop\n let externalLoop = self.elements.filter(function(d) { if (d[0] == 'e') return true; });\n\n if (externalLoop.length > 0) {\n eloop = externalLoop[0];\n nucs = eloop[2].sort(numberSort);\n\n prev = nucs[0];\n hloop = true;\n numGreater = 0;\n for (let i = 1; i < nucs.length; i++) {\n if (nucs[i] - prev > 1) {\n numGreater += 1;\n }\n prev = nucs[i];\n }\n\n if (numGreater == 1) {\n eloop[0] = 'h';\n } else if (numGreater == 2) {\n eloop[0] = 'i';\n } else {\n eloop[0] = 'm';\n }\n }\n }\n\n return self;\n };\n\n self.reassignLinkUids = function() {\n // reassign uids to the links, corresponding to the uids of the two nodes\n // they connect\n var i;\n\n for (var i = 0; i < self.links.length; i++) {\n self.links[i].uid = self.links[i].source.uid + self.links[i].target.uid;\n }\n\n return self;\n }\n\n self.removePseudoknots = function() {\n if (self.pairtable.length > 1)\n self.pseudoknotPairs = self.pseudoknotPairs.concat(rnaUtilities.removePseudoknotsFromPairtable(self.pairtable));\n\n return self;\n };\n\n self.addPseudoknots = function() {\n /* Add all of the pseudoknot pairs which are stored outside\n * of the pairtable back to the pairtable\n */\n var pt = self.pairtable;\n var pseudoknotPairs = self.pseudoknotPairs;\n\n for (var i = 0; i < pseudoknotPairs.length; i++) {\n pt[pseudoknotPairs[i][0]] = pseudoknotPairs[i][1];\n pt[pseudoknotPairs[i][1]] = pseudoknotPairs[i][0];\n }\n\n self.pseudoknotPairs = [];\n return self;\n };\n\n self.addName = function(name) {\n if (typeof name == 'undefined') {\n self.name = '';\n return self;\n } else {\n self.name = name;\n return self;\n }\n };\n\n\n if (self.rnaLength > 0)\n self.recalculateElements();\n\n self.getNodeFromNucleotides = function(nucs) {\n /* Get a node given a nucleotide number or an array of nucleotide\n * numbers indicating an element node */\n if (Object.prototype.toString.call(nucs) === '[object Array]') {\n for (let j = 0; j < self.nodes.length; j++) {\n if ('nucs' in self.nodes[j]) {\n if (self.nodes[j].nucs.equals(nucs)) {\n return self.nodes[j];\n }\n }\n }\n } else {\n for (let j = 0; j < self.nodes.length; j++) {\n if (self.nodes[j].num == nucs) {\n return self.nodes[j];\n }\n }\n }\n\n console.log('ERROR: No node found for nucs:', nucs);\n return null;\n }\n}\n\nexport function moleculesToJson(moleculesJson) {\n /* Convert a list of RNA and protein molecules to a list of RNAGraph\n * ProteinGraph and extraLinks structure */\n\n var nodes = {}; //index the nodes by uid\n var graphs = [];\n var extraLinks = [];\n\n\n // Create the graphs for each molecule\n for (var i = 0; i < moleculesJson.molecules.length; i++) {\n var molecule = moleculesJson.molecules[i];\n var rg;\n\n if (molecule.type == 'rna') {\n rg = new RNAGraph(molecule.seq, molecule.ss, molecule.header);\n rg.circularizeExternal = true;\n rg.elementsToJson()\n .addPositions('nucleotide', molecule.positions)\n .addLabels()\n .reinforceStems()\n .reinforceLoops();\n\n\n } else if (molecule.type == 'protein') {\n rg = new ProteinGraph(molecule.header, molecule.size);\n\n }\n\n rg.addUids(molecule.uids);\n\n for (var j = 0; j < rg.nodes.length; j++) {\n nodes[rg.nodes[j].uid] = rg.nodes[j];\n }\n\n graphs.push(rg);\n }\n\n //Add the extra links\n for (var i = 0; i < moleculesJson.extraLinks.length; i++) {\n link = moleculesJson.extraLinks[i];\n\n link.source = nodes[link.source];\n link.target = nodes[link.target];\n link.uid = slugid.nice();\n\n extraLinks.push(link);\n }\n\n return {'graphs': graphs, 'extraLinks': extraLinks};\n};\n","export function simpleXyCoordinates (pair_table) {\n var INIT_ANGLE=0.; /* initial bending angle */\n var INIT_X = 100.; /* coordinate of first digit */\n var INIT_Y = 100.; /* see above */\n var RADIUS = 15.;\n\n var x = [], y = [];\n\n var i, len;\n var alpha;\n\n len = pair_table[0];\n var angle = Array.apply(null, new Array(len+5)).map(Number.prototype.valueOf,0); \n var loop_size = Array.apply(null, new Array(16+Math.floor(len/5)))\n .map(Number.prototype.valueOf, 0); \n var stack_size = Array.apply(null, new Array(16+Math.floor(len/5)))\n .map(Number.prototype.valueOf, 0); \n\n var lp = 0;\n var stk = 0;\n var PIHALF = Math.PI / 2;\n\n\n var loop = function(i, j, pair_table)\n /* i, j are the positions AFTER the last pair of a stack; i.e\n i-1 and j+1 are paired. */\n {\n var count = 2; /* counts the VERTICES of a loop polygon; that's\n NOT necessarily the number of unpaired bases!\n Upon entry the loop has already 2 vertices, namely\n the pair i-1/j+1. */\n\n var r = 0, bubble = 0; /* bubble counts the unpaired digits in loops */\n\n var i_old, partner, k, l, start_k, start_l, fill, ladder;\n var begin, v, diff;\n var polygon;\n\n var remember = Array.apply(null, new Array((3+Math.floor((j-i)/5)*2))).map(Number.prototype.valueOf, 0);\n\n i_old = i-1, j++; /* j has now been set to the partner of the\n previous pair for correct while-loop\n termination. */\n while (i != j) {\n partner = pair_table[i];\n if ((!partner) || (i==0))\n i++, count++, bubble++;\n else {\n count += 2;\n k = i, l = partner; /* beginning of stack */\n remember[++r] = k;\n remember[++r] = l;\n i = partner+1; /* next i for the current loop */\n\n start_k = k, start_l = l;\n ladder = 0;\n do {\n k++, l--, ladder++; /* go along the stack region */\n }\n while ((pair_table[k] == l) && (pair_table[k] > k));\n\n fill = ladder-2;\n if (ladder >= 2) {\n angle[start_k+1+fill] += PIHALF; /* Loop entries and */\n angle[start_l-1-fill] += PIHALF; /* exits get an */\n angle[start_k] += PIHALF; /* additional PI/2. */\n angle[start_l] += PIHALF; /* Why ? (exercise) */\n if (ladder > 2) {\n for (; fill >= 1; fill--) {\n angle[start_k+fill] = Math.PI; /* fill in the angles */\n angle[start_l-fill] = Math.PI; /* for the backbone */\n }\n }\n }\n stack_size[++stk] = ladder;\n if (k <= l)\n loop(k, l, pair_table);\n }\n }\n\n polygon = Math.PI*(count-2)/count; /* bending angle in loop polygon */\n remember[++r] = j;\n begin = i_old < 0 ? 0 : i_old;\n for (v = 1; v <= r; v++) {\n diff = remember[v]-begin;\n for (fill = 0; fill <= diff; fill++)\n angle[begin+fill] += polygon;\n if (v > r)\n break;\n begin = remember[++v];\n }\n loop_size[++lp] = bubble;\n }\n\n loop(0, len+1, pair_table);\n loop_size[lp] -= 2; /* correct for cheating with function loop */\n\n alpha = INIT_ANGLE;\n x[0] = INIT_X;\n y[0] = INIT_Y;\n\n var poss = [];\n\n poss.push([x[0], y[0]]);\n for (i = 1; i < len; i++) {\n x[i] = x[i-1]+RADIUS*Math.cos(alpha);\n y[i] = y[i-1]+RADIUS*Math.sin(alpha);\n\n poss.push([x[i], y[i]]);\n alpha += Math.PI-angle[i+1];\n }\n\n return poss;\n}\n","export function Radloop() {\n\tthis.radius = null;\n\tthis.loopnumber = null;\n\tthis.next = null;\n this.prev = null;\n}\n\nRadloop.prototype.getRadius = function(){\n\treturn this.radius;\n}\n\nRadloop.prototype.setRadius = function(radius){\n\tthis.radius = radius;\n}\n\nRadloop.prototype.getLoopnumber = function(){\n\treturn this.loopnumber;\n}\n\nRadloop.prototype.setLoopnumber = function(loopnumber){\n\tthis.loopnumber = loopnumber;\n}\n\nRadloop.prototype.getNext = function(){\n\treturn this.next;\n}\n\nRadloop.prototype.setNext = function(next){\n\tthis.next = next;\n}\n\nRadloop.prototype.getPrev = function(){\n\treturn this.prev;\n}\n\nRadloop.prototype.setPrev = function(prev){\n\tthis.prev = prev;\n}\n","import {Region} from './region.js';\n\nexport function Base() {\n\tthis.mate = null;\n\tthis.x = null;\n this.y = null;\n\tthis.extracted = null;\n\tthis.region = new Region();\n}\n\nBase.prototype.getMate = function(){\n\treturn this.mate;\n}\n\nBase.prototype.setMate = function(mate){\n\tthis.mate = mate;\n}\n\nBase.prototype.getX = function(){\n\treturn this.x;\n}\n\nBase.prototype.setX = function(x){\n\tthis.x = x;\n}\n\nBase.prototype.getY = function(){\n\treturn this.y;\n}\n\nBase.prototype.setY = function(y){\n\tthis.y = y;\n}\n\nBase.prototype.isExtracted = function(){\n\treturn this.extracted;\n}\n\nBase.prototype.setExtracted = function(extracted){\n\tthis.extracted = extracted;\n}\n\nBase.prototype.getRegion = function(){\n\treturn this.region;\n}\n\nBase.prototype.setRegion = function(region){\n\tthis.region = region;\n}\n","import {Radloop} from './radloop.js';\nimport {Connection} from './connection.js';\nimport {Region} from './region.js';\nimport {Base} from './base.js';\nimport {Loop} from './loop.js';\n\nexport function NAView(){\n this.ANUM = 9999.0;\n\tthis.MAXITER = 500;\n\n\tthis.bases = [];\n\tthis.nbase = null;\n this.nregion = null;\n this.loop_count = null;\n\n\tthis.root = new Loop();\n\tthis.loops = [];\n\n\tthis.regions = [];\n\n\tthis.rlphead = new Radloop();\n\n\tthis.lencut = 0.8;\n\tthis.RADIUS_REDUCTION_FACTOR = 1.4;\n\n\t// show algorithm step by step\n\tthis.angleinc = null;\n\n\tthis._h = null;\n\n\t// private boolean noIterationFailureYet = true;\n\n\tthis.HELIX_FACTOR = 0.6;\n\tthis.BACKBONE_DISTANCE = 27;\n}\n\nNAView.prototype.naview_xy_coordinates = function(pair_table){\n var x = [];\n\tvar y = [];\n if (pair_table.length === 0 || pair_table[0] === 0){\n return 0;\n }\n var i;\n this.nbase = pair_table[0];\n this.bases = [];\n for (var index = 0; index < this.nbase + 1; index++){\n this.bases.push(new Base());\n }\n this.regions = [];\n for (var index = 0; index < this.nbase + 1; index++){\n this.regions.push(new Region());\n }\n this.read_in_bases(pair_table);\n this.rlphead = null;\n this.find_regions();\n this.loop_count = 0;\n this.loops = [];\n for (var index = 0; index < this.nbase + 1; index++){\n this.loops.push(new Loop());\n }\n this.construct_loop(0);\n this.find_central_loop();\n this.traverse_loop(this.root, null);\n\n for (i = 0; i < this.nbase; i++){\n x.push(100 + this.BACKBONE_DISTANCE * this.bases[i + 1].getX());\n y.push(100 + this.BACKBONE_DISTANCE * this.bases[i + 1].getY());\n }\n\n return {\n nbase: this.nbase,\n x: x,\n y: y\n }\n}\n\nNAView.prototype.read_in_bases = function read_in_bases(pair_table){\n var i = null;\n var npairs = null;\n\n // Set up an origin.\n this.bases.push(new Base());\n this.bases[0].setMate(0);\n this.bases[0].setExtracted(false);\n this.bases[0].setX(this.ANUM);\n this.bases[0].setY(this.ANUM);\n\n for (npairs = 0, i = 1; i <= this.nbase; i++){\n this.bases.push(new Base());\n this.bases[i].setExtracted(false);\n this.bases[i].setX(this.ANUM);\n this.bases[i].setY(this.ANUM);\n this.bases[i].setMate(pair_table[i]);\n if (pair_table[i] > i)\n npairs++;\n }\n // must have at least 1 pair to avoid segfault\n if (npairs == 0){\n this.bases[1].setMate(this.nbase);\n this.bases[this.nbase].setMate(1);\n }\n}\n\nNAView.prototype.find_regions = function find_regions(){\n var i = null;\n var mate = null;\n var nb1 = null;\n\n nb1 = this.nbase + 1;\n var mark = [];\n for (i = 0; i < nb1; i++){\n mark.push(false);\n }\n this.nregion = 0;\n for (i = 0; i <= this.nbase; i++) {\n if ((mate = this.bases[i].getMate()) != 0 && !mark[i]) {\n this.regions[this.nregion].setStart1(i);\n this.regions[this.nregion].setEnd2(mate);\n mark[i] = true;\n mark[mate] = true;\n this.bases[i].setRegion(this.regions[this.nregion]);\n this.bases[mate].setRegion(this.regions[this.nregion]);\n for (i++, mate--; i < mate && this.bases[i].getMate() == mate; i++, mate--) {\n mark[mate] = true;\n mark[i]= true;\n this.bases[i].setRegion(this.regions[this.nregion]);\n this.bases[mate].setRegion(this.regions[this.nregion]);\n }\n this.regions[this.nregion].setEnd1(--i);\n this.regions[this.nregion].setStart2(mate + 1);\n\n this.nregion++;\n }\n }\n}\n\nNAView.prototype.construct_loop = function construct_loop(ibase){\n var i = null;\n var mate = null;\n var retloop = new Loop();\n var lp = new Loop();\n var cp = new Connection();\n var rp = new Region();\n var rlp = new Radloop();\n retloop = this.loops[this.loop_count++];\n retloop.setNconnection(0);\n retloop.setDepth(0);\n retloop.setNumber(this.loop_count);\n retloop.setRadius(0.0);\n\n for (rlp = this.rlphead; rlp != null; rlp = rlp.getNext())\n if (rlp.getLoopnumber() == this.loop_count)\n retloop.setRadius(rlp.getRadius());\n i = ibase;\n do {\n if ((mate = this.bases[i].getMate()) != 0) {\n rp = this.bases[i].getRegion();\n if (!this.bases[rp.getStart1()].isExtracted()) {\n if (i == rp.getStart1()) {\n this.bases[rp.getStart1()].setExtracted(true);\n this.bases[rp.getEnd1()].setExtracted(true);\n this.bases[rp.getStart2()].setExtracted(true);\n this.bases[rp.getEnd2()].setExtracted(true);\n lp = this.construct_loop(rp.getEnd1() < this.nbase ? rp.getEnd1() + 1\n : 0);\n } else if (i == rp.getStart2()) {\n this.bases[rp.getStart2()].setExtracted(true);\n this.bases[rp.getEnd2()].setExtracted(true);\n this.bases[rp.getStart1()].setExtracted(true);\n this.bases[rp.getEnd1()].setExtracted(true);\n lp = this.construct_loop(rp.getEnd2() < this.nbase ? rp.getEnd2() + 1\n : 0);\n } else {\n console.log(\"Something went terribly wrong ....\");\n }\n retloop.setNconnection(retloop.getNconnection() + 1);\n cp = new Connection();\n retloop.setConnection(retloop.getNconnection() - 1,\tcp);\n retloop.setConnection(retloop.getNconnection(), null);\n cp.setLoop(lp);\n cp.setRegion(rp);\n if(i == rp.getStart1()) {\n cp.setStart(rp.getStart1());\n cp.setEnd(rp.getEnd2());\n } else {\n cp.setStart(rp.getStart2());\n cp.setEnd(rp.getEnd1());\n }\n cp.setExtruded(false);\n cp.setBroken(false);\n lp.setNconnection(lp.getNconnection() + 1);\n cp = new Connection();\n lp.setConnection(lp.getNconnection() - 1, cp);\n lp.setConnection(lp.getNconnection(), null);\n cp.setLoop(retloop);\n cp.setRegion(rp);\n if (i == rp.getStart1()) {\n cp.setStart(rp.getStart2());\n cp.setEnd(rp.getEnd1());\n } else {\n cp.setStart(rp.getStart1());\n cp.setEnd(rp.getEnd2());\n }\n cp.setExtruded(false);\n cp.setBroken(false);\n }\n i = mate;\n }\n if (++i > this.nbase)\n i = 0;\n } while (i != ibase);\n return retloop;\n}\n\nNAView.prototype.find_central_loop = function find_central_loop(){\n var lp = new Loop();\n var maxconn = null;\n var maxdepth = null;\n var i = null;\n\n determine_depths.bind(this)();\n maxconn = 0;\n maxdepth = -1;\n for (i = 0; i < this.loop_count; i++) {\n lp = this.loops[i];\n if (lp.getNconnection() > maxconn) {\n maxdepth = lp.getDepth();\n maxconn = lp.getNconnection();\n this.root = lp;\n } else if (lp.getDepth() > maxdepth\n && lp.getNconnection() == maxconn) {\n maxdepth = lp.getDepth();\n this.root = lp;\n }\n }\n}\n\nfunction determine_depths() {\n var lp = new Loop();\n var i = null;\n var j = null;\n\n for (i = 0; i < this.loop_count; i++) {\n lp = this.loops[i];\n for (j = 0; j < this.loop_count; j++){\n this.loops[j].setMark(false);\n }\n lp.setDepth(depth(lp));\n }\n}\n\nfunction depth(lp){\n var count = null;\n var ret = null;\n var d = null;\n\n if (lp.getNconnection() <= 1){\n return 0;\n }\n if (lp.isMark()){\n return -1;\n }\n lp.setMark(true);\n count = 0;\n ret = 0;\n for (var i = 0; lp.getConnection(i) != null; i++) {\n d = depth(lp.getConnection(i).getLoop());\n if (d >= 0) {\n if (++count == 1){\n ret = d;\n }\n else if (ret > d){\n ret = d;\n }\n }\n }\n lp.setMark(false);\n return ret + 1;\n}\n\nNAView.prototype.traverse_loop = function traverse_loop(lp, anchor_connection){\n var xs, ys, xe, ye, xn, yn, angleinc, r;\n var radius, xc, yc, xo, yo, astart, aend, a;\n var cp, cpnext, acp, cpprev;\n var i, j, n, ic;\n var da, maxang;\n var count, icstart, icend, icmiddle, icroot;\n var done, done_all_connections, rooted;\n var sign;\n var midx, midy, nrx, nry, mx, my, vx, vy, dotmv, nmidx, nmidy;\n var icstart1, icup, icdown, icnext, direction;\n var dan, dx, dy, rr;\n var cpx, cpy, cpnextx, cpnexty, cnx, cny, rcn, rc, lnx, lny, rl, ac, acn, sx, sy, dcp;\n var imaxloop = 0;\n\n angleinc = 2 * Math.PI / (this.nbase + 1);\n acp = null;\n icroot = -1;\n var indice = 0;\n\n for (ic = 0; (cp = lp.getConnection(indice)) != null; indice++, ic++) {\n xs = -Math.sin(angleinc * cp.getStart());\n ys = Math.cos(angleinc * cp.getStart());\n xe = -Math.sin(angleinc * cp.getEnd());\n ye = Math.cos(angleinc * cp.getEnd());\n xn = ye - ys;\n yn = xs - xe;\n r = Math.sqrt(xn * xn + yn * yn);\n cp.setXrad(xn / r);\n cp.setYrad(yn / r);\n cp.setAngle(Math.atan2(yn, xn));\n if (cp.getAngle() < 0.0){\n cp.setAngle(cp.getAngle() + 2 * Math.PI);\n }\n if (anchor_connection != null\n && anchor_connection.getRegion() == cp.getRegion()) {\n acp = cp;\n icroot = ic;\n }\n }\n set_radius: while (true) {\n this.determine_radius(lp, this.lencut);\n radius = lp.getRadius()/this.RADIUS_REDUCTION_FACTOR;\n if (anchor_connection == null){\n xc = yc = 0.0;\n }\n else {\n xo = (this.bases[acp.getStart()].getX() + this.bases\n [acp.getEnd()].getX()) / 2.0;\n yo = (this.bases[acp.getStart()].getY() + this.bases\n [acp.getEnd()].getY()) / 2.0;\n xc = xo - radius * acp.getXrad();\n yc = yo - radius * acp.getYrad();\n }\n\n // The construction of the connectors will proceed in blocks of\n // connected connectors, where a connected connector pairs means two\n // connectors that are forced out of the drawn circle because they\n // are too close together in angle.\n\n // First, find the start of a block of connected connectors\n\n if (icroot == -1){\n icstart = 0;\n }\n else {\n icstart = icroot;\n }\n cp = lp.getConnection(icstart);\n count = 0;\n done = false;\n do {\n j = icstart - 1;\n if (j < 0){\n j = lp.getNconnection() - 1;\n }\n cpprev = lp.getConnection(j);\n if (!this.connected_connection(cpprev, cp)) {\n done = true;\n }\n else {\n icstart = j;\n cp = cpprev;\n }\n if (++count > lp.getNconnection()) {\n // Here everything is connected. Break on maximum angular\n // separation between connections.\n maxang = -1.0;\n for (ic = 0; ic < lp.getNconnection(); ic++) {\n j = ic + 1;\n if (j >= lp.getNconnection()){\n j = 0;\n }\n cp = lp.getConnection(ic);\n cpnext = lp.getConnection(j);\n ac = cpnext.getAngle() - cp.getAngle();\n if (ac < 0.0){\n ac += 2 * Math.PI;\n }\n if (ac > maxang) {\n maxang = ac;\n imaxloop = ic;\n }\n }\n icend = imaxloop;\n icstart = imaxloop + 1;\n if (icstart >= lp.getNconnection()){\n icstart = 0;\n }\n cp = lp.getConnection(icend);\n cp.setBroken(true);\n done = true;\n }\n } while (!done);\n done_all_connections = false;\n icstart1 = icstart;\n while (!done_all_connections) {\n count = 0;\n done = false;\n icend = icstart;\n rooted = false;\n while (!done) {\n cp = lp.getConnection(icend);\n if (icend == icroot){\n rooted = true;\n }\n j = icend + 1;\n if (j >= lp.getNconnection()) {\n j = 0;\n }\n cpnext = lp.getConnection(j);\n if (this.connected_connection(cp, cpnext)) {\n if (++count >= lp.getNconnection()){\n break;\n }\n icend = j;\n }\n else {\n done = true;\n }\n }\n icmiddle = this.find_ic_middle(icstart, icend, anchor_connection,\n acp, lp);\n ic = icup = icdown = icmiddle;\n done = false;\n direction = 0;\n while (!done) {\n if (direction < 0) {\n ic = icup;\n }\n else if (direction == 0) {\n ic = icmiddle;\n }\n else {\n ic = icdown;\n }\n if (ic >= 0) {\n cp = lp.getConnection(ic);\n if (anchor_connection == null || acp != cp) {\n if (direction == 0) {\n astart = cp.getAngle()\n - Math.asin(1.0 / 2.0 / radius);\n aend = cp.getAngle()\n + Math.asin(1.0 / 2.0 / radius);\n this.bases[cp.getStart()].setX(\n xc + radius * Math.cos(astart));\n this.bases[cp.getStart()].setY(\n yc + radius * Math.sin(astart));\n this.bases[cp.getEnd()].setX(\n xc + radius * Math.cos(aend));\n this.bases[cp.getEnd()].setY(\n yc + radius * Math.sin(aend));\n }\n else if (direction < 0) {\n j = ic + 1;\n if (j >= lp.getNconnection()){\n j = 0;\n }\n cp = lp.getConnection(ic);\n cpnext = lp.getConnection(j);\n cpx = cp.getXrad();\n cpy = cp.getYrad();\n ac = (cp.getAngle() + cpnext.getAngle()) / 2.0;\n if (cp.getAngle() > cpnext.getAngle()){\n ac -= Math.PI;\n }\n cnx = Math.cos(ac);\n cny = Math.sin(ac);\n lnx = cny;\n lny = -cnx;\n da = cpnext.getAngle() - cp.getAngle();\n if (da < 0.0){\n da += 2 * Math.PI;\n }\n if (cp.isExtruded()) {\n if (da <= Math.PI / 2){\n rl = 2.0;\n }\n else {\n rl = 1.5;\n }\n }\n else {\n rl = 1.0;\n }\n this.bases[cp.getEnd()].setX(\n this.bases[cpnext.getStart()].getX()\n + rl * lnx);\n this.bases[cp.getEnd()].setY(\n this.bases[cpnext.getStart()].getY()\n + rl * lny);\n this.bases[cp.getStart()].setX(\n this.bases[cp.getEnd()].getX() + cpy);\n this.bases[cp.getStart()].setY(\n this.bases[cp.getEnd()].getY() - cpx);\n } else {\n j = ic - 1;\n if (j < 0){\n j = lp.getNconnection() - 1;\n }\n cp = lp.getConnection(j);\n cpnext = lp.getConnection(ic);\n cpnextx = cpnext.getXrad();\n cpnexty = cpnext.getYrad();\n ac = (cp.getAngle() + cpnext.getAngle()) / 2.0;\n if (cp.getAngle() > cpnext.getAngle()){\n ac -= Math.PI;\n }\n cnx = Math.cos(ac);\n cny = Math.sin(ac);\n lnx = -cny;\n lny = cnx;\n da = cpnext.getAngle() - cp.getAngle();\n if (da < 0.0){\n da += 2 * Math.PI;\n }\n if (cp.isExtruded()) {\n if (da <= Math.PI / 2){\n rl = 2.0;\n }\n else {\n rl = 1.5;\n }\n }\n else {\n rl = 1.0;\n }\n this.bases[cpnext.getStart()].setX(\n this.bases[cp.getEnd()].getX() + rl\n * lnx);\n this.bases[cpnext.getStart()].setY(\n this.bases[cp.getEnd()].getY() + rl\n * lny);\n this.bases[cpnext.getEnd()].setX(\n this.bases[cpnext.getStart()].getX()\n - cpnexty);\n this.bases[cpnext.getEnd()].setY(\n this.bases[cpnext.getStart()].getY()\n + cpnextx);\n }\n }\n }\n if (direction < 0) {\n if (icdown == icend) {\n icdown = -1;\n }\n else if (icdown >= 0) {\n if (++icdown >= lp.getNconnection()) {\n icdown = 0;\n }\n }\n direction = 1;\n }\n else {\n if (icup == icstart){\n icup = -1;\n }\n else if (icup >= 0) {\n if (--icup < 0) {\n icup = lp.getNconnection() - 1;\n }\n }\n direction = -1;\n }\n done = icup == -1 && icdown == -1;\n }\n icnext = icend + 1;\n if (icnext >= lp.getNconnection()){\n icnext = 0;\n }\n if (icend != icstart\n && (!(icstart == icstart1 && icnext == icstart1))) {\n\n // Move the bases just constructed (or the radius) so that\n // the bisector of the end points is radius distance away\n // from the loop center.\n\n cp = lp.getConnection(icstart);\n cpnext = lp.getConnection(icend);\n dx = this.bases[cpnext.getEnd()].getX()\n - this.bases[cp.getStart()].getX();\n dy = this.bases[cpnext.getEnd()].getY()\n - this.bases[cp.getStart()].getY();\n midx = this.bases[cp.getStart()].getX() + dx / 2.0;\n midy = this.bases[cp.getStart()].getY() + dy / 2.0;\n rr = Math.sqrt(dx * dx + dy * dy);\n mx = dx / rr;\n my = dy / rr;\n vx = xc - midx;\n vy = yc - midy;\n rr = Math.sqrt(dx * dx + dy * dy);\n vx /= rr;\n vy /= rr;\n dotmv = vx * mx + vy * my;\n nrx = dotmv * mx - vx;\n nry = dotmv * my - vy;\n rr = Math.sqrt(nrx * nrx + nry * nry);\n nrx /= rr;\n nry /= rr;\n\n // Determine which side of the bisector the center should\n // be.\n\n dx = this.bases[cp.getStart()].getX() - xc;\n dy = this.bases[cp.getStart()].getY() - yc;\n ac = Math.atan2(dy, dx);\n if (ac < 0.0){\n ac += 2 * Math.PI;\n }\n dx = this.bases[cpnext.getEnd()].getX() - xc;\n dy = this.bases[cpnext.getEnd()].getY() - yc;\n acn = Math.atan2(dy, dx);\n if (acn < 0.0){\n acn += 2 * Math.PI;\n }\n if (acn < ac){\n acn += 2 * Math.PI;\n }\n if (acn - ac > Math.PI){\n sign = -1;\n }\n else {\n sign = 1;\n }\n nmidx = xc + sign * radius * nrx;\n nmidy = yc + sign * radius * nry;\n if (rooted) {\n xc -= nmidx - midx;\n yc -= nmidy - midy;\n }\n else {\n for (ic = icstart;;) {\n cp = lp.getConnection(ic);\n i = cp.getStart();\n this.bases[i].setX(\n this.bases[i].getX() + nmidx - midx);\n this.bases[i].setY(\n this.bases[i].getY() + nmidy - midy);\n i = cp.getEnd();\n this.bases[i].setX(\n this.bases[i].getX() + nmidx - midx);\n this.bases[i].setY(\n this.bases[i].getY() + nmidy - midy);\n if (ic == icend){\n break;\n }\n if (++ic >= lp.getNconnection()){\n ic = 0;\n }\n }\n }\n }\n icstart = icnext;\n done_all_connections = icstart == icstart1;\n }\n for (ic = 0; ic < lp.getNconnection(); ic++) {\n cp = lp.getConnection(ic);\n j = ic + 1;\n if (j >= lp.getNconnection()){\n j = 0;\n }\n cpnext = lp.getConnection(j);\n dx = this.bases[cp.getEnd()].getX() - xc;\n dy = this.bases[cp.getEnd()].getY() - yc;\n rc = Math.sqrt(dx * dx + dy * dy);\n ac = Math.atan2(dy, dx);\n if (ac < 0.0){\n ac += 2 * Math.PI;\n }\n dx = this.bases[cpnext.getStart()].getX() - xc;\n dy = this.bases[cpnext.getStart()].getY() - yc;\n rcn = Math.sqrt(dx * dx + dy * dy);\n acn = Math.atan2(dy, dx);\n if (acn < 0.0){\n acn += 2 * Math.PI;\n }\n if (acn < ac){\n acn += 2 * Math.PI;\n }\n dan = acn - ac;\n dcp = cpnext.getAngle() - cp.getAngle();\n if (dcp <= 0.0){\n dcp += 2 * Math.PI;\n }\n if (Math.abs(dan - dcp) > Math.PI) {\n if (cp.isExtruded()) {\n console.log(\"Warning from traverse_loop. Loop \"\n + lp.getNumber() + \" has crossed regions\\n\");\n }\n else if ((cpnext.getStart() - cp.getEnd()) != 1) {\n cp.setExtruded(true);\n continue set_radius; // remplacement du goto\n }\n }\n if (cp.isExtruded()) {\n this.construct_extruded_segment(cp, cpnext);\n }\n else {\n n = cpnext.getStart() - cp.getEnd();\n if (n < 0){\n n += this.nbase + 1;\n }\n angleinc = dan / n;\n for (j = 1; j < n; j++) {\n i = cp.getEnd() + j;\n if (i > this.nbase){\n i -= this.nbase + 1;\n }\n a = ac + j * angleinc;\n rr = rc + (rcn - rc) * (a - ac) / dan;\n this.bases[i].setX(xc + rr * Math.cos(a));\n this.bases[i].setY(yc + rr * Math.sin(a));\n }\n }\n }\n break;\n }\n for (ic = 0; ic < lp.getNconnection(); ic++) {\n if (icroot != ic) {\n cp = lp.getConnection(ic);\n //IM HERE\n this.generate_region(cp);\n this.traverse_loop(cp.getLoop(), cp);\n }\n }\n n = 0;\n sx = 0.0;\n sy = 0.0;\n for (ic = 0; ic < lp.getNconnection(); ic++) {\n j = ic + 1;\n if (j >= lp.getNconnection()){\n j = 0;\n }\n cp = lp.getConnection(ic);\n cpnext = lp.getConnection(j);\n n += 2;\n sx += this.bases[cp.getStart()].getX()\n + this.bases[cp.getEnd()].getX();\n sy += this.bases[cp.getStart()].getY()\n + this.bases[cp.getEnd()].getY();\n if (!cp.isExtruded()) {\n for (j = cp.getEnd() + 1; j != cpnext.getStart(); j++) {\n if (j > this.nbase){\n j -= this.nbase + 1;\n }\n n++;\n sx += this.bases[j].getX();\n sy += this.bases[j].getY();\n }\n }\n }\n lp.setX(sx / n);\n lp.setY(sy / n);\n}\n\nNAView.prototype.determine_radius = function determine_radius(lp, lencut){\n var mindit, ci, dt, sumn, sumd, radius, dit;\n var i, j, end, start, imindit = 0;\n var cp = new Connection(), cpnext = new Connection();\n var rt2_2 = 0.7071068;\n\n do {\n mindit = 1.0e10;\n for (sumd = 0.0, sumn = 0.0, i = 0; i < lp.getNconnection(); i++) {\n cp = lp.getConnection(i);\n j = i + 1;\n if (j >= lp.getNconnection()){\n j = 0;\n }\n cpnext = lp.getConnection(j);\n end = cp.getEnd();\n start = cpnext.getStart();\n if (start < end){\n start += this.nbase + 1;\n }\n dt = cpnext.getAngle() - cp.getAngle();\n if (dt <= 0.0){\n dt += 2 * Math.PI;\n }\n if (!cp.isExtruded()){\n ci = start - end;\n }\n else {\n if (dt <= Math.PI / 2){\n ci = 2.0;\n }\n else {\n ci = 1.5;\n }\n }\n sumn += dt * (1.0 / ci + 1.0);\n sumd += dt * dt / ci;\n dit = dt / ci;\n if (dit < mindit && !cp.isExtruded() && ci > 1.0) {\n mindit = dit;\n imindit = i;\n }\n }\n radius = sumn / sumd;\n if (radius < rt2_2){\n radius = rt2_2;\n }\n if (mindit * radius < lencut) {\n lp.getConnection(imindit).setExtruded(true);\n }\n } while (mindit * radius < lencut);\n if (lp.getRadius() > 0.0){\n radius = lp.getRadius();\n }\n else {\n lp.setRadius(radius);\n }\n}\n\nNAView.prototype.find_ic_middle = function find_ic_middle(icstart, icend, anchor_connection, acp, lp){\n var count, ret, ic, i;\n var done;\n\n count = 0;\n ret = -1;\n ic = icstart;\n done = false;\n while (!done) {\n if (count++ > lp.getNconnection() * 2) {\n console.log(\"Infinite loop in 'find_ic_middle'\");\n }\n if (anchor_connection != null && lp.getConnection(ic) == acp) {\n ret = ic;\n }\n done = ic == icend;\n if (++ic >= lp.getNconnection()) {\n ic = 0;\n }\n }\n if (ret == -1) {\n for (i = 1, ic = icstart; i < (count + 1) / 2; i++) {\n if (++ic >= lp.getNconnection())\n ic = 0;\n }\n ret = ic;\n }\n return ret;\n}\n\nNAView.prototype.construct_extruded_segment = function construct_extruded_segment(cp, cpnext){\n var astart, aend1, aend2, aave, dx, dy, a1, a2, ac, rr, da, dac;\n var start, end, n, nstart, nend;\n var collision;\n\n astart = cp.getAngle();\n aend2 = aend1 = cpnext.getAngle();\n if (aend2 < astart){\n aend2 += 2 * Math.PI;\n }\n aave = (astart + aend2) / 2.0;\n start = cp.getEnd();\n end = cpnext.getStart();\n n = end - start;\n if (n < 0){\n n += this.nbase + 1;\n }\n da = cpnext.getAngle() - cp.getAngle();\n if (da < 0.0) {\n da += 2 * Math.PI;\n }\n if (n == 2) {\n this.construct_circle_segment(start, end);\n }\n else {\n dx = this.bases[end].getX() - this.bases[start].getX();\n dy = this.bases[end].getY() - this.bases[start].getY();\n rr = Math.sqrt(dx * dx + dy * dy);\n dx /= rr;\n dy /= rr;\n if (rr >= 1.5 && da <= Math.PI / 2) {\n nstart = start + 1;\n if (nstart > this.nbase){\n nstart -= this.nbase + 1;\n }\n nend = end - 1;\n if (nend < 0){\n nend += this.nbase + 1;\n }\n this.bases[nstart].setX(this.bases[start].getX() + 0.5 * dx);\n this.bases[nstart].setY(this.bases[start].getY() + 0.5 * dy);\n this.bases[nend].setX(this.bases[end].getX() - 0.5 * dx);\n this.bases[nend].setY(this.bases[end].getY() - 0.5 * dy);\n start = nstart;\n end = nend;\n }\n do {\n collision = false;\n this.construct_circle_segment(start, end);\n nstart = start + 1;\n if (nstart > this.nbase) {\n nstart -= this.nbase + 1;\n }\n dx = this.bases[nstart].getX() - this.bases[start].getX();\n dy = this.bases[nstart].getY() - this.bases[start].getY();\n a1 = Math.atan2(dy, dx);\n if (a1 < 0.0){\n a1 += 2 * Math.PI;\n }\n dac = a1 - astart;\n if (dac < 0.0){\n dac += 2 * Math.PI;\n }\n if (dac > Math.PI){\n collision = true;\n }\n nend = end - 1;\n if (nend < 0){\n nend += this.nbase + 1;\n }\n dx = this.bases[nend].getX() - this.bases[end].getX();\n dy = this.bases[nend].getY() - this.bases[end].getY();\n a2 = Math.atan2(dy, dx);\n if (a2 < 0.0){\n a2 += 2 * Math.PI;\n }\n dac = aend1 - a2;\n if (dac < 0.0){\n dac += 2 * Math.PI;\n }\n if (dac > Math.PI){\n collision = true;\n }\n if (collision) {\n ac = this.minf2(aave, astart + 0.5);\n this.bases[nstart].setX(\n this.bases[start].getX() + Math.cos(ac));\n this.bases[nstart].setY(\n this.bases[start].getY() + Math.sin(ac));\n start = nstart;\n ac = this.maxf2(aave, aend2 - 0.5);\n this.bases[nend].setX(this.bases[end].getX() + Math.cos(ac));\n this.bases[nend].setY(this.bases[end].getY() + Math.sin(ac));\n end = nend;\n n -= 2;\n }\n } while (collision && n > 1);\n }\n}\n\nNAView.prototype.construct_circle_segment = function construct_circle_segment(start, end){\n var dx, dy, rr, midx, midy, xn, yn, nrx, nry, mx, my, a;\n var l, j, i;\n\n dx = this.bases[end].getX() - this.bases[start].getX();\n dy = this.bases[end].getY() - this.bases[start].getY();\n rr = Math.sqrt(dx * dx + dy * dy);\n l = end - start;\n if (l < 0){\n l += this.nbase + 1;\n }\n if (rr >= l) {\n dx /= rr;\n dy /= rr;\n for (j = 1; j < l; j++) {\n i = start + j;\n if (i > this.nbase){\n i -= this.nbase + 1;\n }\n this.bases[i].setX(\n this.bases[start].getX() + dx * j / l);\n this.bases[i].setY(\n this.bases[start].getY() + dy * j / l);\n }\n }\n else {\n this.find_center_for_arc((l - 1), rr);\n dx /= rr;\n dy /= rr;\n midx = this.bases[start].getX() + dx * rr / 2.0;\n midy = this.bases[start].getY() + dy * rr / 2.0;\n xn = dy;\n yn = -dx;\n nrx = midx + this._h * xn;\n nry = midy + this._h * yn;\n mx = this.bases[start].getX() - nrx;\n my = this.bases[start].getY() - nry;\n rr = Math.sqrt(mx * mx + my * my);\n a = Math.atan2(my, mx);\n for (j = 1; j < l; j++) {\n i = start + j;\n if (i > this.nbase){\n i -= this.nbase + 1;\n }\n this.bases[i].setX(nrx + rr * Math.cos(a + j * this.angleinc));\n this.bases[i].setY(nry + rr * Math.sin(a + j * this.angleinc));\n }\n }\n}\n\nNAView.prototype.find_center_for_arc = function find_center_for_arc(n, b){\n var h, hhi, hlow, r, disc, theta, e, phi;\n var iter;\n\n hhi = (n + 1.0) / Math.PI;\n // changed to prevent div by zero if (ih)\n hlow = -hhi - b / (n + 1.000001 - b);\n if (b < 1){\n // otherwise we might fail below (ih)\n hlow = 0;\n }\n iter = 0;\n do {\n h = (hhi + hlow) / 2.0;\n r = Math.sqrt(h * h + b * b / 4.0);\n disc = 1.0 - 0.5 / (r * r);\n if (Math.abs(disc) > 1.0) {\n console.log(\"Unexpected large magnitude discriminant = \" + disc\n + \" \" + r);\n }\n theta = Math.acos(disc);\n phi = Math.acos(h / r);\n e = theta * (n + 1) + 2 * phi - 2 * Math.PI;\n if (e > 0.0) {\n hlow = h;\n }\n else {\n hhi = h;\n }\n } while (Math.abs(e) > 0.0001 && ++iter < this.MAXITER);\n if (iter >= this.MAXITER) {\n if (noIterationFailureYet) {\n console.log(\"Iteration failed in find_center_for_arc\");\n noIterationFailureYet = false;\n }\n h = 0.0;\n theta = 0.0;\n }\n this._h = h;\n this.angleinc = theta;\n}\n\nNAView.prototype.generate_region = function generate_region(cp){\n var l, start, end, i, mate;\n var rp;\n\n rp = cp.getRegion();\n l = 0;\n if (cp.getStart() == rp.getStart1()) {\n start = rp.getStart1();\n end = rp.getEnd1();\n }\n else {\n start = rp.getStart2();\n end = rp.getEnd2();\n }\n if (this.bases[cp.getStart()].getX() > this.ANUM - 100.0\n || this.bases[cp.getEnd()].getX() > this.ANUM - 100.0) {\n console.log(\n \"Bad region passed to generate_region. Coordinates not defined.\");\n }\n for (i = start + 1; i <= end; i++) {\n l++;\n this.bases[i].setX(\n this.bases[cp.getStart()].getX() + this.HELIX_FACTOR * l\n * cp.getXrad());\n this.bases[i].setY(\n this.bases[cp.getStart()].getY() + this.HELIX_FACTOR * l\n * cp.getYrad());\n mate = this.bases[i].getMate();\n this.bases[mate].setX(\n this.bases[cp.getEnd()].getX() + this.HELIX_FACTOR * l\n * cp.getXrad());\n this.bases[mate].setY(\n this.bases[cp.getEnd()].getY() + this.HELIX_FACTOR * l\n * cp.getYrad());\n\n }\n}\n\nNAView.prototype.minf2 = function minf2(x1, x2) {\n return ((x1) < (x2)) ? (x1) : (x2);\n}\n\nNAView.prototype.maxf2 = function maxf2(x1, x2) {\n return ((x1) > (x2)) ? (x1) : (x2);\n}\n\nNAView.prototype.connected_connection = function connected_connection(cp, cpnext) {\n if (cp.isExtruded()) {\n return true;\n }\n else if (cp.getEnd() + 1 == cpnext.getStart()) {\n return true;\n }\n else {\n return false;\n }\n}\n","/* Version: 0.2\n* Date: 2015-03-15\n*/\n\nimport fstyle from './fornac.css';\n\nimport d3 from 'd3';\nimport slugid from 'slugid';\nimport {contextMenu} from './d3-context-menu.js';\n\nimport {RNAGraph} from './rnagraph.js';\nimport {ColorScheme, rnaUtilities} from './rnautils.js';\n\nimport {simpleXyCoordinates} from './simplernaplot.js';\nimport {NAView} from './naview/naview.js';\n\nexport function FornaContainer(element, passedOptions = {}) {\n var self = this;\n\n let options = {\n 'editable': false,\n 'zoomable': true,\n 'animation': true,\n 'displayAllLinks': false,\n 'labelInterval': 10,\n 'chargeDistance': 110,\n 'friction': 0.35,\n 'middleCharge': -30,\n 'otherCharge': -30,\n 'linkDistanceMultiplier': 15,\n 'initialSize': null,\n 'layout': 'standard-polygonal',\n 'transitionDuration': 500,\n 'maxNodeRadius': 80 // the maximum radius of a node when the view is centered\n };\n\n self.options = Object.assign(options, passedOptions);\n\n if (self.options.initialSize !== null) {\n self.options.svgW = self.options.initialSize[0];\n self.options.svgH = self.options.initialSize[1];\n } else {\n self.options.svgW = 300;\n self.options.svgH = 300;\n }\n\n self.linkStrengths = {\n 'pseudoknot': 0.00,\n 'proteinChain': 0.00,\n 'chainChain': 0.00,\n 'intermolecule': 10.00,\n 'external': 0.00,\n 'other': 10.00\n };\n\n self.displayParameters = {\n 'displayNumbering': true,\n 'displayNodeOutline': true,\n 'displayNodeLabel': true,\n 'displayLinks': true,\n 'displayPseudoknotLinks': true,\n 'displayProteinLinks': true,\n 'displayDirectionArrows': true\n };\n\n self.colorScheme = 'structure';\n self.customColors = {};\n self.rnas = {};\n self.extraLinks = []; //store links between different RNAs\n\n // global mouse event vars\n var mousedownLink = null,\n mousedownNode = null,\n mouseupNode = null;\n let linkContextMenuShown = false;\n\n let resetMouseVars = () => {\n mousedownNode = null;\n mouseupNode = null;\n mousedownLink = null;\n }\n\n var graph = self.graph = {\n 'nodes':[],\n 'links':[]\n };\n\n Array.prototype.equals = function (array) {\n // if the other array is a falsy value, return\n if (!array)\n return false;\n\n // compare lengths - can save a lot of time\n if (this.length != array.length)\n return false;\n\n for (var i = 0, l=this.length; i < l; i++) {\n // Check if we have nested arrays\n if (this[i] instanceof Array && array[i] instanceof Array) {\n // recurse into the nested arrays\n if (!this[i].equals(array[i]))\n return false;\n }\n else if (this[i] != array[i]) {\n // Warning - two different object instances will never be equal: {x:20} != {x:20}\n return false;\n }\n }\n return true;\n };\n\n /* Register global mouse and key events */\n if (self.options.editable || self.options.animation) {\n var shiftKeydown = false;\n var ctrlKeydown = false;\n\n let keydown = () => {\n switch (d3.event.keyCode) {\n case 68: //'d' key\n console.log('dotbracket:', self.getStructuresDotBracket());\n break;\n case 16:\n shiftKeydown = true;\n break;\n case 17:\n ctrlKeydown = true;\n break;\n case 67: //c\n self.centerView();\n break;\n }\n\n if (ctrlKeydown) {\n // Ctrl key must disable panning and zooming\n if (self.options.zoomable)\n disableZooming()\n // Ctrl Button must enable crosshair and start brusher\n if (self.options.editable || self.options.animation) {\n enableBrushing()\n }\n }\n }\n\n let keyup = () => {\n shiftKeydown = false;\n ctrlKeydown = false;\n\n // enable zoomer\n if (self.options.zoomable)\n enableZooming()\n // disable brushing events\n disableBrushing()\n }\n\n d3.select('body')\n .on('keydown', keydown)\n .on('keyup', keyup)\n .on('contextmenu', function() {\n d3.event.preventDefault();\n });\n }\n\n /* Register global context menu */\n if (self.options.editable) {\n let backgroundMenu = [\n {\n title: 'Add Node',\n action: function(elm, d, i, mousePos) {\n\n },\n children: [{\n 'title': 'A',\n action: function(elm, d, i, mousePos) {\n console.log('mousePos:', mousePos, self.options.svgW, self.options.svgH);\n let canvasMousePos = [xScale.invert(mousePos[0]),\n yScale.invert(mousePos[1])];\n console.log('canvasMousePos', canvasMousePos);\n\n self.addRNA('.', {'sequence': 'A', 'centerPos': canvasMousePos});\n }\n },\n {\n 'title': 'C',\n action: function(elm, d, i, mousePos) {\n console.log('mousePos:', mousePos, self.options.svgW, self.options.svgH);\n let canvasMousePos = [xScale.invert(mousePos[0]),\n yScale.invert(mousePos[1])];\n console.log('canvasMousePos', canvasMousePos);\n\n self.addRNA('.', {'sequence': 'C', 'centerPos': canvasMousePos});\n }\n\n },\n {\n 'title': 'G',\n action: function(elm, d, i, mousePos) {\n console.log('mousePos:', mousePos, self.options.svgW, self.options.svgH);\n let canvasMousePos = [xScale.invert(mousePos[0]),\n yScale.invert(mousePos[1])];\n console.log('canvasMousePos', canvasMousePos);\n\n self.addRNA('.', {'sequence': 'G', 'centerPos': canvasMousePos});\n }\n\n },\n {\n 'title': 'U',\n action: function(elm, d, i, mousePos) {\n console.log('mousePos:', mousePos, self.options.svgW, self.options.svgH);\n let canvasMousePos = [xScale.invert(mousePos[0]),\n yScale.invert(mousePos[1])];\n console.log('canvasMousePos', canvasMousePos);\n\n self.addRNA('.', {'sequence': 'U', 'centerPos': canvasMousePos});\n\n }\n }\n ],\n disabled: false // optional, defaults to false\n }\n ]\n\n let nodeMenu = [\n {\n title: 'Delete Node',\n action: function(elm, d, i) {\n deleteNode(d);\n },\n disabled: false // optional, defaults to false\n },\n {\n title: 'Change Node',\n action: function(elm, d, i) {\n console.log('You have clicked the second item!');\n console.log('The data for this circle is: ' + d);\n },\n children: [\n {\n title: 'A',\n action: function(elm, d, i) {\n changeNode('A', d);\n }\n },\n {\n title: 'C',\n action: function(elm, d, i) {\n changeNode('C', d);\n\n }\n },\n {\n title: 'G',\n action: function(elm, d, i) {\n changeNode('G', d);\n\n }\n },\n {\n title: 'U',\n action: function(elm, d, i) {\n changeNode('U', d);\n }\n },\n ]\n },\n {\n title: 'Insert Before',\n action: function(elm, d, i) {\n\n },\n children: [\n {\n title: 'A',\n action: function(elm, d, i) {\n insertNodeBeforeOrAfter('A', d, -1);\n }\n },\n {\n title: 'C',\n action: function(elm, d, i) {\n insertNodeBeforeOrAfter('C', d, -1);\n\n }\n },\n {\n title: 'G',\n action: function(elm, d, i) {\n insertNodeBeforeOrAfter('G', d, -1);\n\n }\n },\n {\n title: 'U',\n action: function(elm, d, i) {\n insertNodeBeforeOrAfter('U', d, -1);\n }\n },\n ]\n },\n {\n title: 'Insert After',\n action: function(elm, d, i) {\n console.log('d:', d);\n\n },\n children: [\n {\n title: 'A',\n action: function(elm, d, i) {\n insertNodeBeforeOrAfter('A', d, 0);\n\n }\n },\n {\n title: 'C',\n action: function(elm, d, i) {\n insertNodeBeforeOrAfter('C', d, 0);\n }\n },\n {\n title: 'G',\n action: function(elm, d, i) {\n insertNodeBeforeOrAfter('G', d, 0);\n }\n },\n {\n title: 'U',\n action: function(elm, d, i) {\n insertNodeBeforeOrAfter('U', d, 0);\n }\n },\n ]\n }\n ]\n\n self.nodeContextMenu = contextMenu(nodeMenu);\n self.backgroundContextMenu = contextMenu(backgroundMenu);\n\n } else {\n //console.log('empty context menu');\n self.nodeContextMenu = function() {};\n }\n\n /* Draw the plot here */\n d3.select(element).select('svg').remove();\n\n var svg = d3.select(element)\n .attr('tabindex', 1)\n .each(function() { this.focus(); })\n .append('svg:svg')\n .attr('preserveAspectRatio', 'xMidYMid meet')\n .attr('viewBox', '0 0 ' + self.options.svgW + ' ' + self.options.svgH)\n\n self.options.svg = svg;\n\n if (self.options.editable || self.options.animation) {\n var mouseEventHelper = svg.append('svg:g')\n .on('mousemove', () => {\n // only if we are dragging\n if (!mousedownNode) return;\n\n // update drag line\n let mpos = d3.mouse(vis.node());\n dragLine\n .attr('x1', mousedownNode.x)\n .attr('y1', mousedownNode.y)\n .attr('x2', mpos[0])\n .attr('y2', mpos[1]);\n })\n .on('mousedown', () => {\n })\n .on('mouseup', () => {\n if (mousedownNode && !linkContextMenuShown) {\n dragLine.classed(fstyle.transparent, true);\n }\n // clear mouse event vars\n resetMouseVars();\n //update()\n })\n .classed(fstyle.mouseEventHelper, true)\n .style('pointer-events', 'all')\n\n // draw a background layer for mouse events\n mouseEventHelper.append('svg:rect')\n .classed('background', true)\n .style('visibility', 'hidden')\n .attr('width', self.options.svgW)\n .attr('height', self.options.svgH)\n .on('mousedown', function() {\n //console.log('background click');\n deselectAllNodes()\n })\n } else {\n var mouseEventHelper = svg;\n }\n\n var vis = mouseEventHelper.append('svg:g')\n .classed(fstyle.plot, true)\n var visLinks = vis.append('svg:g')\n .classed('fornac-links', true);\n var visNodes = vis.append('svg:g')\n .classed('fornac-nodes', true);\n\n // line displayed when dragging new nodes\n if (self.options.editable) {\n var dragLine = vis.append('line')\n .attr('class', fstyle.dragLine)\n .attr('x1', 0)\n .attr('y1', 0)\n .attr('x2', 0)\n .attr('y2', 0);\n\n svg.on('contextmenu', self.backgroundContextMenu);\n }\n\n /* Zooming related objects and functions */\n var xScale = d3.scale.linear()\n .domain([0,self.options.svgW]).range([0,self.options.svgW]);\n var yScale = d3.scale.linear()\n .domain([0,self.options.svgH]).range([0, self.options.svgH]);\n\n self.zoomer = d3.behavior.zoom()\n .scaleExtent([0.1,10])\n .x(xScale)\n .y(yScale)\n .on('zoom', () => {\n vis.attr('transform',\n 'translate(' + d3.event.translate + ')' + ' scale(' + d3.event.scale + ')');\n });\n\n let enableZooming = () => {\n svg.call(self.zoomer)\n .on(\"dblclick.zoom\", null);\n }\n\n let disableZooming = () => {\n svg.call(self.zoomer)\n .on(\"dblclick.zoom\", null)\n .on('mousedown.zoom', null)\n .on('touchstart.zoom', null)\n .on('touchmove.zoom', null)\n .on('touchend.zoom', null);\n }\n\n if (self.options.zoomable)\n enableZooming()\n\n /* Node selection related objects and functions */\n let toggleSelectNode = (node) => {\n node.selected = !node.selected;\n visNodes.selectAll('g.gnode').filter((d) => { return node.uid == d.uid; })\n .classed(fstyle.selectedNode, function(p) { return p.selected; });\n }\n\n let selectNode = (node) => {\n node.selected = true;\n visNodes.selectAll('g.gnode').filter((d) => { return node.uid == d.uid; })\n .classed(fstyle.selectedNode, function(p) { return p.selected; });\n }\n\n let deselectAllNodes = () => {\n visNodes.selectAll('g.gnode')\n .classed(fstyle.selectedNode, function(p) { return p.selected = false; });\n }\n\n let selectedNodes = () => {\n // return all selected nodes\n return visNodes.selectAll('g.gnode').filter(function(d) { return d.selected; });\n }\n\n self.brusher = d3.svg.brush()\n .x(xScale)\n .y(yScale)\n .on('brushstart', function(d) {})\n .on('brush', function() {\n // during brushing invert styling of selection as preview\n let extent = d3.event.target.extent();\n\n visNodes.selectAll('g.gnode')\n .classed(fstyle.selectedNode, function (d) {\n return d.selected ^ (extent[0][0] <= d.x && d.x < extent[1][0]\n && extent[0][1] <= d.y && d.y < extent[1][1])\n })\n })\n .on('brushend', function() {\n // after brushing finally toggle the selection\n let extent = d3.event.target.extent();\n\n visNodes.selectAll('g.gnode')\n .filter(function (d) {\n return extent[0][0] <= d.x && d.x < extent[1][0]\n && extent[0][1] <= d.y && d.y < extent[1][1]\n })\n .each(toggleSelectNode)\n\n d3.event.target.clear();\n d3.select(this).call(d3.event.target);\n });\n\n let enableBrushing = () => {\n // crosshair curson\n mouseEventHelper.select('.background').style('cursor', 'crosshair');\n // bind brusher\n mouseEventHelper.call(self.brusher);\n }\n\n let disableBrushing = () => {\n // normal cursor\n mouseEventHelper.select('.background').style('cursor', 'auto');\n // disable brushing events\n mouseEventHelper.call(self.brusher)\n .on('mousedown.brush', null)\n .on('touchstart.brush', null)\n .on('touchmove.brush', null)\n .on('touchend.brush', null);\n }\n\n /* Force related objects and functions */\n self.force = d3.layout.force()\n .charge(function(d) {\n if (d.nodeType == 'middle')\n return self.options.middleCharge;\n else\n return self.options.otherCharge;\n })\n .friction(self.options.friction)\n .linkDistance(function(d) { return self.options.linkDistanceMultiplier * d.value; })\n .linkStrength(function(d) { if (d.linkType in self.linkStrengths) {\n return self.linkStrengths[d.linkType];\n } else {\n return self.linkStrengths.other; }\n })\n .gravity(0.000)\n .nodes(self.graph.nodes)\n .links(self.graph.links)\n .chargeDistance(self.options.chargeDistance)\n .size([self.options.svgW, self.options.svgH]);\n\n var drag = d3.behavior.drag()\n .on('dragstart', function(d) {\n console.log('dragstart')\n d3.event.sourceEvent.stopPropagation();\n\n selectedNodes().each(function(d1) {\n d1.fixed |= 2;\n });\n })\n .on('drag', (d) => {\n if (shiftKeydown) return\n selectedNodes().each(function(d1) {\n d1.x += d3.event.dx;\n d1.y += d3.event.dy;\n\n d1.px += d3.event.dx;\n d1.py += d3.event.dy;\n });\n\n self.resumeForce();\n d3.event.sourceEvent.preventDefault();\n })\n .on('dragend', (d) => {\n console.log('dragend')\n selectedNodes().each(function(d1) {\n d1.fixed &= ~6;\n });\n });\n\n /* Main plot drawing functions */\n let createInitialLayout = function(structure, passedOptions = {}) {\n // the default options\n let options = {\n 'sequence': '',\n 'name': 'empty',\n 'positions': [],\n 'labelInterval': self.options.labelInterval,\n 'avoidOthers': true,\n 'uids': [],\n 'circularizeExternal': true\n };\n\n options = Object.assign(options, passedOptions);\n\n //console.log('options.uids:', options.uids);\n let rg = new RNAGraph(options.sequence, structure, options.name);\n rg.circularizeExternal = options.circularizeExternal;\n\n let rnaJson = rg.recalculateElements();\n\n if (options.positions.length === 0) {\n // no provided positions means we need to calculate an initial layout\n\n if (self.options.layout == 'naview') {\n let naview = new NAView();\n\n let naViewPositions = naview.naview_xy_coordinates(rg.pairtable);\n options.positions = []\n for (let i = 0; i < naViewPositions.nbase; i++)\n options.positions.push([naViewPositions.x[i], naViewPositions.y[i]]);\n } else {\n options.positions = simpleXyCoordinates(rnaJson.pairtable);\n }\n }\n\n rnaJson = rnaJson.elementsToJson()\n .addUids(options.uids)\n .addPositions('nucleotide', options.positions)\n .addLabels(1, options.labelInterval)\n .reinforceStems()\n .reinforceLoops()\n .connectFakeNodes()\n .reassignLinkUids()\n .breakNodesToFakeNodes();\n\n return rnaJson;\n };\n\n let createNewNodes = function(gnodesEnter) {\n gnodesEnter = gnodesEnter.append('g')\n .classed('gnode', true)\n .attr('struct_name', function(d) { return d.structName; })\n .attr('transform', function(d) {\n if (typeof d.x != 'undefined' && typeof d.y != 'undefined')\n return 'translate(' + [d.x, d.y] + ')';\n else\n return '';\n })\n .each( function(d) { d.selected = d.previouslySelected = false; });\n\n gnodesEnter\n .attr('num', function(d) { return 'n' + d.num; })\n .attr('rnum', function(d) {\n return 'n' + (d.rna.rnaLength - d.num + 1); })\n .transition()\n .duration(750)\n .ease('elastic');\n\n if (self.options.editable || self.options.animation) {\n gnodesEnter.on('mousedown', nodeMousedown)\n //.on('mousedrag', function(d) {})\n .on('mouseup', nodeMouseup)\n .on('contextmenu', self.nodeContextMenu)\n .call(drag)\n }\n\n let labelAndProteinNodes = gnodesEnter.filter(function(d) {\n return d.nodeType == 'label' || d.nodeType == 'protein';\n });\n\n let nucleotideNodes = gnodesEnter.filter(function(d) {\n return d.nodeType == 'nucleotide';\n });\n\n labelAndProteinNodes.append('svg:circle')\n .classed(fstyle.node, true)\n .attr('r', function(d) {\n if (d.nodeType == 'middle') return 0;\n else {\n return d.radius;\n }\n })\n .attr('node_type', function(d) { return d.nodeType; })\n .attr('node_num', function(d) { return d.num; });\n\n // direction arrows\n nucleotideNodes.append('svg:path')\n .attr('class', fstyle.directionArrow)\n .attr('node_num', function(d) { return d.num; })\n\n // nucleotide outlines\n nucleotideNodes.append('svg:circle')\n .attr('class', fstyle.node)\n .attr('node_type', function(d) { return d.nodeType; })\n .attr('node_num', function(d) { return d.num; })\n .attr('r', function(d) { return d.radius; })\n .append('svg:title')\n .text(function(d) {\n if (d.nodeType == 'nucleotide') {\n return d.structName + ':' + d.num;\n } else {\n return '';\n }\n });\n\n // nucleotide labels\n var labelsEnter = gnodesEnter.append('text')\n .text(function(d) { return d.name; })\n .attr('class', fstyle.nodeLabel)\n .attr('label_type', function(d) { return d.nodeType; })\n\n // nucleotide label title\n labelsEnter.append('svg:title')\n .text(function(d) {\n if (d.nodeType == 'nucleotide') {\n return d.structName + ':' + d.num;\n } else {\n return '';\n }\n });\n\n return gnodesEnter;\n };\n\n let createNewLinks = function(linksEnter) {\n var linkLines = linksEnter.append('svg:line');\n\n linkLines.append('svg:title')\n .text((d) => { return d.linkType + ':' + d.source.num + '-' + d.target.num });\n\n linkLines\n .classed('link', true)\n .classed(fstyle.link, true)\n .attr('x1', function(d) { return d.source.x; })\n .attr('y1', function(d) { return d.source.y; })\n .attr('x2', function(d) { return d.target.x; })\n .attr('y2', function(d) { return d.target.y; })\n .attr('link_type', function(d) { return d.linkType; } )\n .attr('pointer-events', function(d) { if (d.linkType == 'fake') return 'none'; else return 'all';});\n\n if (self.options.editable)\n linkLines.on('click', linkClick);\n\n /* We don't need to update the positions of the stabilizing links */\n /*\n basepairLinks = visLinks.selectAll('[link_type=basepair]');\n basepairLinks.classed('basepair', true);\n\n fakeLinks = visLinks.selectAll('[link_type=fake]')\n fakeLinks.classed('fake', true);\n\n intermolecule_links = vis_links.selectAll('[link_type=intermolecule]');\n intermolecule_links.classed('intermolecule', true);\n\n plink = vis_links.selectAll('[link_type=protein_chain],[link_type=chain_chain]');\n plink.classed('chain_chain', true);\n */\n\n return linkLines;\n };\n\n function drawDirectionArrow(d) {\n let magnitude = (x) => {\n return Math.sqrt(x[0] * x[0] + x[1] * x[1]);\n }\n\n let endPoint = d;\n let startPoint = d.prevNode;\n // get stroke width and arrow size values from css\n let nodeStroke = parseFloat(fstyle.nodeStrokeWidth) / 2;\n let lengthMult = parseFloat(fstyle.directionArrowSize);\n let arrowWidth = parseFloat(fstyle.directionArrowWidth);\n\n if (startPoint === null)\n return;\n\n // does this node have a link pointing to it?\n if (!d.linked)\n return;\n\n // point back toward the previous node\n let u = [-(endPoint.x - startPoint.x), -(endPoint.y - startPoint.y)];\n\n if (u[0] == 0 && u[1] == 0)\n return; // will lead to a NaN error\n\n // scale u to unit length\n u = [u[0] / magnitude(u), u[1] / magnitude(u)];\n // normal vector of u\n let v = [-u[1], u[0]];\n\n // calculate the tip position\n let arrowTip = [(d.radius + nodeStroke) * u[0], (d.radius + nodeStroke) * u[1]];\n\n let path = 'M' + (arrowTip[0] + lengthMult * (u[0]/2 + v[0]*arrowWidth/2)) + ',' + (arrowTip[1] + lengthMult * (u[1]/2 + v[1]*arrowWidth/2)) +\n 'L' + (arrowTip[0]) + ',' + (arrowTip[1]) +\n 'L' + (arrowTip[0] + lengthMult * (u[0]/2 - v[0]*arrowWidth/2)) + ',' + (arrowTip[1] + lengthMult * (u[1]/2 - v[1]*arrowWidth/2));\n\n d3.select(this).attr('d', path);\n }\n\n let realLinkFilter = (d) => {\n return d.linkType == 'basepair' ||\n d.linkType == 'backbone' ||\n d.linkType == 'intermolecule' ||\n d.linkType == 'pseudoknot' ||\n d.linkType == 'label_link' ||\n d.linkType == 'external' ||\n d.linkType == 'chain_chain';\n }\n\n let recalculateGraph = () => {\n // Condense all of the individual RNAs into one\n // collection of nodes and links\n self.graph.nodes = [];\n self.graph.links = [];\n for (let uid in self.rnas) {\n self.graph.nodes = self.graph.nodes.concat(self.rnas[uid].nodes);\n self.graph.links = self.graph.links.concat(self.rnas[uid].links);\n }\n\n // Create a lookup table so that we can access each node\n // based on its uid. This will be used to create the links\n // between different RNAs\n var uidsToNodes = {};\n\n for (let i = 0; i < self.graph.nodes.length; i++)\n uidsToNodes[self.graph.nodes[i].uid] = self.graph.nodes[i];\n\n self.graph.links.forEach(function(link) {\n link.source = uidsToNodes[link.source.uid];\n link.target = uidsToNodes[link.target.uid];\n });\n\n for (let i = 0; i < self.extraLinks.length; i++) {\n // the actual node objects may have changed, so we hae to recreate\n // the extra links based on the uids\n if (!(self.extraLinks[i].target.uid in uidsToNodes)) {\n console.log('not there:', self.extraLinks[i]);\n continue;\n }\n\n self.extraLinks[i].source = uidsToNodes[self.extraLinks[i].source.uid];\n self.extraLinks[i].target = uidsToNodes[self.extraLinks[i].target.uid];\n\n if (self.extraLinks[i].linkType == 'intermolecule') {\n //remove links to middle nodes\n let fakeLinks = self.graph.links.filter(function(d) {\n return ((d.source == self.extraLinks[i].source || d.source == self.extraLinks[i].target ||\n d.target == self.extraLinks[i].source || d.target == self.extraLinks[i].source) &&\n d.linkType == 'fake');\n });\n\n for (let j = 0; j < fakeLinks.length; j++) {\n let linkIndex = self.graph.links.indexOf(fakeLinks[j]);\n self.graph.links.splice(linkIndex, 1);\n }\n }\n\n graph.links.push(self.extraLinks[i]);\n }\n };\n\n self.update = function () {\n self.force.nodes(self.graph.nodes)\n .links(self.graph.links);\n\n if (self.options.animation) {\n self.force.start();\n }\n\n let allLinks = visLinks.selectAll('line.link')\n .data(self.graph.links.filter(realLinkFilter), elementKey);\n\n allLinks.attr('class', '')\n .classed('link', true)\n .classed(fstyle.link, true)\n .attr('link_type', function(d) { return d.linkType; } )\n\n let linksEnter = allLinks.enter();\n createNewLinks(linksEnter);\n\n allLinks.exit().remove();\n\n let gnodes = visNodes.selectAll('g.gnode')\n .data(self.graph.nodes, elementKey);\n //.attr('pointer-events', 'all');\n\n let gnodesEnter = gnodes.enter();\n createNewNodes(gnodesEnter);\n gnodes.exit().remove();\n\n\n //fake_nodes = self.graph.nodes.filter(function(d) { return d.nodeType == 'middle'; });\n //fakeNodes = self.graph.nodes.filter(function(d) { return true; });\n let realNodes = self.graph.nodes.filter(function(d) { return d.nodeType == 'nucleotide' || d.nodeType == 'label';});\n\n gnodes.select('.' + fstyle.directionArrow).each(drawDirectionArrow);\n\n self.force.on('tick', function() {\n let q = d3.geom.quadtree(realNodes);\n let i = 0;\n let n = realNodes.length;\n\n let collide = (node) => {\n let r = node.radius + 16,\n nx1 = node.x - r,\n nx2 = node.x + r,\n ny1 = node.y - r,\n ny2 = node.y + r;\n return function(quad, x1, y1, x2, y2) {\n if (quad.point && (quad.point !== node)) {\n let x = node.x - quad.point.x,\n y = node.y - quad.point.y,\n l = Math.sqrt(x * x + y * y),\n r = node.radius + quad.point.radius;\n if (l < r) {\n l = (l - r) / l * 0.1;\n node.x -= x *= l;\n node.y -= y *= l;\n quad.point.x += x;\n quad.point.y += y;\n }\n }\n return x1 > nx2 || x2 < nx1 || y1 > ny2 || y2 < ny1;\n };\n }\n\n while (++i < n) q.visit(collide(realNodes[i]));\n\n allLinks.attr('x1', function(d) { return d.source.x; })\n .attr('y1', function(d) { return d.source.y; })\n .attr('x2', function(d) { return d.target.x; })\n .attr('y2', function(d) { return d.target.y; });\n\n // Translate the groups\n gnodes.attr('transform', function(d) {\n return 'translate(' + [d.x, d.y] + ')';\n });\n\n gnodes.select('.' + fstyle.directionArrow).each(drawDirectionArrow);\n\n });\n\n self.force.on('end', () => {\n gnodes.selectAll('[node_type=nucleotide]')\n .filter((d,i) => { if (i == 0) return true; else return false; })\n .each((d,i) => {\n //console.log(\"pos\", d.num, d.x, d.y);\n });\n\n //for (let uid in self.rnas) {\n // for (let i = 1; i < self.rnas[uid].pairtable[0]; i++) {\n // console.log('pt', i, self.rnas[uid].pairtable[i]);\n // }\n //}\n\n });\n\n self.changeColorScheme(self.colorScheme);\n\n if (self.options.animation) {\n self.force.start();\n }\n\n updateStyle();\n };\n\n self.transitionRNA = function(newStructure, nextFunction) {\n if (self.dotbracket == newStructure) {\n return;\n } else {\n self.dotbracket = newStructure;\n }\n //transition from an RNA which is already displayed to a new structure\n var duration = self.options.transitionDuration;\n\n var uids = self.graph.nodes\n .filter(function(d) { return d.nodeType == 'nucleotide'; })\n .map(function(d) { return d.uid; });\n\n let options = {'uids': uids};\n var newRNAJson = createInitialLayout(newStructure, options);\n\n let gnodes = visNodes.selectAll('g.gnode').data(newRNAJson.nodes, elementKey);\n var links = visLinks.selectAll('line.link').data(newRNAJson.links.filter(realLinkFilter), elementKey);\n\n if (duration === 0)\n gnodes.attr('transform', function(d) {\n return 'translate(' + [d.x, d.y] + ')';\n });\n else {\n gnodes.transition()\n .attr('transform', function(d) {\n return 'translate(' + [d.x, d.y] + ')'; }).duration(duration);\n }\n\n\n var newNodes = createNewNodes(gnodes.enter())\n .attr('transform', function(d) {\n if (typeof d.x != 'undefined' && typeof d.y != 'undefined')\n return 'translate(' + [0, 0] + ')';\n else\n return '';\n });\n\n if (duration === 0)\n gnodes.exit().remove();\n else\n gnodes.exit().transition()\n .attr('transform', function(d) {\n if (typeof d.x != 'undefined' && typeof d.y != 'undefined')\n return 'translate(' + [0, 0] + ')';\n else\n return '';\n });\n\n self.graph.nodes = gnodes.data();\n gnodes.select('.' + fstyle.directionArrow).each(drawDirectionArrow);\n self.changeColorScheme(self.colorScheme);\n updateStyle();\n self.centerView(duration);\n\n function endall(transition, callback) {\n if (transition.size() === 0) { setTimeout(callback, duration); }\n var n = 0;\n transition\n .each(function() { ++n; })\n .each('end', function() { if (!--n) callback.apply(this, arguments); });\n }\n\n function afterAnimation() {\n var newLinks = createNewLinks(links.enter());\n self.graph.links = links.data();\n self.changeColorScheme(self.colorScheme);\n updateStyle();\n\n if (typeof nextFunction != 'undefined')\n nextFunction();\n\n }\n\n links.exit().remove();\n\n if (duration === 0) {\n links\n .attr('x1', function(d) { return d.source.x; })\n .attr('y1', function(d) { return d.source.y; })\n .attr('x2', function(d) { return d.target.x; })\n .attr('y2', function(d) { return d.target.y; });\n\n var newLinks = createNewLinks(links.enter());\n self.graph.links = links.data();\n\n updateStyle();\n } else {\n links.transition()\n .attr('x1', function(d) { return d.source.x; })\n .attr('y1', function(d) { return d.source.y; })\n .attr('x2', function(d) { return d.target.x; })\n .attr('y2', function(d) { return d.target.y; })\n .duration(duration)\n .call(endall, afterAnimation);\n }\n\n if (duration === 0) {\n newNodes\n .attr('transform', function(d) {\n if (typeof d.x != 'undefined' && typeof d.y != 'undefined')\n return 'translate(' + [d.x, d.y] + ')';\n else\n return '';\n });\n } else {\n newNodes.transition()\n .attr('transform', function(d) {\n if (typeof d.x != 'undefined' && typeof d.y != 'undefined')\n return 'translate(' + [d.x, d.y] + ')';\n else\n return '';\n });\n }\n\n };\n\n /* Plot presentation related functions */\n let getBoundingBoxTransform = () => {\n // Center the view on the molecule(s) and scale it so that everything\n // fits in the window\n\n //no molecules, nothing to do\n if (self.graph.nodes.length === 0)\n return {'translate': [0,0], 'scale': 1};\n\n // Get the bounding box\n var minX = d3.min(self.graph.nodes.map(function(d) {return d.x;}));\n var minY = d3.min(self.graph.nodes.map(function(d) {return d.y;}));\n\n var maxX = d3.max(self.graph.nodes.map(function(d) {return d.x;}));\n var maxY = d3.max(self.graph.nodes.map(function(d) {return d.y;}));\n\n var maxRadius = d3.max(self.graph.nodes.map(function(d) { return d.radius; }));\n\n // The width and the height of the molecule\n var molWidth = maxX - minX;\n var molHeight = maxY - minY;\n\n // how much larger the drawing area is than the width and the height\n var widthRatio = self.options.svgW / (molWidth + 1);\n var heightRatio = self.options.svgH / (molHeight + 1);\n\n // we need to fit it in both directions, so we scale according to\n // the direction in which we need to shrink the most\n var minRatio = Math.min(widthRatio, heightRatio,\n self.options.maxNodeRadius / maxRadius) * 0.8;\n\n // the new dimensions of the molecule\n var newMolWidth = molWidth * minRatio;\n var newMolHeight = molHeight * minRatio;\n\n // translate so that it's in the center of the window\n var xTrans = -(minX) * minRatio + (self.options.svgW - newMolWidth) / 2;\n var yTrans = -(minY) * minRatio + (self.options.svgH - newMolHeight) / 2;\n\n return {'translate': [xTrans, yTrans], 'scale': minRatio};\n };\n\n self.centerView = function(duration = 0) {\n var bbTransform = getBoundingBoxTransform();\n\n if (bbTransform === null)\n return;\n\n // do the actual moving\n vis.transition().attr('transform',\n 'translate(' + bbTransform.translate + ')' + ' scale(' + bbTransform.scale + ')').duration(duration);\n\n // tell the zoomer what we did so that next we zoom, it uses the\n // transformation we entered here\n self.zoomer.translate(bbTransform.translate);\n self.zoomer.scale(bbTransform.scale);\n };\n\n self.setSize = (\n svgW = d3.select(element).node().offsetWidth,\n svgH = d3.select(element).node().offsetHeight\n ) => {\n // save width and height\n self.options.svgW = svgW;\n self.options.svgH = svgH;\n\n // set the viewBox\n svg.attr('viewBox', \"0 0 \" + svgW + \" \" + svgH)\n\n //Set the output range of the scales\n xScale.range([0, svgW]).domain([0, svgW]);\n yScale.range([0, svgH]).domain([0, svgH]);\n\n //re-attach the scales to the zoom behaviour\n self.zoomer.x(xScale)\n .y(yScale);\n self.brusher.x(xScale)\n .y(yScale);\n\n //resize the background\n svg.select('.background')\n .attr('width', svgW)\n .attr('height', svgH);\n\n // center the view\n self.centerView();\n }\n\n /* Style and color related functions */\n self.setOutlineColor = function(color) {\n var nodes = visNodes.selectAll('g.gnode').select('[node_type=nucleotide]');\n nodes.style('fill', color);\n }\n\n self.addCustomColors = function addCustomColors(json) {\n // Add a json file containing the custom colors\n self.customColors = json;\n self.changeColorScheme('custom');\n };\n\n self.addCustomColorsText = function(customColorsText) {\n let cs = new ColorScheme(customColorsText);\n self.customColors = cs.colorsJson;\n self.changeColorScheme('custom');\n };\n\n self.changeColorScheme = function(newColorScheme) {\n var proteinNodes = visNodes.selectAll('[node_type=protein]');\n\n proteinNodes.classed(fstyle.node, true)\n .attr('r', function(d) { return d.radius; });\n\n var gnodes = visNodes.selectAll('g.gnode');\n var circles = visNodes.selectAll('g.gnode').selectAll('circle');\n var nodes = visNodes.selectAll('g.gnode').select('[node_type=nucleotide]');\n self.colorScheme = newColorScheme;\n\n\n if (newColorScheme == 'sequence') {\n var scale = d3.scale.ordinal()\n .range(['#dbdb8d', '#98df8a', '#ff9896', '#aec7e8', '#aec7e8'])\n .domain(['A','C','G','U','T']);\n nodes.style('fill', function(d) {\n return scale(d.name);\n });\n\n } else if (newColorScheme == 'structure') {\n var scale = d3.scale.category10()\n .domain(['s','m','i','e','t','h','x'])\n .range(['lightgreen', '#ff9896', '#dbdb8d', 'lightsalmon',\n 'lightcyan', 'lightblue', 'transparent']);\n\n nodes.style('fill', function(d) {\n return scale(d.elemType);\n });\n\n } else if (newColorScheme == 'positions') {\n nodes.style('fill', function(d) {\n var scale = d3.scale.linear()\n .range(['#98df8a', '#dbdb8d', '#ff9896'])\n .interpolate(d3.interpolateLab)\n .domain([1, 1 + (d.rna.rnaLength - 1) / 2, d.rna.rnaLength]);\n\n return scale(d.num);\n });\n } else if (newColorScheme == 'custom') {\n // scale to be used in case the user passes scalar\n // values rather than color names\n if (typeof self.customColors != 'undefined' &&\n 'domain' in self.customColors &&\n 'range' in self.customColors) {\n var scale = d3.scale.linear()\n .interpolate(d3.interpolateLab)\n .domain(self.customColors.domain)\n .range(self.customColors.range);\n }\n\n let changeColors = (moleculeColors, d, scale) => {\n if (moleculeColors.hasOwnProperty(d.num)) {\n let val = parseFloat(moleculeColors[d.num]);\n\n if (isNaN(val)) {\n // passed in color is not a scalar, so\n // treat it as a color\n return moleculeColors[d.num];\n } else {\n // the user passed in a float, let's use a colormap\n // to convert it to a color\n return scale(val);\n }\n } else {\n return 'white';\n }\n }\n\n nodes.style('fill', function(d) {\n if (typeof self.customColors == 'undefined' ||\n !self.customColors.hasOwnProperty('colorValues')) {\n return 'white';\n }\n\n if (self.customColors.colorValues.hasOwnProperty(d.structName) &&\n self.customColors.colorValues[d.structName].hasOwnProperty(d.num)) {\n // if a molecule name is specified, it supercedes the default colors\n // (for which no molecule name has been specified)\n let moleculeColors = self.customColors.colorValues[d.structName];\n return changeColors(moleculeColors, d, scale);\n } else if (self.customColors.colorValues.hasOwnProperty('')) {\n let moleculeColors = self.customColors.colorValues[''];\n return changeColors(moleculeColors, d, scale);\n }\n\n return 'white';\n });\n }\n };\n\n let updateStyle = () => {\n // Numbering\n visNodes.selectAll('[node_type=label]').classed(fstyle.transparent, !self.displayParameters.displayNumbering);\n visNodes.selectAll('[label_type=label]').classed(fstyle.transparent, !self.displayParameters.displayNumbering);\n visLinks.selectAll('[link_type=label_link]').classed(fstyle.transparent, !self.displayParameters.displayNumbering);\n // Node Outline\n svg.selectAll('[node_type=nucleotide]').classed(fstyle.transparent, !self.displayParameters.displayNodeOutline);\n // Node Labels\n visNodes.selectAll('[label_type=nucleotide]').classed(fstyle.transparent, !self.displayParameters.displayNodeLabel);\n // Links\n svg.selectAll('[link_type=real],[link_type=basepair],[link_type=backbone],[link_type=pseudoknot],[link_type=protein_chain],[link_type=chain_chain],[link_type=external]').classed(fstyle.transparent, !self.displayParameters.displayLinks);\n // Pseudoknot Links\n svg.selectAll('[link_type=pseudoknot]').classed(fstyle.transparent, !self.displayParameters.displayPseudoknotLinks);\n // Protein Links\n svg.selectAll('[link_type=protein_chain]').classed(fstyle.transparent, !self.displayParameters.displayProteinLinks);\n // Fake Links\n visLinks.selectAll('[link_type=fake]').classed(fstyle.transparent, !self.options.displayAllLinks);\n visLinks.selectAll('[link_type=fake_fake]').classed(fstyle.transparent, !self.options.displayAllLinks);\n // direction Arrows\n svg.selectAll('.' + fstyle.directionArrow).classed(fstyle.transparent, !self.displayParameters.displayDirectionArrows);\n };\n\n /* RNA edditing related functions */\n let changeNode = function(nodeName, referenceNode) {\n // change the label of a node\n let rna = referenceNode.rna;\n\n let dotbracket = rnaUtilities.pairtableToDotbracket(rna.pairtable);\n let positions = rna.getPositions('nucleotide');\n let sequence = rna.seq\n let uids = rna.getUids();\n\n let newNodeNum = referenceNode.num;\n\n let newDotbracket = dotbracket;\n let newSequence = sequence.slice(0,newNodeNum-1) + nodeName + sequence.slice(newNodeNum);\n\n console.log('newSequence:', newSequence);\n\n console.log('uids:', uids);\n uids.splice(newNodeNum-1, 1, slugid.nice());\n let newPositions = positions;\n\n delete self.rnas[rna.uid];\n let newRNA = self.addRNA(newDotbracket, {'sequence': newSequence,\n 'positions': newPositions,\n 'uids': uids,\n 'centerView': false});\n }\n\n let insertNodeBeforeOrAfter = function(nodeName, referenceNode, positionOffset) {\n //insert a new node before or after another one\n //positionOffset specifies who far from the original to insert the new node\n let rna = referenceNode.rna;\n\n let dotbracket = rnaUtilities.pairtableToDotbracket(rna.pairtable);\n let positions = rna.getPositions('nucleotide');\n let sequence = rna.seq\n let uids = rna.getUids();\n\n let newNodeNum = referenceNode.num + positionOffset;\n\n let newDotbracket = dotbracket.slice(0,newNodeNum) + '.' + dotbracket.slice(newNodeNum);\n let newSequence = sequence.slice(0,newNodeNum) + nodeName + sequence.slice(newNodeNum);\n\n console.log('newSequence:', newSequence);\n\n uids.splice(newNodeNum, 0, slugid.nice());\n positions.splice(newNodeNum, 0, positions[newNodeNum - positionOffset-1]);\n\n let newUids = uids;\n let newPositions = positions;\n\n console.log('positions:', positions);\n console.log('new node positions:', newPositions);\n\n delete self.rnas[rna.uid];\n let newRNA = self.addRNA(newDotbracket, {'sequence': newSequence,\n 'positions': newPositions,\n 'uids': newUids,\n 'centerView': false});\n }\n\n let deleteNode = function(node) {\n console.log('deleting...', node);\n // get the dotbracket string for this rna\n let rna = node.rna;\n let pair = rna.pairtable[node.num];\n\n // remove basepairs for this node\n if (pair != 0) {\n rna.pairtable[node.num] = 0;\n rna.pairtable[pair] = 0;\n }\n\n let dotbracket = rnaUtilities.pairtableToDotbracket(rna.pairtable);\n let positions = rna.getPositions('nucleotide');\n let sequence = rna.seq\n let uids = rna.getUids();\n\n let newDotbracket = dotbracket.slice(0, node.num-1) + dotbracket.slice(node.num)\n let newPositions = positions.slice(0, node.num-1)\n .concat(positions.slice(node.num));\n let newSequence = sequence.slice(0, node.num-1) + sequence.slice(node.num)\n let newUids = uids.slice(0, node.num-1)\n .concat(uids.slice(node.num));\n\n delete self.rnas[rna.uid];\n let newRNA = self.addRNA(newDotbracket, {'sequence': newSequence,\n 'positions': newPositions,\n 'uids': newUids,\n 'centerView': false});\n\n console.log('new dotbracket:', newDotbracket);\n //recalculateGraph();\n\n //remove backbone links associated with this node\n\n //remove this node\n\n }\n\n let elementKey = (d) => {\n return d.uid;\n };\n\n let updateRnaGraph = function(r) {\n let nucleotidePositions = r.getPositions('nucleotide');\n let labelPositions = r.getPositions('label');\n\n let uids = r.getUids();\n\n r.recalculateElements()\n .elementsToJson()\n .addPseudoknots()\n .addPositions('nucleotide', nucleotidePositions)\n .addUids(uids)\n .addLabels(1, self.options.labelInterval)\n .addPositions('label', labelPositions)\n .reinforceStems()\n .reinforceLoops()\n .updateLinkUids();\n };\n\n let removeBackBoneLink = function(d) {\n if (d.target.num - d.source.num != 1) {\n console.log('ERROR: non adjacent nodes. Target:', d.target,\n 'Source:', d.source, 'Link:', d);\n return;\n }\n\n let rna = d.target.rna;\n let toRemove = [];\n\n for (let i = 0; i < rna.links.length; i++) {\n let link = rna.links[i];\n\n if (link.linkType != 'basepair')\n continue;\n\n if (link.source.num <= d.source.num && link.target.num >= d.target.num) {\n console.log('crossing basepair', link);\n toRemove.push(link);\n }\n }\n\n\n // Remove all base pairs that are between these two nodes and add them as extra\n // links\n console.log('toRemove:', toRemove);\n\n for (let i = 0; i < toRemove.length; i++) {\n rna.pairtable[toRemove[i].source.num] = 0;\n rna.pairtable[toRemove[i].target.num] = 0;\n\n toRemove[i].from = toRemove[i].source.num;\n toRemove[i].to = toRemove[i].target.num - d.source.num;\n }\n\n // extract the dotbracket string of the rna\n // cut it at the position of this backbone bond\n let sequence = rna.seq;\n let sequence1 = rna.seq.slice(0, d.source.num);\n let sequence2 = rna.seq.slice(d.source.num);\n\n let rnaDotBracket = rnaUtilities.pairtableToDotbracket(rna.pairtable);\n let dotBracket1 = rnaDotBracket.slice(0, d.source.num);\n let dotBracket2 = rnaDotBracket.slice(d.source.num)\n\n // get the nucleotide positions\n // cut them at the positions of the backbone bond\n let positions = rna.getPositions('nucleotide')\n let uids = rna.getUids();\n\n let positions1 = positions.slice(0, d.source.num);\n let positions2 = positions.slice(d.source.num);\n\n let uids1 = uids.slice(0, d.source.num);\n let uids2 = uids.slice(d.source.num);\n\n console.log('positions1:', positions1);\n console.log('positions2:', positions2);\n\n delete self.rnas[rna.uid];\n let rna1 = self.addRNA(dotBracket1, { 'sequence': sequence1,\n 'positions': positions1,\n 'uids': uids1 });\n let rna2 = self.addRNA(dotBracket2, { 'sequence': sequence2,\n 'positions': positions2,\n 'uids': uids2 });\n for (let i = 0; i < toRemove.length; i++) {\n console.log('rna1:', rna1);\n console.log('rna2:', rna2);\n console.log('toRemove[i]', toRemove[i]);\n self.extraLinks.push(\n {'source': rna1.nodes[toRemove[i].from-1],\n 'target': rna2.nodes[toRemove[i].to-1],\n 'value': 1,\n 'uid': slugid.nice(),\n 'linkType': 'intermolecule'});\n recalculateGraph();\n self.update();\n\n }\n console.log('self.extraLinks:', self.extraLinks);\n //self.extraLinks.push({'source': rna1.nodes[\n\n // create two new rnas\n // add their positions\n // add them back to the plot\n }\n\n let splitMultiStrand = function(rna) {\n // split a multi strand RNA into its individual strands\n // get the position of the '&' character in the dotbracket string\n let breakPositions = [];\n for (let i = 0; i < rna.dotbracket.length; i++) {\n if (rna.dotbracket[i] == '&') {\n breakPositions.push(i);\n }\n }\n\n let toRemove = [];\n // collect all the base pairs that are between split strands\n for (let i = 0; i < rna.links.length; i++) {\n let link = rna.links[i];\n\n if (link.linkType != 'basepair')\n continue; // only consider base pairs\n \n for (let j = 0; j < breakPositions.length; j++) {\n let node = rna.nodes[breakPositions[j]]; // take the split node\n // take the two links that connect the split node \n let linkSource = rna.links.filter(link => link.source === node)[0];\n let linkTarget = rna.links.filter(link => link.target === node)[0];\n if (link.source.num <= linkSource.source.num && link.target.num >= linkTarget.target.num) {\n console.log('crossing basepair', link);\n link.breakFrom = 0;\n // find the strand that the source is in\n for (let k = 0; k < breakPositions.length - 1; k++) {\n if (link.source.num > breakPositions[k] && link.source.num < breakPositions[k+1])\n link.breakFrom = k+1;\n }\n // find the strand that the target is in\n link.breakTo = j+1; \n link.from = link.source.num;\n // find the position of the source in the strand\n if (link.breakFrom > 0) link.from -= breakPositions[link.breakFrom-1] + link.breakFrom;\n // find the position of the target in the strand\n link.to = link.target.num - linkTarget.target.num;\n toRemove.push(link);\n }\n }\n }\n\n\n // Remove all base pairs that are between these two nodes and add them as extra\n // links\n console.log('toRemove:', toRemove);\n let sequences = rna.seq.split('&');\n\n // remove the base pairs\n for (let i = 0; i < toRemove.length; i++) {\n rna.pairtable[toRemove[i].source.num] = 0;\n rna.pairtable[toRemove[i].target.num] = 0;\n }\n\n // extract the dotbracket string of the rna\n // cut it at the position of this backbone bond\n console.log('sequences:', sequences);\n\n let rnaDotBracket = rnaUtilities.pairtableToDotbracket(rna.pairtable);\n let dotbrackets = []; // array to hold the dotbracket strings of the individual strands\n let rnaPositions = rna.getPositions('nucleotide') // get the nucleotide positions, cut them at the positions of the backbone bond\n let positions = [];\n let rnaUids = rna.getUids();\n let uids = [];\n let lastBreak = 0; // the position of the last break\n for (let i = 0; i <= breakPositions.length; i++) {\n // cut the dotbracket\n dotbrackets.push(rnaDotBracket.slice(lastBreak, breakPositions[i]));\n // add the positions\n positions.push(rnaPositions.slice(lastBreak, breakPositions[i]));\n // add the uids\n uids.push(rnaUids.slice(lastBreak, breakPositions[i]));\n lastBreak = breakPositions[i] + 1;\n }\n\n console.log('positions:', positions);\n\n delete self.rnas[rna.uid];\n let newRnas = [];\n for (let i = 0; i < sequences.length; i++) {\n let newRna = self.addRNA(dotbrackets[i], { 'sequence': sequences[i],\n 'positions': positions[i], \n 'uids': uids[i] });\n newRnas.push(newRna);\n }\n // add the extra links\n for (let i = 0; i < toRemove.length; i++) {\n console.log('toRemove[i]', toRemove[i]);\n self.extraLinks.push(\n {'source': newRnas[toRemove[i].breakFrom].nodes[toRemove[i].from-1],\n 'target': newRnas[toRemove[i].breakTo].nodes[toRemove[i].to-1],\n 'value': 1,\n 'uid': slugid.nice(),\n 'linkType': 'intermolecule'});\n recalculateGraph();\n self.update();\n }\n console.log('self.extraLinks:', self.extraLinks);\n }\n\n var removeLink = function(d) {\n // remove a link between two nodes\n let index = self.graph.links.indexOf(d);\n console.log('removing link:', index);\n\n if (index > -1) {\n //remove a link\n //graph.links.splice(index, 1);\n\n // there should be two cases\n // 1. The link is within a single molecule\n\n if (d.source.rna == d.target.rna) {\n if (d.linkType == 'backbone') {\n console.log('trying to remove a backbone link', d.source.num, d.target.num);\n removeBackBoneLink(d);\n return;\n } else {\n let r = d.source.rna;\n r.addPseudoknots();\n r.pairtable[d.source.num] = 0;\n r.pairtable[d.target.num] = 0;\n\n updateRnaGraph(r);\n }\n } else {\n // 2. The link is between two different molecules\n let extraLinkIndex = self.extraLinks.indexOf(d);\n\n self.extraLinks.splice(extraLinkIndex, 1);\n }\n recalculateGraph();\n }\n self.update();\n };\n\n let addBackBoneLink = function(newLink) {\n // opposite of deleting a link\n // get the two dotbracket strings\n let rna1 = newLink.target.rna;\n let rna2 = newLink.source.rna;\n if (newLink.target.num == 1) {\n rna1 = newLink.source.rna;\n rna2 = newLink.target.rna;\n }\n\n let dotbracket1 = rnaUtilities.pairtableToDotbracket(rna1.pairtable);\n let dotbracket2 = rnaUtilities.pairtableToDotbracket(rna2.pairtable);\n\n let seq1 = rna1.seq;\n let seq2 = rna2.seq;\n\n let positions1 = rna1.getPositions('nucleotide');\n let positions2 = rna2.getPositions('nucleotide');\n\n // concatenate them\n let newDotbracket = dotbracket1 + dotbracket2;\n let newSeq = seq1 + seq2;\n let newPositions = positions1.concat(positions2);\n\n let toAddInternal = [];\n let toAddExternal = [];\n let toDelete = {};\n\n for (let i = 0; i < self.extraLinks.length; i++) {\n console.log('self.extraLinks[i]', self.extraLinks[i]);\n console.log('rna1:', rna1);\n console.log('rna2:', rna2);\n if (self.extraLinks[i].source.rna == rna1) {\n if ( self.extraLinks[i].target.rna == rna2) {\n // both ends of the extra link are within what will become the new molecule\n // need to be added as base pairs afterwards\n //self.extraLinks[i].from = self.extraLinks[i].source.num;\n //self.extraLinks[i].to = dotbracket1.length + self.extraLinks[i].target.num;\n //toAddInternal.push(self.extraLinks[i]);\n } else {\n // only one end of the extra link is within what will become the newly\n // created molecule, needs to remain an extra link\n // source will always be the unchanged molecule, whereas target will be\n // the newly created one\n toAddExternal.push({\n 'source': self.extraLinks[i].target,\n 'target': self.extraLinks[i].source.num\n });\n\n toDelete[self.extraLinks[i].uid] = true;\n }\n } else if (self.extraLinks[i].source.rna == rna2) {\n if ( self.extraLinks[i].target.rna == rna1) {\n // add internal link\n // both ends of the extra link are within what will become the new molecule\n // need to be added as base pairs afterwards\n //self.extraLinks[i].from = self.extraLinks[i].target.num;\n //self.extraLinks[i].to = dotbracket1.length + self.extraLinks[i].source.num;\n\n //toAddInternal.push(self.extraLinks[i]);\n } else {\n toAddExternal.push({\n 'source': self.extraLinks[i].target,\n 'target': self.extraLinks[i].source.num + dotbracket1.length\n });\n toDelete[self.extraLinks[i].uid] = true;\n }\n }\n\n if (self.extraLinks[i].target.rna == rna1) {\n if (self.extraLinks[i].source.rna == rna2) {\n // covered in previous if statement\n } else {\n // only one end of the extra link is within what will become the newly\n // created molecule, needs to remain an extra link\n toAddExternal.push({\n 'source': self.extraLinks[i].source,\n 'target': self.extraLinks[i].target.num\n });\n\n toDelete[self.extraLinks[i].uid] = true;\n }\n } else if (self.extraLinks[i].target.rna == rna2) {\n if (self.extraLinks[i].source.rna == rna1) {\n toAddExternal.push({\n 'source': self.extraLinks[i].source,\n 'target': self.extraLinks[i].target.num + dotbracket1.length\n });\n\n toDelete[self.extraLinks[i].uid] = true;\n }\n }\n }\n\n\n self.extraLinks = self.extraLinks.filter((e) => { return !(e.uid in toDelete) });\n\n delete self.rnas[rna1.uid];\n delete self.rnas[rna2.uid];\n\n let newRna = null;\n // create a new RNA\n if (self.options.animation)\n newRna = self.addRNA(newDotbracket, { 'sequence': newSeq,\n 'positions': newPositions,\n 'centerView': false});\n else\n newRna = self.addRNA(newDotbracket, { 'sequence': newSeq,\n 'centerView': false });\n\n\n\n // add new external links\n for (let i = 0; i < toAddExternal.length; i++) {\n self.extraLinks.push({\n 'source': toAddExternal[i].source,\n 'target': newRna.nodes[toAddExternal[i].target-1],\n 'value': 1,\n 'uid': slugid.nice(),\n 'linkType': 'intermolecule'\n });\n }\n\n recalculateGraph();\n self.update();\n console.log('self.extraLinks:', self.extraLinks);\n };\n\n function nudge(dx, dy) {\n // TODO currently unused\n node.filter(function(d) { return d.selected; })\n .attr('cx', function(d) { return d.x += dx; })\n .attr('cy', function(d) { return d.y += dy; });\n\n link.filter(function(d) { return d.source.selected; })\n .attr('x1', function(d) { return d.source.x; })\n .attr('y1', function(d) { return d.source.y; });\n\n link.filter(function(d) { return d.target.selected; })\n .attr('x2', function(d) { return d.target.x; })\n .attr('y2', function(d) { return d.target.y; });\n\n d3.event.preventDefault();\n }\n\n let nodeMouseup = function(d,i) {\n console.log(\"nodeMouseup\")\n let backbonePossible = true, basepairPossible = true;\n\n if (mousedownNode) {\n mouseupNode = d;\n\n // if the node isn't a nucleotide, we can't create a link\n if (mouseupNode.nodeType == 'middle' || mousedownNode.nodeType == 'middle' || mouseupNode.nodeType == 'label' || mousedownNode.nodeType == 'label')\n return;\n\n if (mouseupNode == mousedownNode) { resetMouseVars(); return; }\n let newLink = {source: mousedownNode, target: mouseupNode, linkType: 'basepair', value: 1, uid: slugid.nice()};\n\n for (let i = 0; i < self.graph.links.length; i++) {\n if ((self.graph.links[i].source == mousedownNode) ||\n (self.graph.links[i].target == mousedownNode) ||\n (self.graph.links[i].source == mouseupNode) ||\n (self.graph.links[i].target == mouseupNode)) {\n // either one of the nodes is already in a link\n\n // if any of the nodes are already involved in a basepair or a pseudoknot\n // then we can't make a basepair link\n if (self.graph.links[i].linkType == 'basepair' ||\n self.graph.links[i].linkType == 'pseudoknot' ||\n self.graph.links[i].linkType == 'intermolecule') {\n // although should be able to make a backbone link\n console.log('no basepair possible');\n basepairPossible = false;\n }\n }\n\n if (((self.graph.links[i].source == mouseupNode) &&\n (self.graph.links[i].target == mousedownNode)) ||\n ((self.graph.links[i].source == mousedownNode) &&\n (self.graph.links[i].target == mouseupNode))) {\n\n // if we're trying to make a link between two nodes which already have\n // a backbone between them, then we can't make a link\n if (self.graph.links[i].linkType == 'backbone') {\n return;\n }\n }\n }\n\n\n if (newLink.source.rna != newLink.target.rna) {\n // could be either a backbone link or an intermolecule link\n\n if ((newLink.source.num == 1 &&\n newLink.target.num == newLink.target.rna.rnaLength) ||\n (newLink.target.num == 1 &&\n newLink.source.num == newLink.source.rna.rnaLength)) {\n //\n let linkMenu = [\n {\n title: 'Backbone Link',\n action: function(elm, d, i) {\n linkContextMenuShown = false;\n console.log('Item #1 clicked!');\n console.log('The data for this circle is: ' + d);\n dragLine.attr('class', fstyle.transparent);\n addBackBoneLink(newLink);\n },\n disabled: false // optional, defaults to false\n },\n {\n title: 'Basepair Link',\n action: function(elm, d, i) {\n linkContextMenuShown = false;\n console.log('You have clicked the second item!');\n console.log('The data for this circle is: ' + d);\n dragLine.attr('class', fstyle.transparent);\n self.addLink(newLink);\n }\n }\n ]\n linkContextMenuShown = true;\n let linkContextMenu = contextMenu(linkMenu);\n console.log('newLinkMenu');\n linkContextMenu.apply(this, [d,i,true,\n function() { dragLine.attr('class', fstyle.transparent) }]);\n } else {\n // between end points but can't make a backbone\n if (basepairPossible)\n self.addLink(newLink);\n }\n } else {\n if (basepairPossible)\n self.addLink(newLink);\n }\n\n }\n };\n\n let nodeMousedown = function(d) {\n console.log(\"nodeMousedown\")\n if (!d.selected && !ctrlKeydown) {\n // if this node isn't selected, then we have to unselect every other node\n deselectAllNodes()\n }\n\n if (!shiftKeydown) {\n // only without shift, toggle select or select\n if (ctrlKeydown) {\n toggleSelectNode(d)\n } else {\n selectNode(d)\n }\n }\n\n if (shiftKeydown && self.options.editable) {\n // with shift key and editable continue to draw dragline\n mousedownNode = d;\n\n dragLine\n .attr('class', fstyle.dragLine)\n .attr('x1', mousedownNode.x)\n .attr('y1', mousedownNode.y)\n .attr('x2', mousedownNode.x)\n .attr('y2', mousedownNode.y);\n\n d3.event.stopPropagation();\n }\n };\n\n let linkClick = (d) => {\n if (!shiftKeydown) {\n return;\n }\n\n var invalidLinks = { //'backbone': true,\n 'fake': true,\n 'fake_fake': true,\n 'label_link': true};\n\n console.log('d.linkType:', d.linkType);\n if (d.linkType in invalidLinks )\n return;\n\n removeLink(d);\n };\n\n /* I/O functions */\n self.toJSON = function toJSON() {\n var data = {'rnas': self.rnas, 'extraLinks': self.extraLinks};\n var dataString = JSON.stringify(data, function(key, value) {\n //remove circular references\n if (key == 'rna') {\n return;\n } else {\n return value;\n }\n }, '\\t');\n return dataString;\n };\n\n self.fromJSON = function(jsonString) {\n var rnas, extraLinks;\n\n try{\n var data = JSON.parse(jsonString);\n rnas = data.rnas;\n extraLinks = data.extraLinks;\n } catch(err) {\n throw err;\n }\n\n for (var uid in rnas) {\n if (rnas[uid].type == 'rna') {\n r = new RNAGraph();\n\n r.seq = rnas[uid].seq;\n r.dotbracket = rnas[uid].dotbracket;\n r.circular = rnas[uid].circular;\n r.pairtable = rnas[uid].pairtable;\n r.uid = rnas[uid].uid;\n r.structName = rnas[uid].structName;\n r.nodes = rnas[uid].nodes;\n r.links = rnas[uid].links;\n r.rnaLength = rnas[uid].rnaLength;\n r.elements = rnas[uid].elements;\n r.nucsToNodes = rnas[uid].nucsToNodes;\n r.pseudoknotPairs = rnas[uid].pseudoknotPairs;\n } else {\n r = new ProteinGraph();\n r.size = rnas[uid].size;\n r.nodes = rnas[uid].nodes;\n r.uid = rnas[uid].uid;\n }\n\n self.addRNAJSON(r, false);\n }\n\n extraLinks.forEach(function(link) {\n self.extraLinks.push(link);\n });\n\n recalculateGraph();\n self.update();\n };\n\n self.addRNA = function(structure, passedOptions = {}) {\n let rnaJson = createInitialLayout(structure, passedOptions);\n let centerView = false;\n\n /*\n * Code to display the JSONs representing the structure\n *\n rnaJson.nodes[0].rna = null;\n rnaJson.nodes[0].nextNode = null;\n\n rnaJson.links[0].source = null;\n rnaJson.links[0].target = null;\n\n console.log(rnaJson.nodes[0]);\n console.log(rnaJson.links[0]);\n console.log(JSON.stringify(rnaJson.nodes[0],null,2));\n console.log(JSON.stringify(rnaJson.links[0],null,2));\n */\n\n if ('extraLinks' in passedOptions) {\n // presumably the passed in links are within the passed molecule\n let newLinks = self.addExternalLinks(rnaJson, passedOptions.extraLinks);\n\n self.extraLinks = self.extraLinks.concat(newLinks);\n }\n\n if ('centerPos' in passedOptions)\n self.addRNAJSON(rnaJson, {centerPos: passedOptions.centerPos,\n centerView: false})\n else if ('avoidOthers' in passedOptions)\n self.addRNAJSON(rnaJson, {avoidOthers: passedOptions.avoidOthers});\n else\n self.addRNAJSON(rnaJson, {centerView: passedOptions.centerView});\n\n // if the structure containes multistrands, let's split before the '&'\n console.log('structure:', structure);\n if (structure.indexOf('&') !== -1 && structure != '&' && structure.indexOf('&') !== 0) {\n console.log('splitting multistrand');\n splitMultiStrand(rnaJson);\n return;\n };\n return rnaJson;\n };\n\n self.addRNAJSON = function(rnaGraph,\n { avoidOthers = false,\n centerPos = null,\n centerView = true}\n ) {\n // Add an RNAGraph, which contains nodes and links as part of the\n // structure\n // Each RNA will have uid to identify it\n // when it is modified, it is replaced in the global list of RNAs\n //\n var maxX, minX;\n //console.log('centerView:', centerView);\n\n if (centerPos != null) {\n // center the newly created RNA at a given position\n let totalX = 0;\n let totalY = 0;\n let nodeCount = 0;\n\n rnaGraph.nodes.forEach(function(node) {\n totalX += node.x;\n totalY += node.y;\n nodeCount += 1;\n });\n\n if (nodeCount > 0) {\n // center the nodes at centerPos\n\n rnaGraph.nodes.forEach(function(node) {\n node.x = node.x + centerPos[0] - totalX / nodeCount;\n node.y = node.y + centerPos[1] - totalY / nodeCount;\n\n node.px = node.x;\n node.py = node.y;\n });\n }\n }\n\n if (avoidOthers) {\n if (self.graph.nodes.length > 0)\n maxX = d3.max(self.graph.nodes.map(function(d) { return d.x; }));\n else\n maxX = 0;\n\n minX = d3.min(rnaGraph.nodes.map(function(d) { return d.x; }));\n\n rnaGraph.nodes.forEach(function(node) {\n node.x += (maxX - minX) + 20;\n node.px += (maxX - minX);\n });\n }\n\n rnaGraph.nodes.forEach(function(node) {\n node.rna = rnaGraph;\n });\n\n self.rnas[rnaGraph.uid] = rnaGraph;\n recalculateGraph();\n\n self.update();\n\n if (centerView)\n self.centerView();\n\n return rnaGraph;\n };\n\n self.addNodes = function addNodes(json) {\n // add a new set of nodes from a json file\n\n // Resolve the sources and targets of the links so that they\n // are not just indeces into an array\n json.links.forEach(function(entry) {\n if (typeof entry.source == 'number') entry.source = json.nodes[entry.source];\n if (typeof entry.target == 'number') entry.target = json.nodes[entry.target];\n });\n\n // Get the maximum x and y values of the current graph\n // so that we don't place a new structure on top of the\n // old one\n if (self.graph.nodes.length > 0) {\n maxX = d3.max(self.graph.nodes.map(function(d) {return d.x;}));\n maxY = d3.max(self.graph.nodes.map(function(d) {return d.y;}));\n } else {\n maxX = 0;\n maxY = 0;\n }\n\n json.nodes.forEach(function(entry) {\n if (!(entry.rna.uid in self.rnas)) {\n self.rnas[entry.rna.uid] = entry.rna;\n }\n\n entry.x += maxX;\n //entry.y += maxY;\n\n entry.px += maxX;\n //entry.py += maxY;\n });\n\n r = new RNAGraph('','');\n r.nodes = json.nodes;\n r.links = json.links;\n\n //self.addRNA(r);\n recalculateGraph();\n\n self.update();\n self.centerView();\n };\n\n self.clearNodes = () => {\n self.graph.nodes = [];\n self.graph.links = [];\n\n self.rnas = {};\n self.extraLinks = [];\n\n self.update();\n };\n\n self.addLink = function(newLink) {\n // this means we have a new json, which means we have\n // to recalculate the structure and change the colors\n // appropriately\n //\n console.log('adding new link');\n if (newLink.source.rna == newLink.target.rna) {\n // must be a basepair\n let r = newLink.source.rna;\n\n r.pairtable[newLink.source.num] = newLink.target.num;\n r.pairtable[newLink.target.num] = newLink.source.num;\n\n updateRnaGraph(r);\n\n } else {\n //Add an extra link\n console.log('intermolecule');\n newLink.linkType = 'intermolecule';\n self.extraLinks.push(newLink);\n }\n recalculateGraph();\n self.update();\n };\n\n self.addExternalLinks = function(rnaJson, externalLinks) {\n let newLinks = [];\n\n for (let i = 0; i < externalLinks.length; i++) {\n let newLink = {linkType: 'external', value: 1, uid: slugid.nice(),\n source: null, target: null};\n // check if the source node is an array\n if (Object.prototype.toString.call(externalLinks[i][0]) === '[object Array]') {\n for (let j = 0; j < rnaJson.nodes.length; j++) {\n if ('nucs' in rnaJson.nodes[j]) {\n if (rnaJson.nodes[j].nucs.equals(externalLinks[i][0])) {\n newLink.source = rnaJson.nodes[j];\n break;\n }\n }\n }\n } else {\n for (let j = 0; j < rnaJson.nodes.length; j++) {\n if (rnaJson.nodes[j].num == externalLinks[i][0]) {\n newLink.source = rnaJson.nodes[j];\n }\n }\n }\n\n // check if the target node is an array\n if (Object.prototype.toString.call(externalLinks[i][1]) === '[object Array]') {\n for (let j = 0; j < rnaJson.nodes.length; j++) {\n if ('nucs' in rnaJson.nodes[j]) {\n if (rnaJson.nodes[j].nucs.equals(externalLinks[i][1])) {\n newLink.target = rnaJson.nodes[j];\n }\n }\n }\n } else {\n for (let j = 0; j < rnaJson.nodes.length; j++) {\n if (rnaJson.nodes[j].num == externalLinks[i][1]) {\n newLink.target = rnaJson.nodes[j];\n }\n }\n }\n\n if (newLink.source == null || newLink.target == null) {\n console.log('ERROR: source or target of new link not found:', newLink, externalLinks[i]);\n continue;\n }\n\n newLinks.push(newLink);\n }\n\n return newLinks;\n };\n\n self.getStructuresDotBracket = function() {\n console.log('self.rnas:', self.rnas);\n let sequence = [];\n let currIdx = 1;\n let nodeIdxs = {};\n let breaks = [];\n let pairtable = [];\n\n // add the nodes\n for (let uid in self.rnas) {\n let rna = self.rnas[uid];\n\n for (let j = 0; j < rna.nodes.length; j++) {\n let node = rna.nodes[j];\n\n if (node.nodeType != 'nucleotide')\n continue;\n\n // console.log('node:', node);\n nodeIdxs[node.uid] = currIdx;\n currIdx += 1;\n\n sequence.push(node.name);\n }\n\n breaks.push(currIdx);\n }\n\n pairtable = [currIdx-1]\n for (let i = 0; i < currIdx; i++)\n pairtable.push(0)\n\n // add the links\n for (let uid in self.rnas) {\n let rna = self.rnas[uid];\n\n for (let j = 0; j < rna.links.length; j++) {\n let link = rna.links[j];\n\n if (link.linkType != 'basepair')\n continue;\n\n let idx1 = nodeIdxs[link.source.uid];\n let idx2 = nodeIdxs[link.target.uid];\n pairtable[idx1] = idx2;\n pairtable[idx2] = idx1;\n }\n }\n\n for (let i = 0; i < self.extraLinks.length; i++) {\n let link = self.extraLinks[i];\n\n let idx1 = nodeIdxs[link.source.uid];\n let idx2 = nodeIdxs[link.target.uid];\n\n pairtable[idx1] = idx2;\n pairtable[idx2] = idx1;\n }\n\n let structure = rnaUtilities.pairtableToDotbracket(pairtable).split('');\n\n for (let i = 0; i < breaks.length - 1; i++) {\n console.log('breaks[i]:', breaks[i]);\n sequence.splice(breaks[i] + i - 1, 0, '&');\n structure.splice(breaks[i] + i - 1, 0, '&');\n }\n\n console.log('sequence:', sequence, sequence.join(''));\n console.log('structure:', structure, structure.join(''));\n return [sequence.join(''), structure.join('')];\n };\n\n /* APIs */\n self.startAnimation = function() {\n self.options.animation = true;\n vis.selectAll('g.gnode')\n .call(drag);\n self.force.start();\n };\n\n self.stopAnimation = function() {\n self.options.animation = false;\n vis.selectAll('g.gnode')\n .on('mousedown.drag', null);\n self.force.stop();\n };\n\n self.resumeForce = function() {\n if (self.options.animation)\n self.force.resume();\n };\n\n self.setFriction = function(value) {\n self.force.friction(value);\n self.resumeForce();\n };\n\n self.setCharge = function(value) {\n self.force.charge(value);\n self.resumeForce();\n };\n\n self.setGravity = function(value) {\n self.force.gravity(value);\n self.resumeForce();\n };\n\n self.setPseudoknotStrength = function(value) {\n self.linkStrengths.pseudoknot = value;\n self.update();\n };\n\n self.displayNumbering = function(value) {\n self.displayParameters.displayNumbering = value;\n updateStyle();\n };\n\n self.displayNodeOutline = function(value) {\n self.displayParameters.displayNodeOutline = value;\n updateStyle();\n };\n\n self.displayNodeLabel = function(value) {\n self.displayParameters.displayNodeLabel = value;\n updateStyle();\n };\n\n self.displayLinks = function(value) {\n self.displayParameters.displayLinks = value;\n updateStyle();\n };\n\n self.displayPseudoknotLinks = function(value) {\n self.displayParameters.displayPseudoknotLinks = value;\n updateStyle();\n };\n\n self.displayProteinLinks = function(value) {\n self.displayParameters.displayProteinLinks = value;\n updateStyle();\n };\n\n self.displayDirectionArrows = function(value) {\n self.displayParameters.displayDirectionArrows = value;\n updateStyle();\n };\n}\n","import {RNAGraph} from './rnagraph.js';\n\nimport {simpleXyCoordinates} from './simplernaplot.js';\nimport {NAView} from './naview/naview.js'\n\nimport fstyle from './fornac.css';\n\nexport function rnaPlot(passedOptions = {}) {\n var options = {\n 'width': 300,\n 'height': 300,\n 'nucleotideRadius': 5,\n 'rnaEdgePadding': 1, // how far the leftmost, rightmost, topmost and bottomost\n // nucleotides are from the edge of the plot\n 'labelInterval': 10,\n 'showNucleotideLabels': true,\n 'startNucleotideNumber': 1,\n 'bundleExternalLinks': false,\n\n 'rnaLayout': 'simple', // simple or naview\n 'namePosition': '0 0' // for x and y either 0, 0.5 or 1\n };\n var options = Object.assign(options, passedOptions);\n\n var xScale, yScale;\n\n function createTransformToFillViewport(xValues, yValues) {\n // create transform that will scale the x and y values so that\n // they fill the available viewport\n let xExtent = d3.extent(xValues);\n let yExtent = d3.extent(yValues);\n\n // add the radius of the nucleotides\n xExtent[0] -= options.nucleotideRadius + options.rnaEdgePadding;\n yExtent[0] -= options.nucleotideRadius + options.rnaEdgePadding;\n\n xExtent[1] += options.nucleotideRadius + options.rnaEdgePadding;\n yExtent[1] += options.nucleotideRadius + options.rnaEdgePadding;\n\n // find out how wide and height the molecule\n var xRange = xExtent[1] - xExtent[0];\n var yRange = yExtent[1] - yExtent[0];\n\n // how much wider / taller is it than the available viewport\n var xExtra = xRange - options.width;\n var yExtra = yRange - options.height;\n\n // once we have a scale for one dimension, we can create the scale for the other\n // keeping the same expansion / shrinking ratio\n function createOtherScale(firstScale, newDomain, newRange) {\n var scaleFactor = (firstScale.range()[1] - firstScale.range()[0]) /\n (firstScale.domain()[1] - firstScale.domain()[0]);\n var newWidth = (newDomain[1] - newDomain[0]) * scaleFactor\n var newMargin = ((newRange[1] - newRange[0]) - newWidth) / 2;\n\n return {'scaleFactor': scaleFactor,\n 'scale': d3.scale.linear()\n .domain(newDomain)\n .range([newRange[0] + newMargin, newRange[1] - newMargin])};\n }\n\n var ret;\n\n if (xExtra > yExtra) {\n // we have to shrink more in the x-dimension than the y\n xScale = d3.scale.linear()\n .domain(xExtent)\n .range([0, options.width])\n\n ret = createOtherScale(xScale, yExtent, [0, options.height]);\n yScale = ret.scale;\n } else {\n // we have to shrink more in the x-dimension than the y\n yScale = d3.scale.linear()\n .domain(yExtent)\n .range([0, options.height])\n\n ret = createOtherScale(yScale, xExtent, [0, options.width]);\n xScale = ret.scale;\n }\n\n var xOffset = xScale.range()[0] - xScale.domain()[0];\n var yOffset = yScale.range()[0] - yScale.domain()[0];\n\n return 'translate(' + -(xScale.domain()[0] * ret.scaleFactor - xScale.range()[0]) +\n ',' + -(yScale.domain()[0] * ret.scaleFactor - yScale.range()[0]) + ')' +\n 'scale(' + ret.scaleFactor + ')';\n }\n\n function createNucleotides(selection, nucleotideNodes) {\n // create groupings for each nucleotide and label\n var gs = selection\n .selectAll('.gnode')\n .data(nucleotideNodes)\n .enter()\n .append('svg:g')\n .classed('gnode', true)\n .attr('transform', function(d) {\n return 'translate(' + d.x + ',' + d.y + ')';\n });\n\n var circles = gs.append('svg:circle')\n .classed(fstyle.node, true)\n .attr('node_type', 'nucleotide')\n .attr('base_type', (d) => { if (d.name) { return d.name.toLowerCase(); }})\n .attr('r', options.nucleotideRadius)\n\n\n if (options.showNucleotideLabels) {\n var nucleotideLabels = gs.append('svg:text')\n .text(function(d) { return d.name; })\n .classed(fstyle.nodeLabel, true)\n .append('svg:title')\n .text(function(d) { return d.struct_name + ':' + d.num; });\n }\n }\n\n function createLabels(selection, labelNodes) {\n // create groupings for each nucleotide and label\n\n var gs = selection\n .selectAll()\n .data(labelNodes)\n .enter()\n .append('svg:g')\n .classed('gnode', true)\n .attr('transform', function(d) {\n return 'translate(' + d.x + ',' + d.y + ')';\n });\n\n var circles = gs.append('svg:circle')\n .classed(fstyle.node, true)\n .attr('node_type', 'label')\n .attr('r', options.nucleotideRadius)\n\n var numberLabels = gs.append('svg:text')\n .classed(fstyle.nodeLabel, true)\n .text(function(d) { return d.name; })\n }\n\n function createName(selection, name) {\n let nameLabel = selection.append('svg:text')\n //.attr('dy', -10)\n .classed(fstyle.plotLabel, true)\n .text(name);\n\n let xyPos = options.namePosition.split(\" \", 2) // 0 0.5 1\n let xy = []\n let textBBox = nameLabel.node().getBBox()\n let textSize = [textBBox.width, textBBox.height]\n let plotSize = [options.width, options.height]\n\n for (let p in [0, 1]) {\n switch (xyPos[p]) {\n case '0':\n xy[p] = textSize[p] / 2\n break;\n case '1':\n xy[p] = plotSize[p] - textSize[p] / 2\n break;\n case '0.5':\n xy[p] = plotSize[p] / 2\n break;\n }\n }\n nameLabel.attr('x', xy[0]).attr('y', xy[1])\n }\n\n function makeExternalLinksBundle(selection, links) {\n var nodesDict = {};\n var linksList = [];\n links = links.filter(function(d) { return d.linkType == 'correct' || d.linkType == 'incorrect' || d.linkType == 'extra'; });\n\n selection.selectAll('[link-type=extra]')\n .remove();\n\n\n for (var i = 0; i < links.length; i++) {\n if (links[i].source === null || links[i].target === null)\n continue;\n\n nodesDict[links[i].source.uid] = links[i].source;\n nodesDict[links[i].target.uid] = links[i].target;\n\n linksList.push({'source': links[i].source.uid, 'target': links[i].target.uid, 'linkType': links[i].linkType, 'extraLinkType': links[i].extraLinkType}) ;\n }\n\n var fbundling = d3.ForceEdgeBundling().nodes(nodesDict).edges(linksList)\n .compatibility_threshold(0.8).step_size(0.2);\n var results = fbundling();\n\n var d3line = d3.svg.line()\n .x(function(d){return d.x;})\n .y(function(d){return d.y;})\n .interpolate('linear');\n\n for (var i = 0; i < results.length; i++) {\n var edge_subpoint_data = results[i];\n // for each of the arrays in the results\n // draw a line between the subdivions points for that edge\n\n selection.append('path').attr('d', d3line(edge_subpoint_data))\n .style('fill', 'none')\n .attr('link-type', function(d) { return linksList[i].linkType; })\n .attr('extra-link-type', function(d) { return linksList[i].extraLinkType; })\n .style('stroke-opacity',0.4); //use opacity as blending\n }\n\n }\n\n function createLinks(selection, links) {\n links = links.filter(function(d) { return d.source !== null && d.target !== null; });\n var gs = selection.selectAll('.link')\n .data(links)\n .enter()\n .append('svg:line')\n .attr('x1', function(d) { return d.source.x; })\n .attr('x2', function(d) { return d.target.x; })\n .attr('y1', function(d) { return d.source.y; })\n .attr('y2', function(d) { return d.target.y; })\n .attr('link-type', function(d) { return d.linkType; })\n .attr('extra-link-type', function(d) { return d.extraLinkType; })\n .classed('link', true)\n .classed(fstyle.link, true)\n }\n\n function chart(selection) {\n selection.each(function(data) {\n let plot = d3.select(this).append('g')\n .classed(fstyle.plot, true)\n\n // data should be a dictionary containing at least a structure\n // and possibly a sequence\n let rg = new RNAGraph(data.sequence, data.structure, data.name, options.startNucleotideNumber)\n .recalculateElements()\n .elementsToJson()\n .addName(data.name);\n\n data.rnaGraph = rg;\n // calculate the position of each nucleotide\n // the positions of the labels will be calculated in\n // the addLabels function\n let positions = [];\n\n if (options.rnaLayout === 'naview') {\n var naview = new NAView();\n var naViewPositions = naview.naview_xy_coordinates(rg.pairtable);\n\n for (var i = 0; i < naViewPositions.nbase; i++) {\n positions.push([naViewPositions.x[i], naViewPositions.y[i]]);\n }\n } else {\n positions = simpleXyCoordinates(rg.pairtable);\n }\n\n rg.addPositions('nucleotide', positions)\n //.reinforceStems()\n //.reinforceLoops()\n //.addExtraLinks(data.extraLinks)\n .addLabels(options.startNucleotideNumber, options.labelInterval);\n\n // create a transform that will fit the molecule to the\n // size of the viewport (canvas, svg, whatever)\n let fillViewportTransform = createTransformToFillViewport(\n rg.nodes.map(function(d) { return d.x; }),\n rg.nodes.map(function(d) { return d.y; })\n );\n plot.attr('transform', fillViewportTransform);\n\n let nucleotideNodes = rg.nodes.filter(function(d) {\n return d.nodeType == 'nucleotide';\n });\n\n let labelNodes = rg.nodes.filter(function(d) {\n return d.nodeType == 'label';\n });\n\n let links = rg.links;\n\n createLinks(plot, links);\n createNucleotides(plot, nucleotideNodes);\n createLabels(plot, labelNodes);\n createName(d3.select(this), data.name);\n\n if (options.bundleExternalLinks) {\n makeExternalLinksBundle(plot, links);\n }\n\n });\n }\n\n chart.width = function(_) {\n if (!arguments.length) return options.width;\n options.width = _;\n return chart;\n };\n\n chart.height = function(_) {\n if (!arguments.length) return options.height;\n options.height = _;\n return chart;\n };\n\n chart.showNucleotideLabels = function(_) {\n if (!arguments.length) return options.showNucleotideLabels;\n options.showNucleotideLabels = _;\n return chart;\n };\n\n chart.rnaEdgePadding = function(_) {\n if (!arguments.length) return options.rnaEdgePadding;\n options.rnaEdgePadding = _;\n return chart;\n };\n\n chart.nucleotideRadius = function(_) {\n if (!arguments.length) return options.nucleotideRadius;\n options.nucleotideRadius = _;\n return chart;\n };\n\n chart.labelInterval = function(_) {\n if (!arguments.length) return options.labelInterval;\n options.labelInterval = _;\n return chart;\n };\n\n chart.showNucleotideLabels = function(_) {\n if (!arguments.length) return options.showNucleotideLabels;\n options.showNucleotideLabels = _;\n return chart;\n };\n\n chart.startNucleotideNumber = function(_) {\n if (!arguments.length) return options.startNucleotideNumber;\n options.startNucleotideNumber = _;\n return chart;\n };\n\n chart.bundleExternalLinks = function(_) {\n if (!arguments.length) return options.bundleExternalLinks;\n options.bundleExternalLinks = _;\n return chart;\n };\n\n chart.rnaLayout = function(_) {\n if (!arguments.length) return options.rnaLayout;\n options.rnaLayout = _;\n return chart;\n };\n\n chart.namePosition = function(_) {\n if (!arguments.length) return options.namePosition;\n options.namePosition = _;\n return chart;\n };\n\n return chart;\n}\n","import {rnaPlot} from './rnaplot.js';\n\nexport function rnaTreemap(passedOptions = {}) {\n var options = {\n 'width': 300,\n 'height': 300,\n 'nucleotideRadius': 5,\n 'rnaEdgePadding': 1, // how far the leftmost, rightmost, topmost and bottomost\n // nucleotides are from the edge of the plot\n 'labelInterval': 10,\n 'showNucleotideLabels': true,\n 'startNucleotideNumber': 1,\n 'bundleExternalLinks': false,\n\n 'rnaLayout': 'simple', // simple or naview\n 'namePosition': '0 0', // for x and y either 0, 0.5 or 1\n };\n\n var options = Object.assign(options, passedOptions);\n\n function rnaTreemapNode(selection) {\n // create a background rectangle for each RNA structure\n selection.each(function(d) {\n d3.select(this)\n .attr('transform', function(d) { return 'translate(' + d.x + ',' + d.y + ')' })\n .append('rect')\n .attr('fill', 'transparent')\n .attr('width', function(d) { return Math.max(0, d.dx); })\n .attr('height', function(d) { return Math.max(0, d.dy); })\n\n // draw the actual RNA structure\n var chart = rnaPlot(options)\n .width( Math.max(0, d.dx))\n .height( Math.max(0, d.dy))\n\n if ('structure' in d) d3.select(this).call(chart)\n });\n }\n\n var chart = function(selection) {\n selection.each(function(data) {\n console.log('data:', data)\n // initialize the treemap structure\n // sample input\n // { 'name': 'blah',\n // 'children: [{'structure': '..((..))',\n // 'sequence': 'ACCGGCC',\n // 'size': 50}]\n // }\n var treemap = d3.layout.treemap()\n .size([options.width, options.height])\n .sticky(false)\n .value(function(d) { return d.size; });\n\n // create a new for each node in the treemap\n // this may be a little redundant, since we expect the calling\n // selection to contain their own g elements\n var gEnter = d3.select(this)\n .append('g')\n .classed('rnatreemap', true)\n var treemapGnodes = gEnter.datum(data).selectAll('.treemapnode')\n .data(treemap.nodes)\n .enter()\n .append('g')\n .classed('treemapnode', true)\n .call(rnaTreemapNode);\n });\n };\n\n chart.width = function(_) {\n if (!arguments.length) return options.width;\n options.width = _;\n return chart;\n };\n\n chart.height = function(_) {\n if (!arguments.length) return options.height;\n options.height = _;\n return chart;\n };\n\n chart.showNucleotideLabels = function(_) {\n if (!arguments.length) return options.showNucleotideLabels;\n options.showNucleotideLabels = _;\n return chart;\n };\n\n chart.rnaEdgePadding = function(_) {\n if (!arguments.length) return options.rnaEdgePadding;\n options.rnaEdgePadding = _;\n return chart;\n };\n\n chart.nucleotideRadius = function(_) {\n if (!arguments.length) return options.nucleotideRadius;\n options.nucleotideRadius = _;\n return chart;\n };\n\n chart.labelInterval = function(_) {\n if (!arguments.length) return options.labelInterval;\n options.labelInterval = _;\n return chart;\n };\n\n chart.showNucleotideLabels = function(_) {\n if (!arguments.length) return options.showNucleotideLabels;\n options.showNucleotideLabels = _;\n return chart;\n };\n\n chart.startNucleotideNumber = function(_) {\n if (!arguments.length) return options.startNucleotideNumber;\n options.startNucleotideNumber = _;\n return chart;\n };\n\n chart.bundleExternalLinks = function(_) {\n if (!arguments.length) return options.bundleExternalLinks;\n options.bundleExternalLinks = _;\n return chart;\n };\n\n chart.rnaLayout = function(_) {\n if (!arguments.length) return options.rnaLayout;\n options.rnaLayout = _;\n return chart;\n };\n\n chart.namePosition = function(_) {\n if (!arguments.length) return options.namePosition;\n options.namePosition = _;\n return chart;\n };\n\n chart.zoom = function(_) {\n if (!arguments.length) return options.zoom;\n options.zoom = _;\n return chart;\n };\n\n return chart;\n}\n"],"names":["root","factory","exports","module","require","define","amd","self","__WEBPACK_EXTERNAL_MODULE__893__","Connection","this","loop","Loop","region","Region","start","end","xrad","yrad","angle","extruded","broken","_isNull","prototype","isNull","setNull","getLoop","setLoop","getRegion","setRegion","getStart","setStart","getEnd","setEnd","getXrad","setXrad","getYrad","setYrad","getAngle","setAngle","isExtruded","setExtruded","isBroken","setBroken","nconnection","connections","_connections","number","depth","mark","x","y","radius","getNconnection","setNconnection","setConnection","i","c","getConnection","addConnection","push","getNumber","setNumber","getDepth","setDepth","isMark","setMark","getX","setX","getY","setY","getRadius","setRadius","_start1","_end1","_start2","_end2","getStart1","setStart1","start1","getEnd1","setEnd1","end1","getStart2","setStart2","start2","getEnd2","setEnd2","end2","byteLength","b64","lens","getLens","validLen","placeHoldersLen","toByteArray","tmp","arr","Arr","_byteLength","curByte","len","revLookup","charCodeAt","fromByteArray","uint8","length","extraBytes","parts","maxChunkLength","len2","encodeChunk","lookup","join","Uint8Array","Array","code","Error","indexOf","num","output","base64","ieee754","customInspectSymbol","Symbol","Buffer","K_MAX_LENGTH","createBuffer","RangeError","buf","Object","setPrototypeOf","arg","encodingOrOffset","TypeError","allocUnsafe","from","value","string","encoding","isEncoding","actual","write","slice","fromString","ArrayBuffer","isView","arrayView","isInstance","copy","fromArrayBuffer","buffer","byteOffset","fromArrayLike","fromArrayView","SharedArrayBuffer","valueOf","b","obj","isBuffer","checked","undefined","numberIsNaN","type","isArray","data","fromObject","toPrimitive","assertSize","size","array","toString","mustMatch","arguments","loweredCase","utf8ToBytes","base64ToBytes","toLowerCase","slowToString","hexSlice","utf8Slice","asciiSlice","latin1Slice","base64Slice","utf16leSlice","swap","n","m","bidirectionalIndexOf","val","dir","arrayIndexOf","call","lastIndexOf","indexSize","arrLength","valLength","String","read","readUInt16BE","foundIndex","found","j","hexWrite","offset","Number","remaining","strLen","parsed","parseInt","substr","utf8Write","blitBuffer","asciiWrite","str","byteArray","asciiToBytes","base64Write","ucs2Write","units","hi","lo","utf16leToBytes","Math","min","res","firstByte","codePoint","bytesPerSequence","secondByte","thirdByte","fourthByte","tempCodePoint","codePoints","MAX_ARGUMENTS_LENGTH","fromCharCode","apply","decodeCodePointsArray","TYPED_ARRAY_SUPPORT","proto","foo","e","typedArraySupport","console","error","defineProperty","enumerable","get","poolSize","alloc","fill","allocUnsafeSlow","_isBuffer","compare","a","concat","list","pos","set","swap16","swap32","swap64","toLocaleString","equals","inspect","max","replace","trim","target","thisStart","thisEnd","thisCopy","targetCopy","includes","isFinite","toJSON","_arr","ret","out","hexSliceLookupTable","bytes","checkOffset","ext","checkInt","wrtBigUInt64LE","checkIntBI","BigInt","wrtBigUInt64BE","checkIEEE754","writeFloat","littleEndian","noAssert","writeDouble","newBuf","subarray","readUintLE","readUIntLE","mul","readUintBE","readUIntBE","readUint8","readUInt8","readUint16LE","readUInt16LE","readUint16BE","readUint32LE","readUInt32LE","readUint32BE","readUInt32BE","readBigUInt64LE","defineBigIntMethod","validateNumber","first","last","boundsError","readBigUInt64BE","readIntLE","pow","readIntBE","readInt8","readInt16LE","readInt16BE","readInt32LE","readInt32BE","readBigInt64LE","readBigInt64BE","readFloatLE","readFloatBE","readDoubleLE","readDoubleBE","writeUintLE","writeUIntLE","writeUintBE","writeUIntBE","writeUint8","writeUInt8","writeUint16LE","writeUInt16LE","writeUint16BE","writeUInt16BE","writeUint32LE","writeUInt32LE","writeUint32BE","writeUInt32BE","writeBigUInt64LE","writeBigUInt64BE","writeIntLE","limit","sub","writeIntBE","writeInt8","writeInt16LE","writeInt16BE","writeInt32LE","writeInt32BE","writeBigInt64LE","writeBigInt64BE","writeFloatLE","writeFloatBE","writeDoubleLE","writeDoubleBE","targetStart","copyWithin","errors","E","sym","getMessage","Base","constructor","super","writable","configurable","name","stack","message","addNumericalSeparator","range","ERR_OUT_OF_RANGE","checkBounds","ERR_INVALID_ARG_TYPE","floor","ERR_BUFFER_OUT_OF_BOUNDS","input","msg","received","isInteger","abs","INVALID_BASE64_RE","Infinity","leadSurrogate","split","base64clean","src","dst","alphabet","table","i16","fn","BufferBigIntNotDefined","isLE","mLen","nBytes","eLen","eMax","eBias","nBits","d","s","NaN","rt","isNaN","log","LN2","uuid","toBase64","btoa","fromBase64","atob","encode","uuid_","parse","substring","decode","slug","stringify","v4","nice","getRandomValues","rnds8","rng","crypto","bind","msCrypto","test","byteToHex","_nodeId","_clockseq","_lastMSecs","_lastNSecs","options","node","clockseq","seedBytes","random","msecs","Date","now","nsecs","dt","tl","tmh","v","version","hashfunc","generateUUID","namespace","unescape","encodeURIComponent","stringToBytes","err","DNS","URL","getOutputLength","inputLength8","safeAdd","lsw","md5cmn","q","t","cnt","md5ff","md5gg","md5hh","md5ii","v35","length32","hexTab","hex","charAt","md5ToHexEncodedArray","olda","oldb","oldc","oldd","wordsToMd5","length8","Uint32Array","bytesToWords","rnds","f","z","ROTL","K","H","l","N","ceil","M","_i","_i2","W","_t","_t2","T","__webpack_module_cache__","__webpack_require__","moduleId","cachedModule","__webpack_modules__","getter","__esModule","definition","key","o","g","globalThis","Function","window","prop","hasOwnProperty","r","toStringTag","scriptUrl","importScripts","location","document","currentScript","scripts","getElementsByTagName","p","contextMenu","menu","opts","openCallback","closeCallback","previouslyMouseUp","uid","slugid","rootElement","orientation","initialPos","parentStart","onOpen","onClose","d3","enter","append","classed","on","style","index","mousePos","pMouseUp","elm","currentThis","openChildMenuUid","html","preventDefault","stopPropagation","selectAll","attr","divider","disabled","action","title","children","childUid","boundingRect","getBoundingClientRect","childrenContextMenu","left","pageXOffset","top","pageYOffset","width","ArrowIcon","contextMenuSelection","pageX","pageY","innerWidth","numberSort","RNAUtilities","bracketLeft","bracketRight","inverseBrackets","bracket","maximumMatching","pt","mm","maximum","backtrackMaximumMatching","oldPt","map","mmBt","dotbracketToPairtable","dotbracket","inverseBracketLeft","inverseBracketRight","ni","pop","insertIntoStack","k","deleteFromStack","pairtableToDotbracket","seen","findUnmatched","to","toRemove","unmatched","origFrom","origTo","removePseudoknotsFromPairtable","newPt","removed","ptToElements","level","dotBracketBreaks","elements","u5","u3","sort","external","right","rnaUtilities","ColorScheme","colorsText","parseRange","rangeText","nums","parts1","parseColorText","colorText","lines","currMolecule","counter","colorsJson","colorValues","domainValues","words","search","partsRight","domain","color","normalizeColors","moleculeName","minNum","MAX_VALUE","maxNum","MIN_VALUE","resnum","RNAGraph","seq","structName","startNumber","circularizeExternal","circular","pseudoknotPairs","nucsToNodes","addUids","uids","nucleotideNodes","nodes","filter","nodeType","computePairtable","pairtable","rnaLength","addPositions","positions","labelNodes","breakNodesToFakeNodes","_loop","elemType","getPositions","getUids","reinforceStems","relevantElements","allNucs","nucs","addFakeNode","reinforceLoops","filterNucs","newNode1","px","py","newNode2","updateLinkUids","links","source","tan","fakeNodeUid","newNode","newX","newY","coordsCounted","cos","ia","fromNode","connectFakeNodes","fakeNodes","linked","thisNode","thisNuc","JSON","distance","addExtraLinks","extraLinks","newLink","getNodeFromNucleotides","linkType","elementsToJson","elemTypes","nodeName","prevNode","nextNode","addLabels","labelInterval","prevVec","nextVec","combinedVec","vecLength","sqrt","normedVec","offsetVec","recalculateElements","removePseudoknots","externalLoop","eloop","prev","hloop","numGreater","reassignLinkUids","addPseudoknots","addName","simpleXyCoordinates","pair_table","alpha","loop_size","stack_size","lp","stk","PIHALF","PI","i_old","partner","start_k","start_l","ladder","begin","diff","polygon","count","bubble","remember","poss","sin","Radloop","loopnumber","next","getLoopnumber","setLoopnumber","getNext","setNext","getPrev","setPrev","mate","extracted","getMate","setMate","isExtracted","setExtracted","NAView","ANUM","MAXITER","bases","nbase","nregion","loop_count","loops","regions","rlphead","lencut","RADIUS_REDUCTION_FACTOR","angleinc","_h","HELIX_FACTOR","BACKBONE_DISTANCE","determine_depths","FornaContainer","element","passedOptions","assign","initialSize","svgW","svgH","linkStrengths","displayParameters","colorScheme","customColors","rnas","mousedownNode","mouseupNode","linkContextMenuShown","resetMouseVars","graph","editable","animation","shiftKeydown","ctrlKeydown","keyCode","getStructuresDotBracket","centerView","zoomable","disableZooming","enableBrushing","enableZooming","disableBrushing","backgroundMenu","canvasMousePos","xScale","invert","yScale","addRNA","nodeMenu","deleteNode","changeNode","insertNodeBeforeOrAfter","nodeContextMenu","backgroundContextMenu","select","remove","svg","each","focus","mouseEventHelper","mpos","vis","dragLine","fstyle","deselectAllNodes","visLinks","visNodes","linear","zoomer","zoom","scaleExtent","translate","scale","toggleSelectNode","selected","selectedNodes","brusher","brush","extent","clear","force","charge","middleCharge","otherCharge","friction","linkDistance","linkDistanceMultiplier","linkStrength","other","gravity","chargeDistance","drag","sourceEvent","d1","fixed","dx","dy","resumeForce","createInitialLayout","structure","rg","sequence","rnaJson","layout","naViewPositions","naview_xy_coordinates","createNewNodes","gnodesEnter","previouslySelected","rna","transition","duration","ease","nodeMousedown","nodeMouseup","labelAndProteinNodes","text","createNewLinks","linksEnter","linkLines","linkClick","drawDirectionArrow","magnitude","endPoint","startPoint","nodeStroke","parseFloat","lengthMult","arrowWidth","u","arrowTip","path","realLinkFilter","recalculateGraph","uidsToNodes","forEach","link","fakeLinks","linkIndex","splice","update","allLinks","elementKey","exit","gnodes","realNodes","quadtree","collide","nx1","nx2","ny1","ny2","quad","x1","y1","x2","y2","point","visit","changeColorScheme","updateStyle","transitionRNA","newStructure","nextFunction","transitionDuration","newRNAJson","newNodes","callback","setTimeout","bbTransform","minX","minY","maxX","maxY","maxRadius","molWidth","molHeight","widthRatio","heightRatio","minRatio","maxNodeRadius","newMolWidth","newMolHeight","getBoundingBoxTransform","setSize","offsetWidth","offsetHeight","setOutlineColor","addCustomColors","json","addCustomColorsText","customColorsText","cs","newColorScheme","ordinal","category10","interpolate","changeColors","moleculeColors","displayNumbering","displayNodeOutline","displayNodeLabel","displayLinks","displayPseudoknotLinks","displayProteinLinks","displayAllLinks","displayDirectionArrows","referenceNode","newNodeNum","newDotbracket","newSequence","newPositions","positionOffset","newUids","pair","updateRnaGraph","nucleotidePositions","labelPositions","basepairPossible","linkMenu","rna1","rna2","dotbracket1","dotbracket2","seq1","seq2","positions1","positions2","newSeq","toAddExternal","toDelete","newRna","addBackBoneLink","addLink","linkContextMenu","sequence1","sequence2","rnaDotBracket","dotBracket1","dotBracket2","uids1","uids2","removeBackBoneLink","extraLinkIndex","removeLink","fromJSON","jsonString","ProteinGraph","addRNAJSON","newLinks","addExternalLinks","centerPos","avoidOthers","breakPositions","_loop2","linkSource","linkTarget","breakFrom","breakTo","sequences","dotbrackets","rnaPositions","rnaUids","lastBreak","newRnas","splitMultiStrand","rnaGraph","_ref","_ref$avoidOthers","_ref$centerPos","_ref$centerView","totalX","totalY","nodeCount","addNodes","entry","clearNodes","externalLinks","currIdx","nodeIdxs","breaks","idx1","idx2","startAnimation","stopAnimation","stop","resume","setFriction","setCharge","setGravity","setPseudoknotStrength","pseudoknot","rnaPlot","chart","selection","plot","startNucleotideNumber","rnaLayout","fillViewportTransform","xValues","yValues","xExtent","yExtent","nucleotideRadius","rnaEdgePadding","xRange","yRange","createOtherScale","firstScale","newDomain","newRange","scaleFactor","newWidth","newMargin","height","createTransformToFillViewport","extraLinkType","createLinks","gs","showNucleotideLabels","struct_name","createNucleotides","createLabels","nameLabel","xyPos","namePosition","xy","textBBox","getBBox","textSize","plotSize","createName","bundleExternalLinks","nodesDict","linksList","results","ForceEdgeBundling","edges","compatibility_threshold","step_size","fbundling","d3line","line","edge_subpoint_data","makeExternalLinksBundle","_","rnaTreemap","rnaTreemapNode","treemap","sticky","datum","read_in_bases","find_regions","construct_loop","find_central_loop","traverse_loop","npairs","nb1","ibase","retloop","cp","rp","rlp","maxconn","maxdepth","anchor_connection","xs","ys","xe","xn","yn","xc","yc","xo","yo","astart","aend","cpnext","acp","cpprev","ic","da","maxang","icstart","icend","icmiddle","icroot","done","done_all_connections","rooted","sign","midx","midy","nrx","nry","mx","my","vx","vy","dotmv","nmidx","nmidy","icstart1","icup","icdown","icnext","direction","dan","rr","cpx","cpy","cpnextx","cpnexty","cnx","rcn","rc","lnx","lny","rl","ac","acn","sx","sy","dcp","imaxloop","indice","atan2","set_radius","determine_radius","connected_connection","find_ic_middle","asin","construct_extruded_segment","generate_region","mindit","ci","sumn","sumd","dit","imindit","rt2_2","aend1","aend2","aave","a1","a2","dac","nstart","nend","collision","construct_circle_segment","minf2","maxf2","find_center_for_arc","h","hhi","hlow","disc","theta","iter","acos","noIterationFailureYet"],"sourceRoot":""} \ No newline at end of file From c7cbe47cc08341e520536254705611452d519fb9 Mon Sep 17 00:00:00 2001 From: Lucandia Date: Thu, 30 May 2024 18:45:44 +0200 Subject: [PATCH 6/9] updated the images to show --- README.md | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/README.md b/README.md index 94d787e..1495293 100644 --- a/README.md +++ b/README.md @@ -11,7 +11,7 @@ to display. Below is an example of a simple web page which uses a `FornaContainer` to show a simple RNA molecule: -![blah blah](https://raw.githubusercontent.com/pkerpedjiev/fornac/develop/doc/img/forna-container-screenshot.png "An example of the FornaContainer") +![fornac example](./doc/img/forna-container-screenshot.png "An example of the FornaContainer") The code for creating this web page is rather straightforward. After importing some necessary javascript files, we create a container using `new @@ -44,7 +44,7 @@ This after the RNA container. Display two cofolded sequences using the format of [RNAcofold](http://rna.tbi.univie.ac.at/cgi-bin/RNAcofold.cgi): -![Cofolded sequences](https://raw.githubusercontent.com/pkerpedjiev/fornac/master/doc/img/cofold_example.png "An example of cofolded sequences displayed using the FornaContainer") +![Cofolded sequences](./doc/img/cofold_example.png "An example of cofolded sequences displayed using the FornaContainer") ```javascript var container = new fornac.FornaContainer("#cofold_ss", @@ -91,7 +91,7 @@ This only makes sense in connection with the `animation` argument. If it's true, the external loops will be arranged in a nice circle. If false, they will be allowed to flop around as the force layout dictates: - +![Circularized example](./doc/img/uncircularized_exterior.png "An example of circularized sequences") ### labelInterval [default=10] From a5fab62b9ff51e19bdc2a6def0a6f5dbba562723 Mon Sep 17 00:00:00 2001 From: Lucandia Date: Thu, 30 May 2024 18:47:16 +0200 Subject: [PATCH 7/9] in the demo, make the cofold image not animated --- examples/demo.html | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/examples/demo.html b/examples/demo.html index 7b7bf38..2c29519 100644 --- a/examples/demo.html +++ b/examples/demo.html @@ -95,7 +95,7 @@

This is a custom-colored RNA

function cofoldContainer() { var container = new fornac.FornaContainer("#cofold_ss", - {'animation': true, 'zoomable': false, 'initialSize':[500,300]}); + {'animation': false, 'zoomable': false, 'initialSize':[500,300]}); var options = {'structure': '..((((...))))...((...((...((..&............))...))...))..', 'sequence': 'ACGAUCAGAGAUCAGAGCAUACGACAGCAG&ACGAAAAAAAGAGCAUACGACAGCAG' From a651f993819759e2617c5263df284fa9cad99be6 Mon Sep 17 00:00:00 2001 From: Lucandia Date: Thu, 30 May 2024 18:47:56 +0200 Subject: [PATCH 8/9] udpdated imgaes, fixed the cofold images --- doc/img/cofold_example.png | Bin 15895 -> 207311 bytes doc/img/uncircularized_exterior.png | Bin 34066 -> 829376 bytes 2 files changed, 0 insertions(+), 0 deletions(-) diff --git a/doc/img/cofold_example.png b/doc/img/cofold_example.png index 05bb1bb3cd5f0d8d84c4491ee25e09c9e93f1dde..5ca1687d70f7afaaf6773eab5e27c95c225b157c 100644 GIT binary patch literal 207311 zcmbTd2Q-{r)G#_q^e{?-5JvA^bY?J!-lB^#y6C-*UZX@W5rQbuOVmV(5}hETMf4IS z7@fhL$oszk|K0W9b=SStn&p`}`<%1;*=O(l#Av7~+{b%_2LJ%>D?Wv40RU*%008DX z4m#==deS!usDHRFPYv7wfQL+fK4^+sj0XU~J#D*Z`X2hKDqpfBBRdtcIvbB5a=Vqntr}oUk?}de^ zB|TUQB;g~5TENlD!yM$}=-}io<|9dex2_oK`OnWh^q@Nsj~9~k(tkDt>8omhWS!lt zK%(4yTo$~%d>~=elb{g4h^VNrurMcxpO;^NhgXP){|OhrfY=jZF+M@iKY#S79o;Og z#k8RE|LlkQCP{DW;o&02!{hDk&Fw9~?d)d5!zU^#%EQag!_Uu!g5YxZb@DLx;c{|k z_;&@UmAi$Tor{N^vlHmgismq9PY+3Y6t;I{SozrfuXUZ=|KSyiYdn8Oc=)(^{}A?< zVn>(%F!&#kKISg}1JKgqKR6dpH-|esEiHJg9IPCzoIKo7uzde5>SF8c;p}ef{Qt1@ zf5ZP{1C%6GRsY-L|A>pD<9}PYd&qgADE^0c|3_%|XTC00JX%)n&Yo@-R&rh_G#ThY ze>fnfVdrDzpbxb}q3(|2p(H)u6Mmupeazs09}^Ve|7T3c-O5eY+3^p>lJwdZZdR!I zC|dt8(?v|y&C1-v3X1wj(xbFMkc;;TmjLfGJ`philp^qP@bZiC^8N)?b+)v#_WeJB z3JQt|i2M&wlp0!^dzk;f0$W;$Sv$KqnxinYb2PWH;&E}Zp$GlPYcW}82WL0b#whFr z?yyi*6;pI__b_*|uu_Cd(xXV=wzIPo6SflIvlM+|%_S(zFUln-$j8S8 zSxMX6Db8O{qVcbhfcT$q^MY7a%`NPl{+JEhzt~yWnmgH8p?nw*Jr9Z;oJYZs(0~o3$Iz!H$C7%&%D*g+Pv>Qr275bQ(4@*xO`i?L|sQuBrQ6N*n~ji zShO`WD;i)8l%vUlm`6|DD4^+yzeA?xA++Ix;Ijaw)GJ(}FjhrFh1jX4Zs(GKxW7Z{ z7gQlU=AV9$=VCfx-owYn>RftqgLcsTRpRpL1siz11ew|qa!$tkvfBJ{sP+j#ZX129 z@$@&t!>0c=pLX6??LIYr_Nx~^&YrfP(EXj3hY-dz#p?(Km|(205#fQuofGmU+~PZ; z2g6CFwBUp4f0lQ~X&1Z{bBk3~N(DuE74~zI>CtHN(!7k2hyMoxYA1^-Bo6(Ki5>>! zgi3@mZY8;tGg3YOZyR*eM;G*foL%#{OwH${(=w|%M7Nx4*w6v{9G$kO80Zzcg*m|aR)?+IxH^=V!6~LHn{#U0ma7~ ztYu{jVvQ}C!^-e-UTRGb;lm_qNkWd26I#%}AT1l!9qQd%`|KsP^RNA3WxiCg-`Y0?iO&%F|LaXLShSq1P^i3uj zi}^n`GPVmoj3c38yI?U<>$FIqh$lSoVaz#x^A83=-3KwE`Z{b9SG`@{0q>Lp5|b#@ z687U{{#BwyoB+0CAziMxYXHlFoJcJd=9k~ZypL4gV*W=x){4TBZ-IDi#<(i1=Lp=L z$$E$}fMLSg@(4uf{a4^6$oS8uZBEKQB`5H>1#)nob8kmMAzTmpUpWMgUQEn50xYOC z-NPTq)AJJsCG>*vo{r1sTgd#C1AK51fb6+wg-E0ZH$1tIq2KnCoI*!6$(SsH@D`;5 z|FV?&Xu9br{P%$E^a(FF{hO|!|1jvz@bLr`zax6o5-+q*Bo4Azi0Kh>rB0InU&Mlt zo^w|_Ce#YV3X}^8H*dObg}sXYH79XoQs6CBFhUILo%R4LGJ%Ws&Q|iG0{T2XRfRo9 zJRIgfNQ@mxBti_B%GqPfHV_d3wfdY7Us7q`Y|?=p_Nz_XdL%=poCtDcm^Yej4o?cy z?##jI#*BCCyD%x`r*16q?&h}j~Mm_-%hKpo&-Xxun!6KQ;pP4zC zuNZ$xd>@nF6mSo1i)_8AKDe66^8~!G`fHU=a3JQ;&`_oBP@Us=?wF6$XZ?XJ$*D)B z-$A4zp%kDUHc_KW{fO+W7y1|M6i^%pY5bR-HR$_iVzm>-`Po?%tfKL{`oakqvzG?u>drJ3sy0ab@jL z(|+<2n_{YyFBk9fM!HP>M_25PEsK>29`&RbdTza7)Mr__Gs=xsqjX6yczW*`0$sA- zhg!MFOo>CGOTiEoh~+GcJRrHJ7(jrY85$>1>aaKMHDjNJrlVh@URB3TjZL;a=6d@5zC7E36uJv?9^(Q8_=1B0%vgO9D$yyOn)yT;pB;qL^C}3` zNV+|9ii*}hyVT5{)VG|I^u58Li7<9gYE}k(&r@fQ++o9`y2iY-^w)0|4Gjzojj=!% zP8Js$zAi8_Jpcsn0<-UkTDV4X3?b2X*1aVATv_W@Dq;+ypAzX>wc;k`$X1r5T5Opx-`voV_#)iA~5nDU`CS*huj3x1rVLjvYpETEr zKPK`+s3jY}VH9yj`+>(F zs}?Z;oXl6z4~!W@&|oq}-V^=8QE8RMR^DO@v$L}T`LvUQp4~NEL$1_g?tvQwR{WHT z1MDpU+<9ZKBqgCQ!VkJdeIppOf^*wDq*q?ht|5sWGUE^9G@Jw+MojV@ zi+S1Eqn7U`nL6yU!WgJd zB8#3lvHN@+=`jY;JxMOOiAy~l{}|HQm8_=3!(*%9h=@qpc8XCeYv94*)oEW{PmpTg z^;xwf*EuGTfyRiD?>b8JQ59MI1Lmz(A?joGm&kN0p5d{_l5WR6F)3j;uRbq_r=P50 z%T9l|i0CbhBFYnS)tWwuFZ_cBE`TrU1d|D%`6fjl11R58ylo&JsWQOx*D(5WXF;NO%AGJs2( zPLPbs?_SGSn%pw4J2x0s>MBn+yn=+l?&He~?+`xd>u)WFy{Izu5GX4lb1ZULe_>sP zMc?O{k&zx126uH6E1GbvWum}EeWv*>ybJ)ZzEsj|uv z0Loc>!i#5JEeiq2P7^<|$qPf8EOBvjRdRA;hY-=nTo1a`@)~n)b7Xa@5Aw|WJ$w{L z7=kgF8L?3#QJH2fVeo|OYHdJtsIj=j+D-K2lZq+Zb_mk}L98>AaZHGdN>(2@xv;MQ z4Jcm|`|8gTxCjmCtBZJGT8l*-lc^|UtAZ6qhjxD6rrtx`h8V=}u-K=O8wBzJhVXB$ zZ!pMuRnY`8W6%N1Bs_yzZE-eXX4wz1$28%6t{ZBjTq8V~)WM~1xkg685|U>wzRj%n zZtDBhsmYGhenqfYZ+7VJB(~cx5$Z2)nKdcg3lxi5Kkr=*vY$`-IrA$k%hZr|gNO@IoF%bDy-%zl!(eEFh5* zbJVYqqAd-A35;G{i8@$kN#r^cB-W+(yPnG6KcBB|llT&NQ`;>$nXt+TKx0JjG5`|* zF9>lkS3pk(Z+mW7qz*!e2(ZFzGJ;&~S{f$kWxjY9r|0G9`?2rLE221-sGo-k>-Z@( z=kQqLF$Sb#5p@nAB=&Q*Zif#^*Wn*HgHyn;#r(@I_8eWgVa5CW!3|n>QI9Y=_y9vQ zXRU$;VisLoH)A1iOuKaIPfH{k9(=J7ImHC{|yCki#YSqo^Iyja4PvZc6uzh-J+Vqj>3E{$l5Nh^7=VDlZ3CwEhd zwbb7qsuYy}6VAS43-F#_ST9;X;tX8Z>;>u(l@~m2VZQBM#R)Ej6wVaZPtiNwnTI=~ zC{Ew>o`C6C*7MJF!Qot?(!o>*kBO*(&#ckU@ztpdN=49nxZgCN{OntVA59SiKTWMM z3nhCvLf|5JvZic`gw<-4PVJodEqGG*c>*}OcmmhDX?@QUZ!!xk^#+{htjiZjdJQVw zKg{_vd(dnu%&n|)w3Tcc%FeTGraF#nGZ`^kk%Z;<{3BMq#O*jSKzhpUoDtaPws`5HhdzJq@)GA zuE^5feEqn1!flYAf@m^w?B>N`y}!A$U?Fnvc2t4r_O!3vWofNo+2;_0RAaDw(SH&j zexAkyU%n@Bs8kgUfmEKw6{h>0;7g3{c!^EfuYXcB^~LNtrv@qA;9~UD$I+`7)~8U$ z)M)ltxZMTk!VkdZmc8BzY%*lauB2j*NZR&(Ub~k5GCUlaeol!&Fn{y$Bh5oKH6U^a z0~>z+V44J=0f@xhs0lsbFJmcJ+4YqMogxGl0Kiq+jqw-n?+7E=)r{NU+P8=_g%rOST5W+hL;=5V{(OvrF0f6Hx?buZ zi;H}-E%NW;6m)F(vF-KZ#II6U96X^XWwpTT)yu8vN%}pGtmx((VYb{)(Ng>;v=*iU zS8w!s3+oYw#AL3@V1?`)JtmSO{?d8;oyzol-r4^RW^EJ(V^>D5h+n}1HedsFNF$?6 zUAai1{@LgNOgx;mjltX;hR7W;YRdHx$h3!RCjQgi--&6uI~=ALgApIO$&l{{-Wy9{ zYZM9VeM<*rpW(KX`#4{MX?>ABTJNH5lZm16q$dhERaDUym`{H&J%#$(XgnI7-!39^ z=~#R@c&(b(uC>Lbh1ExUXsXuAP$7}*8Fj8?UZE%|a+!PQc0G{Bd^|Sw1QbdmDLO!G zfFg0mFXgL5uPAHkA*$+@RA`nWD45c@d801#d>v!#LnIc(l8cv^vU$wA&1?X~LELHh ztgW-oF*^Q17YrZs!yE^T8Z~)9au-R(J1$~I>xz}zfsUY)+Er!h#4wWUZ#&huYeD{- zDM6R`-nZ3x=WVn%-xnrH^O3}0HZaEea`LVLh~QFosBx_LW{et~Jx00^(-!A6QQ8#) zE9fEWc?|{}`uOx0gviyqPo&!Nt~WRob<$+VE~$yC?GeYBU3L8y<;7m^k2qd!|$ zvu;m6lV0EafdXn&%Eif*UfnOQY=I#T#=rp{!+7DPF2P2$i0QAT~ z?@ue!i-T(4q1$TFP=ZEl0!x!X+k#+=1^}T~I-)3O8EGtmn#e9fGQILZP-My#8CA65; zN)eq;gmV|yj2T_IPWLA|FSf^W1bO>`9M7&-Ynw^+f+MYzo6qxh&Y_e^ZS558A~(hU z0>d!R3-uAMz7s+L_~m_JbbY;>axb-*IjiRvIv;t?)2-gn{^CevM+=FD$MBd#leW8R zQsZQvQeFaZ=$MgFcQIk{x{XfJ_fkrCX41&1O40HRPgOpb!F*>JJt2jehCU`A4mEEG zW%7B9?blQ$*u%mGl`Y*SA`Wdc_SBarema`&5i;gGja-1h^&wM(UY<1NNrB0Dzp$t1 z*s~P`*63^rjoh~bE$c2RurD5M#vG*t!)I8x9%tPUkM(F7yv!~pYM6+#--%D_FQ7LZ zDq!NK6Xb~UU&JIKez{T4xr$AT&E?(y8a1(fLw(b zI+h}Mn&JB=y|CK(J+IaUr=}NMt&9Vhu$4HQ>LKv#Z;S$Rh|#uHB(yU|_clG~#`w6D znhj7Nk9Z(%{XH!Y9lY9tW+mB&9}0=ZN)dLxOqjdEp#^JJGZx-2w+SI1MWq~k=Ehk~ zXng-_f>wJ$87Zmiq@cvuzM$9Bb{%KhduT}wSb%#t(M2_+ow)wE1!8o-!mcEUWm%fq zs*Dkr^6*H^7pOZu+ieUf3&glm*SYyHvTb^g>tU?SO-u~#;oC+l8lP>u#Up^?>27I* z_=><$Ld;y!I(H_T)aZwH*9VV_lsRQu= z;YGEC1Euc7x^f>PQ}5hc9MZbp&R}C@g+%tZpf{;|r9USp8yX&Yb0jNapDJ69;Hb(t zk+c=PcI7EEw~%s5k1^}RUOJY6D6@^GwmnBZW7ml0F@3I%>>-==xP9MYY7ORYc=FgV z$zhQZOZ#~bv1URQ!EuO{&QXh-N#z3s`u9oII78$ZGx!zpiXtP^gGR+k?~1mdG7bc( z9>^m3s~?Ullwc)d>@JKO8P3biJv0s~T0jUWy+CMz3!hz$^;g{o0Z18LItx==y9+qj zyE|)v!6rG|-*|XmlH$DGa2F5|=!Lna0rX6K*Qe7=)9W#*2zXv+IB;!{*7G{-=Vqx$ zu-zVZ1YQWYZyKFCyq3CYH+^u%9CRKuo6EvZ;35&`(SYRCgpgn;331?k9m#DU2scdZ z1D@o+{n{^m90&8E4ws!SZM@5Y0mx1r8}(b$z5ZI2@x7TWoN-L z`Zlsb!J0NS-{@F5y)$NT6JYW{*rA9dZCs0*10%!n&H1cwJ0s!F*mB zp=P2{8H#Z*zUqx<^L45XPMbqzPoN)&(G(Dy^|R{8ZKB&Q1*yX<1www3M2gif+%P^4 zMW`%6Xr87@0~(C}y*_)~;P^;RJ1Wh#It#At1Cos*H#JX4cz~<#BrNjf$M2%4G5nhl z7NX{a`sU^jpXx|_Oz2E`RT%PygkO(zo}r`j5i`;fm^@1^UPgGlJBEIUg<*>frydcf$)%vrA=6?<#nkoczOGJ&N##ZIr&*JpA!FLJR9 z9E3P*>Mx9|Uh$CO-Fs5POf^#?cjH#nST})Xp`XJ>L|%Ui9GFN38tr%NTyk_AU6xA_ z<{E5M8~w&UX!>4Gt}=yJh90bs#4ZLvNqPw19CuNpQ^m~V zDvzIkD>%njI8mm5czBn>U+h7qxVz_FAvg2<5D*}DbVPWtbjUthv%^>slvPKmNXd>1 zOeYPMtVB$|Xz*+Mx#w9K&|o?%R*N8mfCwotA7TXpL!gg4`N!qzM_$@IGDnL&XfJ&X z&4?)c^?R5?x5=)^4u}^4t27aJp3tLlL}%Ov#u+4&e3pG~)&{*_%iwk_phg%&2i zUCNg=JzpVDpcYes01+|h)-jzf#@=4mUi04_LtU!YoCP0sOD`UU!5yRQ?+r>|M}4*%CXM$cE!@sI_$vTG{m=}gKBJ7>Z4iK%I%%P`m4(ZkH4wp>tohx=Gdz4jSo%2l$65_n1Y^BV4=$-k;BsC zjO(AY*yv~7)7PvMnA9%PI+Rd0Wg}Ezz(l15mSgmQJ;Y4&4rFH8Qc zgKtI}&+KcQD5w-riY_Q1kTOON;6G|ue=oVW(VJWGCEWD_*DPUBi$p*u2IK47+Cbk^ zgt;A7a6xH(eSN(ADrbLC`o%;)IaPc|uem<3@EBwVYF5{EXFPjVlkB1e zH%Fp%9W`L3aVZ;BnPj&QYH?tWZXOvmIXMckj1C>A;X(w>NY#8|SE8A*Bf@?ZvNP~m z0zIFuM0dSRHodccs>HG3gjG!H8d~001O2FQKPBy6r{D;NIt>UwX33AZC(e_ZlPl(m zJU8P7K$h}_dax$di?jyV2N8$~rSjfj-JGv4NyFwEKaCGiJ)inzBgqk)ff2l(QsiH!Q6+8u{b;^^Sc&_W_&zr;-|l+g%cz~ zVV~`k*=nbsU_mMZLYIX-b(0_2RJwrWzY5wocjY-KtlW|ghgG@E7G6VN*)5Hc1r29=gSw0hESx!S#q+fR-^B40S0 z^J;yVS#{AloVLnEe|7KKqG$s6uy)W0M*Nw*xEI7rvGGh!bLxIo z-m=D|=ZK(6x1d8GVPY^g0AW0RBGKo1YTRyPZ!g9mA0V8GvouBrLakHp8bxPKnxDX;wT2cxAk*fVvWqV4_S+{BET7b^|Zm=_hYK? zkX*S6r?OVD7TfzWG3rx{4USV|nj?-hH~!1}<#}!`&$u(f>-R5i4{7sGuR#EJAf_~k zCJ%B*a2?Nlo3+F;c-_x}k@{oR{MnTYCsE~l!%TX(En&|##~-^7^1A3=cCmAP58lFW zH=!WFd(Hqp5a8CfWU+=>Gc%)SzNs+h(5?QI+%#xasQdj<7G(5&Y>r(jhZP%xqy4qz zT3iL|h8cux)G;3b(l2JR@3_x>`)fscsXsnBh;&>Fsc61H7vMt1(d7j_f62NW{8!-1 zL|9=LEiE^1i8|BXcmRNPP0IiKW>A7NneyL}NH ziHL|mRh8M|35ad=w)YxPHEpE-O?qs(& zH^19?6y~6_pGw}K#j}C!Dh+h9V1Usc#`J0hO~gtn@GX4ya1)q?nzX`}5P~ zz~)h$%S1a_0t_pdZm$Y1+pZ9HesgWJH|2?9Vgi|Y|tiuAmlpYkl~H=gN32nd%MyoCCL< z2dK*NPAlMYJq=#__=qim{T2F#ddI$d$0_3WWNR~zH!3|^MgJ0ai__zF@AfJY3_rUf z5!b_l?pnWr`}P(BASILI$IHwUW4{;3gZjJ!u+hd7(r_wGaIZg|8krQb4t_~RiD*@| zC}m28-kL^E;PR2KP?slJIx!xw`raxr>z$0gTx1t}wmt_`?Gg+=?m2y~0m8$y1_o{O zfX{?GZpISU69&FOwy+uBt?H*9ywu$yeEArVuy=fUJyMjnQ}yw;PPLy-0ol8E@a&Y7 zX_K>+c+Ok9HI~i&>M~V|w_isY9po7Ds2?SK36BwfR9N^qIpnX;$zI$)!x&?ErMsmc z`#JOrltf`)()(d6?bUSjeaE!@N-L&am7FG=1UI>woA#P}qd)^^d<&uOq1f467hdFyDKetcznSdKU@#O+ z1zwYwc11sZ_ArS!CRwuwTR+w>y33IDkpkpSA`XX9-E=q*GcqgyDeA_8C(HukU8W5> z5_(}9MMqifccr{|q5yu{15(*_*lqt^Fx_^f6LgufPaY7N`IV^HMVz*fR}gVsped{> zJ1tmbvIxCI+p1hVlI%-({Obf81dO_5%NVQ|5TNt07z#2x*V>IJNaPKJF3OMMGH9)w zva0dMFOC1L5Y8^Y$Tr`?!thg@beCNQ=kzkj1$+t13siZAYgQ&W1U@iwrbCyNf#BdQ z4Lm2ky-qN_{Ja=YzCJ112~~!1vN` zY-9W5wAfBVz6wXNwXqw1u|2wRSpwz$=D2ZP1IKzF-vxo-)qqJsIZ$W+{Em`j2NOIMLswdQ@nw2``kIA9V`GtG>(2G-XTU zX<19Ipx3RO=;?vd>G5(})c4Mn{zzRsXv^`{u4nT15!RbU=mrxH4a!xP_BOCc8)f zRmbH0R&ERew|XH!0<&GzP)cUj*X(^pswC3+M|5B)A4ZSLibNOaRLRwY0LF$onUr0g zPal2yv*F+aHvr!HiX8d#4^~6z6=hEuvm$E^)^0a0_~RptyGirykktn?JRDCW*KG0h zXC$F_y0&|Ou}Hq(p-$r?xM`Hrz{Pny!ga{Y3HYGqwVE6X;7zH)0cw7WWpn|}y>d-S zURG|OndLe_*Aj|?uPBf9rzyz|up1TI2vCYLkV4GhD~EkYEjiiR_z^JF4ZiG;<-gt> z>UvF4XF8JbB~?!x&%`Z2)QkC127l^Z3sF$DI5IQ3SQiT0h*DtGK%+3`wsbPJd^;{1HAce2Ev=<<1sX9d4ZuSI97UNA z-YkHpocB~fmi!Z6rV}??lsS|Y5~(F!5o<0YWKJ?S6*dD2Rbt&0g~}ny)KVW-XNHvb zWTOZr-FLI{rGDW2@_%&Urk@pO5F(Q(`0xSK52$Xega)-i91CdM`Yy9MhG&{?MIUT% z`mEGX-}*rRqO(V@Enw_AFF?QNyV394k)Yd6+S^sy0s;U@{MD%O*%%yo-9FTDLfe7P zOc%3-i6a&E4kQ~4O@>ZjO^<0%eMr|6YopvqtfdIFSUxAnu@BbGD+pS^B1JRTo8DhtOtpM$~q8T`G)JidnNT7{E#VD z=+1TPp2wC&PnE>xktQr_8g|L6Lx(Z_=DC~$w??mXS7QSyeqZ+aZ{+3#O^$WIhkkQ~ zrQOKp`65S&g2pHIUYZ2tM`N2WGbAut@>&Jzc)DY=B>o4#_2d+ znIqaCncI&xP0n~auAGBw&JLEN60SRF{dnXmrO{YGsr&@$)DPs#bS#;z$&Mo8EArOU z)*~+NjU8ob)?laoj6p1glVJ|8xF{y~2%uB^VgV#!j%Kyx%yMiihixaoJ;f>Be8V5+to*LZ_8(kiS z*|-A{>srUJ&BgP!j+>1Nk|$Tu^wcr1FzIBK9!_SjP#HAnQSBBPG$e(GOsE2`Ysm5P z2tRiRz0~$7Wk~&*|JYM$KqwRqNF&0aBun!vs=x+|!naRx!RGIzp z^z80MRH&`dL=EBR%OlAY^Y0(&r=K+FBLAlAiZ2urXm%RsU-`UuEig5~9Rd{ikbwCz zyFD-6)wz)ix5x}xBAO?D^2YkW@llS(PivLJ?b~}i19~qBn1h2ssd;ryUN3fJdbzC` z?aqEL6lvLEY?mz3=1919)j49>w~>Q+DZ7?-2c09UQ% zh`1I^@1T_uZaf-Nx01vFSwAgU?J@_95g|d*Cx!i5k?$HV(ZX=UE)%}@SeY<$5bw>@ zy2A>5BiF$AC?>U&=n?^|(?hz5mi-%+qrZHL|L3M>u&T#CrB(aR&Tza!_k(=L1j)Mb zr)U;{G6+J^BzMtylI0gzEN{+7dlbeBR0PR`6dA=^>U3EE&<4XN7rayo;L7hxP17tc zKexWmDb!UdGU8rj;Yy4AM#FTzF6_Ad!4QRpg{IPR`kd#sVc+jwTqoxje84wGGGN5XTC^N6`8M9vZ zYh%{eag=F5;8adgKVT+_N~d~w8QoTP>4}rZpkZWH5a9b$pmd(u*;i7tnsveoeiNjeA`a{U*flHfzF#7&Q4+ z{LSyIS18FUG%L9_k0-~K7C*&ASI7$P@_mjQ)59aPa&vC>_W*M^WMW$t5@E(&@!3a^ zR*{;DnZ9N3CksqP-vqtsXA`Z(rE~=?dbH;EheO?RfJUq1t83NlAV%~RLLelDM*i7m zxOGu;+0y`pUC9L2);whLpE3^k2)W9l4qwl$Zq0pRSS&=1NewI=fBk05apYW!BAPD# zkdmRh_7wxC2ZfpW`rEhfrd}`1R_FyoBNTp*b(|3i7sDgFL(B~U4^GlT+q>w%OEs+w zD6!z|g`5^$D=5I^By)`ReI?kBDS;(K(Zs~z?witbjs_yA%Pk7K756E$N9AVntLRAs zJoY4vMTVqPr3KVSckR&NLSzY%l;;`w{`Q$4hw>1MT5iBWe$>Y|gcwlc{V|o(Mm9CI zgWeizMpB$%G6P@MoK{&)HU_>aEbWxGO3@|=nwz?mNz0M;=ZxRf$gwjA$n{nv-5Spp zSFNSzvovBL0LCJ;)ObaNN(Qh;eo8Ki_ON|_-7lc5iOZo`N{e&NOH4{0uQvJ!{T)@L zqk#=epgNB!76UVM*35(97keF6#G&?z1?N+d`4>zx|?b}_nzi#N+z%>L4R+S@lw8_VtO6&P&RM< zs$J`HrKIkN1yu1k*mGV%;6(mL0qz#I)psN@R41M4>CsCWX=U=QtEeVx7^=TZ)Df`6 z+QqW$9C%10jFWpg{ZS6uv^O6#bk@%7@KYfmw&aME4|wD_FS9a7b`jNgwni0`Z|RI~~?sw{HDddkUdufM8_Ocu?|o?jq+o zkjvP*^s?r>MLn(Etz=Ck7?W3;q`dQ(==$E1*Db<9WAa}+HvMw<(O*fvM1oRH1+VD% zuwOlep&wLV@e)HYh`tjsrV?=j;fg59J=0-ONQtMHR zIo$YWlIeDKI4{Nxj9_EG(d13o9(0KW5<^$%iCsUue+<;&DUY~o8BaXCKlxQ~;oJQo ze#d!NNo-8(LF+nuHO-?In3O4JdTj5C;mwn2lgXVksiUm1Xt&JH!yZR00qiub_u~$` zZBEW~rht5XRxkEFr)qHuTTIJ9Iia)yO;jDHOI5u4fb(?D2E<{5YRW2f%?g@d6i+7| z8iTp3qf^Y$UgxP;@Lx^n<+@*Ag%Dx!4YlKs4-<8*yaIjUhDPDgcARO3>VJ(CZr{>E zHwjq&{>$Fg?rj*_*UB@g!vg%K$Vo$ktth#D$QBD}bLf73P!(cKxSPfNvmf^~Yx~sM zm-ed4Ow>&%h~_8^wB`A+4US4Np10FpC1fXu*yi(LV1_=c)GJG~Z!jFOuIEz`{t$S! zaQl^kh=+%>GR+j#v`6*RWl~jG?logn#^yzsv@wdgpl2 z>3EUQmuefsHtd9)fJ3=?$TE@^EeWXhn(s(eI)lHksQNW)&>(}Ek2vD#0Qk^H`e}lM z-0PdDa7{+~6+Y3wvVA;nVrb&jG$*};28F79=XaM?exl;JHOQ?UY~f7AEQ)Qnb(O8KyV82pa*n218V~ zHdhXg&K`6!eeE3}+@uS9z#;v?lc>q)IuH5z5*)ZPd(u4|vQMgrdKbcD$27So%N*w& zr|d2t4_;un_I?c7uhlatq0`K_n*Ju|Se>Z0MHZ8Q@$Z?m(fJF!_HOH;OD}1riih$L zY&(&)99}VHuU+z3(5%A4zDh7-Cr0M}aYRx_o{r7U&EHU+Bs(uQ1S@AI@t*5>b=5`o z{N7*IQ)t|)s7&*tbgs31Hsn`mrVIID-@rLPXvu^K24JEeGJW)>^+5zzQDNf9-j2Qz z9}9=`H^`ry-Bg?j?89VVG8S)Hx}CGA9sfKDoFak?4xAY)Og?!otkV7A@sO)A76zwc zma(pmTZ;^x9(#Ih5xrv8ZN&|3;9An3=Al|-Y;u~_?2)9xfNXLZ%T%+jHsFt( z^P6nXGfC6rpA7*7v+>Bp7}dOS_ciIiKTT*(Mn&PbzC);7vAa8dWPZrZ(0TWuTlI{q zm3Tm5m`eq(AxDId7>&TExM`lI2APgx^=DYxb+1R>i@s+kzASdaB*9^{;{WJv>b2BK z+USTK%;>8BI}h#pX@;>$%ewbv$IZ(FV_xY;DU1I0w@aJw50`!W7~?LyTW42cpUpnh zmZW!ofI`5yA zU&!Q&0EbTMl{Wm_H!FK#Nx@1*y4BNTIq*8+wz}h^4nOvb1?>IjH$fd&!vbT}qHaFE zzO($5w(6AUlznMj3VaSz9#(xBq5ALz3U1C}T5&%Qb2wa30PzhmpMJ7`d!yJ_yZ>=t zite_nt4pu_a(%s54jsaKr*AwN1-MLx@FiubOXIH`Efrm9 zu{+pR7Ui*S3qRYmwY8^|_5$~V788<^HdTJHoNesm&N;4j2h|$FVJ6B^Gk*g1hj=PW!FvG$ZwqmHzTlbn_qLyQE~m(#5d`eKJmXCq z0Bdp?dyh9>5#|E<;E2yGL1);D!1(n@L-Ww|yn}U#V6B$q5o=+qo3-Xh#e zKeOpZySY>`RPX(LlatDBy-&<$%=CJV4KQ#0Edx=>IWB1rVAlkzZ@uL+WxuwHX6`1dZchvFY>jmo|9G zm-z>8UFmrhE{UhQ*)`FI9sO%fa)U|k zj+f|)1bx?u(>K2b5^2f5QT_B78G~=J1VaRkxu$m0GRRDm9yjQ-@3mVhSL(i8?^sJ# z&KygID|H+!Hcz`t-P$p`mB-&u{j6AU5x~KGME3D|qAqJX(*Op0T8lJeqqeY$Vf&#k z!*LuH(XP3r7nyRee7E%!`9lI*LR|c#?#;YY+mnOUfwWH_YGxb+(OiYZvWhF&MS(;d zMn{*iWaqHNd(6;F1rhqkQe3tAUsAtU#L3#77=?PwAs--FOLN@s zqG?gZ|3|)N(Fhh0CT5N9?%5z0Jw0SvaPcS^5jL6&AMCieLj0r(mC3)obe?u~^(3h-`n0;SZ7I9gF)-^NxUY*vXKi zIh~oc=39kAkC^^2SNJ*MOK}na3DX9uYoBXJv<_-o7ujUR{X_>Z5ID^CP18-ukZVXUjPxWwXMzegBG5k zi=jlxQ&hnOcjrFZtB2&|7VSG?tyQ@2jz(=BRrC+-H{F%wIDmW6oYJ*7(}U`5UkK|p zu$v9vhc8qJqy)9QUW0|(RdBiEgBYvFlhM!^0D|A?C_TAlgevJ!*Q#5I<+IB`AZe1x z){KFG2aarf+we+Y+(i!#DBc97DV1<8BZ1)0HQ6S6!=HH-ChZPeL6J21i{Pw1HIO!3 z%`@NB&^(>>Ln$w0xG+gaxqg$7o0HagXjY{qeGz`q2&<$3zyC_44FA{&d1W7_IDM1= zK0?JvQZuxKxFWuYcbm;HW&DJ7o8O-P=~kO=qI3qjnh&0A&J?F`oNa%!9Mi2tlg^YT zxm2G)V#M~|>qCYkq2HWLW-3i_Afwi=Nl9bN0vIkuCohAX{=E8XP}NUVolPFgT2dva zk;+{jNsaR2;Qfo-9m1=?Uy^?#DVFrB0c%{#t+|Oow`c5;au(0z zVXo$`n^pLYPP1;GtDXx?PR_abxH+j!dsK=jhAi6Bjv7cVr&wGo*WN@Ng1_CiBE60Z zyxg14pGb<%mQID|jbwt+7->BuX`=RsrSp?8lCNW-uS!!$rgZ=Kr^WN^s`&)jU`-0K zSh?E8X2mZ9`i1EdayFlsdvN>c*zks66~rKfKvfbgNvAaLH>^!4_>Gs1$X6U*w=j51 zgA$zh0+qqv%5Z8$wHgMz7oS!Y!$%}lKlZ;JyB@jyzu0=~peX;a?RyEO8>B-*IusBP za1rSgq&p;}OPXD}8!06OezbIhbV-Ydh{RG$E!_*t?t6LP^E@-}JMRp`F#N$R*X}pY z^Ei&riJk_Vl(I@}Ua0dIY=u|q32dDsH%C)ARQQC_GePp@O95k=5-T3}mw>4Vqy|4b znA8v|w$Iw&0WmtCI{6yG}7iW79NI~rFY373| z3Yxx`sQDZedx%)IaEv}vY_oMBWaLqK0jLg`;0;9dV>KGnS%UTPqOEwQQ@)Ym)CxMu zL`o~(*)az>BTPRigVPDGzfCVmZc;=Oaex>lTXw6PpeC=dbdqkAeF6@PJ?`E_W3H30 zuO8h|gpLrE*B>&sqn+-_6K&j$jzk{N^OjVo8R&R*1c!sGxGDNBzv1AKa>DC=JBc=l zBFzfu?Tb2OJ_I=1w0#yF3QnhsWc&1^!vv$C@HNvRtE}$ex6nIsoQye9(^i+qysHVW zZ@0A{AzBCMsWhfELxx4k>+xW}3~1wA3CzM!fX6Y!l-$~P-D z<2zbx8ufI65fQ(YAf7vynQOkguRTV}gRhspXQm`zd1HxJ$oJ1bc_~?#0oNfMZ9$(; z*$l&DKRp^Mg!x+^MS8~%ct>FoYQCfv84L8ZF)EnnYa%9~d^fJ4sjaE4?eHu&lJvP9 zn$xq#O)~FUC#zk5!&e1@Hjh5G3%M~M6Tp=Ap6}l#OAlz7))Rh>kDd|~4k*0Bjhs^$ zC|i~+%rTN*ev`0mHRPNaTjEHk;r9F88P~LAtM}Dq2}z7qXc6tL%qRB2^&-I`%!MiI zaofXF?}LyzaqwmK@nn@TMX*iK`GdO74NdUfZSPGk*<12j)}%`ghQ=(L-Tg27TJN4U zR#hc$sx zv|1MJ&I?iVYFr1@B3l~vfS(%p8r*m0gucv%_1G#m=pFa~jQ}zYi`Fl8=O%XiRFe1( zQSnoXSQ~F3N}*<2l?#AbGrFp3M-x4CgY2ZX`{9^Q9b+$)hFtVr9ZoO0Is( z{_p+90pnv+Dh52k|9m-_{)aq$U_ej|E&{r-VB3C~Ze*kudK`5$K!rmb=YMHreo=PU zqwQb_E_I65SNDOjykx6**f zrg!F?2a26q63E`K(LZOzL72wu?j3W(|u`#($w6mnXcNDZpi@KT{o?trB)a@q#$^WY3F!`YDX2!|3!fk^}_Z0HMH;!`oaJi&XTEG{?c zDvGQh1W2q&S=kgFk-ve9U+F5_cUteVQ|jtd!A@p7{K$nK1dZyw2X$`t2bbaRrgo#A z8WZEy9XkSG3Wk=z5(7UMQ()1G2~K#)E_`4LeU_`Cl;s`&iGPa_DPO54zwx5*j2jft zEcWKtW4b0zu5i)fyp}Td`1=2A+Xb!x{EaSHR_W&RZ#A&h<;d}0>huX%BTAdB=d!IC zkI=&40HnGw2R0TSt7O%sj{*=FQL z%(fherIFe$zCf=yvz${yfb6{>vkW*Ox(krGt<0ZV_;wEbPq9zQXJ=2J^`yeCyXV+@ zi>u@U2_E-{*CoA&`Z8=n#29=i6pb0?Je9z%LY?7uq19rd+1{#qDO zS$sknBoK41#3^FCqrXJej}(TU4O(^|qBm0t+mDm+Fc-=&vgFuEBFpBt%@Lat5-6pQ zA2Kyku{b_Y71-V1)N<#Aj1j2^vK1tbCyohDNy^~VWaJy6b*N`!=w?;+xgo*i!DC$H zI0Y3h(;sdN@Pef-6aiAeSi*t|xuHNciL%(XtDe-q>s0XOju#&eu0ejd!S3T1kp}6p zx#S`gLhVkY>ODcnhA(@xjT)B{y1{p|WbxUV@Ixd?HiT_l;nC4tjBvb#B!*&P{4}}z8Gbd1Rnb}xJNYJBjg_c zWna4E!87&TNhKB7c_^!}OhOR0=hrbgD}_yLYf?=WP6!3%bpWpVzi!Nk@FOCm4c3=$ z`h0)w*2VuKvx?i2iCPAZL*NptXj6AVaWw(Z_r50%ZU8g3KqX?+iys8GQ2>$!?fLy71WZ=U? z+%M0~Lzdhj3wV(A<4C*0Todn=-rJ5|<`(He{=EM>Yaxxkj}ettLe%QUii>P}U5iNF zaG`V#lmr89tVa9>*;`#cPsM)F&?9b^e>xlbJl;|$6LI+v-&niSQB&3B0TpPnc=l1K zLZme!OJNcJN$hqoC)H3NcT62PCr7SjJ#wG=mE$i!3AjH%a2xVGItzG6sP)Q|usj`; z=?>jXL9Z{JUCMudGUTe&Pcrdzpz`9a2jLJs`xX&0DWm6ezHpKvxxHwbTXhL{ay|RO zE(bAXK*DiNz(3z>p#-qa;1@Guvp+66}7GEJ$|@vq65Jvm;vg*VF&-GxJMGGX74cWz&`^dr^3IT=om)0#IS z1bb1gy%%lZ5Wf4Z8U`$4KH3RJz7PrVLjPd=u-C*X?CLL)R+8_N_Y3|TeDOcK9xEy{ z6CQNjUH9g@gwrJm|Cw9$%LU<l7~L-0^lW8e18V#V_=Q+?r4EPyG~ z>b4SCdohQ&OlEpH8CvOdKBp`*cHeo%7-D<0H*BpfJWn{~IyK^>pU#t4Ltt~lcTYWa zmIY6UEj4@TcRJiP4*-6C`punF!O@*zzq=$4Tnf}G94G{UBmBGodbTwda(&2w%~`du z5BDNSJ@~p|MK{ae6D|CTaA~**58HdJO1!J7>Mf|`;zvkRKLu35q(*VH z^uk^c%gO&Qno4tWmLWy_-zzJGUYxAo9W6O58bC#iEKDG`Yjd4$VmeGyJeBiFv8fI8r`**wV-Ir5g1Q*_U2d4j#A*J4rao_Zk*zWIMcu@FuA8o>3= z-KGc8v7%KcvFj^s?l~naa1kUs>X|bH{m$P(Yk9o^s75@I&dzwH)AfITo)6+HY?yx} zr%5^$)R9ujYl{CLlR$hB5+_CfWsvgG$>S%foQCLYRzBgN`Ni23JLB0r9ncz^|B16D z6`tk$(kri!>6vzCI9}cM=xvb|^F7sX4gPAtT=v zsL{-KqH3*|QBv^NK&=HupMp>0w3qMU!ZE^>eMM<6zQy({P*F`K2z?Xbm;i7lMm!V` zh|iwY8tghn_2eGMP#G#c_W*IcnHI`Sa#F41FW`IPPRshO{0ynh&s~W18aFe37)Wjd z8df~uQJ83kVbIs;-IRNOp=_MN%Wr^GHpfc*dCLAt#^Yk&4-Mvp>f>NON03E~uv2t} zg%#!PSm(ZigY(!|^)Qvl*$a7&yAhs+_cbT)lY@V-j<@1(2tJQc)BS zbCbdvaxklGL~UG*M^+7mfCb4(3Bp=d9(Pc*XKGvQy6OT^Af~HNOpuRHx+jq16E4frk|gA ztIdi!iFpYaa%g+b^N*WdgJ3-&`EJVLdVI9Nent`2{?>S3j}~Vv1({wC`}%t(2c_eq z5V~KHgmy7@2Yuf;Uuts|HdNcOLrcX3+gQ|Cch^OUmql+CS)rh3eU> zFr!62*A*R1xpslhJ#<^N5IL{|o=KdzGJ7s6>P%-M0Ijj8&T^JVTL+ZBwP>YLXU7(; z+ekrhXIW|(3z}s9wd!;<0FB$j|Cc{SQUHCV5eUmM$8>a~s?L zF;)avvLxfjS9cK*cS$;vtk*;AEO9v{?|*!%jSJZA2re?I{N>c5TlsOzw6z;3QHY2V zqOC!cw#^}*a8=@ifj&x5-4g$VF@!su=EOmv3;Xq&Ct6ua122fHW`XoryCB!Bg znMXaDV{o2GWfUcTdg~=6UMNhRpvcR?1^4R>G{itrGSY68v=fEhSGRz8yr!|sI@x>5 z*e01w1zT=)MPvysrQcS5b!QH-l;W=T_*&1JpdCRV3OtMr!*Rgda^~nrZOh-z6jOoO!|6!sMuV zsdgvMpq0DBK&#EWlb6xrx9>Z=q4dHusp>x+dD(_FHvLuMk3X4IRcUEyJv-^^xno|S z5dLJBdq*a-*Kt(ggJXfYmFU@^ktp=N&+$VgoZj^g+u-0u`hN5$$vGQeFhDP`7Wm%J zOy#5I!1qlJpCgHc+daIT*z@S|du|nlox~Vw460$rqru8gN%Wg&R;FJRxC9w1pFQ(p zbC4BBJUa7z>7KPE_c&ZcicDOSmDF`9EYe)s&pc#m9!PM`Rbb9Th3mTWw<4RIjC0m( z3U$CXGH6MwU@^KHT3292?!*H++0UOgz^4PtN?H6u9%{6^7>_lJejNHr12RHH{-?3D zD1neBPj|K=vqkCmj7io9;KW?_z*peNoa`_|H>wM*K&_zUH`LFO$Z#UxJc9cz7|P(N zHIWP@g@sGmo#CH1jYK(IjAMj)c6zyxiE?uvUQ4)6Gz&~zcK4A1WX~*peH|LELgA0< z@UQ8zndsv#zrq`NV(bUhO-Ib*X5s18 z#~C(+b|KfE*eDwK%#`~6Q)dz4lMsvAiGzJPaCdM?MR~8Di1vC;2*#->>4)D?Dk*?) zVsF|050-&0>G4q8zfS88s^3GTw_b$K(F&Ko&d{yR={&+_A=|t^dmv1ioncW3AD3NX zldhwul!0wr>OrU;*XK0RqIzf%BYzDbb)Yr|2CO7SGzJ0G*?Gv!dGL%U(^8|D=J91` zzQt&>fc-cxp{mM0CQX@T(GPRq`d;BScEatVvwM4JXu=(WJUB=s=gJrZ($Q+A#Z`o$ znGdf`pT*&Q9JsJ+C?<+euUXjdv=$H+{F5vSP``+8@6Bl~I9X0n(}fNhg&puLQ;}jS zdB6DHD2iEp3CL%53PlcXPHqdve`n`3GNPzQr0oldIJwKb;YSx$5?FIz89#znVa|$d!uQ4eW{EFb7}mX#}pjp+gAr22fGa=RtJB2Hg6Hv zz{bQQ(UVvxwa+R`-GiW>AbZ$B2DZ|6drzx&o|?Wlr8X*GkP~iC0zJ{g%yK+ z+k&`YLYVwZ;o`tGbjWBj3mCFN58KIMMR0!s&};|5nb2UQF)lpe)nMfG{L_43%Nw4m zj^O7RQ!0%D4vmX0LfQP;<3QHZ$;kyp@~)dw8l-Z7B$rD0z|B+Zy5S$N_3tj`{k_dKC?Md~oH+SssTy;0k+VU3ZqjEI z9NA2M`LE=@UEl**;oNWwyQkm%saA3mKl4))y~JD5!ee?zV|ToYC@U{-GDf~FyuASI z1{}FF9|4gJc?ZNW4)6HtO(2I{bxaS#n!ZsJlGp3d{f)Qgi~cOW@^xa%Gc^sz`1Gu* zq)MyE%HW;l!ykwbclSLne=$sr45qy7Y;1RwZbh`);0L!rF z=-}Ga85+t@M&J-{r=xiOI{#f~vf5cN^9vtG`#^iIz_Z|~LWjcM>Gq?}1)ke?uGl&m z00yhi-}hf+Y57c>1>Eqhk+@Gc(Kkd(m^fE4H${ID)*^d45-Jz^bsYPVu-D^g$@98m z@y{!Q#+KG!7WN*7K>^kHGSJ)ueMnXK?PkC{NT`6hL-GU2n%%d|?YLJB9IwQZGJ>&h)^L;|o0q+e zG*aImeY}=M;yJw{aSrqUq($uFKRS(UH`#D~%QC&OPCaC}ZNW`co^qdwqQjuK)Ip z`r%{V>hGCec1y{JNhSbrW&wag0ap_JXI@vIH7qsfj=r6Hzgi5C`xd{ zJSg%!@5Js!>07-IY|%+dkztVM2=xpUnd7?#N$c>;uV8(Tt4m;O9CbLp=&bp(4rd@%a5md?v5cIp>~boMmv@aq&Xh zMQaMjE$=^IVpcak{a*Xv{?pB$mk#T}%D8S_MAxO_6W#DP%{I4qsf0!cZ9cPDHlEEr~6!pB#>4VIAbfj_~@0^Ve z;*E+O>6n%RbL6g<(IAe;*r2|rD|q0`@9L|KewvYgt|AXM`mKQ4?7*?} z!uVH;tu#NsAS;`EdE+lZ;TV!vWoZEKY+x6mv|kejy+`rU>W zx-$Bn^EM4)(oOIIB4HV#J<}S!y7rAT?t(vL$u>Cp)$@l-ei|BD8^L3RJE_8>*8dmQ zL54?y-=Ok1WEm?5Gv>skyQN53Aze=3Cle*NO){cq&S6yLRT=-yJ^%3&vvMVjXpD zV(Bbny*Z0_egVqym~p-C-4YBUU?Qgw4a0u=Dj6S(sv&JI5mj%M{bBHzn7PXr->l0y zCqExoe0EtFBGZulTqGwackn4OyUnWK=)!>F2(Cz1+4&C#*5380g>Xmn``xHlGp4x* zF5I}U)|OgJt2&xed$KJ87k_T(R?penOL17XBf^=xeDx=2@`h2~Ea(3R144fY%loq~ zSnEicAFNGiC*Qo_zuNGlN^CEo#jwyWW~doJV0qGW-9 z3AExp&P1cK#_R$7N9rrNo;N(%fODdSov?B03r0V9Pz?JCwrPAaNcY_^UH^jz{`)-< z_oY~JY}0&;K0pwj`py0BgH zZCiT$26UmutnDlHY@bSwvrJeOSE=uM^)wWe@B}P+)Nu$nMtlTsKHlzSn@ClgJ+10= z^SQgvtz2GIg-z78pVfBt=vB`P_uLc%bCMNj(JOJL){W9x77ducN+ceVd zAtNM~^0I&y6&hhs{b3hq&%~tEHX8^mk!C2jtFKl3a3IJ3WGx^d#PrhtTEtYcl$ewd`*_vrq z$kpZC@wMiJO}N3qZj=x{<C;fT+Z%d6BsXunqRjJ`{uoO3^62uyYP zBVckt%+}7Xa&AxFr`~wHK3}4;WZx*gNMIM z#Kz_VJg?pbS1k=KO-){7JDh!tUhq;Y)=m1(yQJ8e;%?3#8bi2O_ju?-=UIfjFk~g+ zm)Fr*w#6-weg=U?y4%1PjmI5WY{e=s;xcsG8y~MKNDExgR6!m_gyG_1HOm*iq83rt z$*2CUv+nlu`W}G;;7S^H#Bf4wJ1p;hy_V>P-@e_8=`(3?AZ`wS%Rn6SSFT!*A4nMp zx37ig)CWw&kbKYP^;L0;Zl0z|sZypHHM%INmtnaKm;tc10F^uI{WH1AfD+SRS%iPR zrhiM4PX1>U!rtdd6l?6bKRjj~Frpt{fS3{%qAQaUmo?|j*6uX{*v9(`c;SFhv=!rWo)$%+AR#ZPD z%xPzupd&w1ufN!d`50a^R29kj*J0<5BooYP(BP*3I`H* ziZDMcUDxivV2h)|@3%q`x&NtP2H1%=D4sg_oGDc=7qb3pyX2Ra zGQcfKxh_D{0ZJV~jeo&ur-$T07uBYCEzDSB5f-oy%ZqFk z^Hq!rn3(~x0nsQPwud^7`K+6G*a0(#mL)v7l6{4k8$2vx6O$p1nbWI~{q<}pOdW)~ zuHG9C ztt&%gl_1lm=$}8&P-6kGYdSspNo`>n-D8$1e+%jd2^iI20&b<4U;+)cd3p_@!$Oll z4e>7GpJE}_);+M}d?93ZcJ|Kpjx5a1!?Rti<;1AOn`hHBjpR+9CxaceJ^530Riu89 zNXs{9;Az9RS=&C5OC%C$QP)dxfjIy;mCE?pPo7NwkVolK$OyM%GAyaWq7FA3gjxI# z67UKFQ13WNaoUet?@F?Dc4H{_h&X*i*#1Tr5DS%a}!7=ky-)`HTB>g{qFABVg}OAKajc!X^_8c4P5PhPMxSdWy_X-sP*a~d9GcLj@Luv##`K-^dfT1~tfU+j*0cdx&tKesl zi9FcW-SGF@;e}nMm8NVkGdGj!)jNJd%G!YxB<@*o4~EJTC#ELV8Rnr``>_jEnmzn% zC1^APvCqvS^KR_&nUGxTA#Q&BGvAov1NOm@P@mH7;sTJ`2!& z8dS?E?!Ik0zjg)Ozt_Q`0N$5@A5S!FkX#l@Q9uA+GtNZjA<9?Wt|BbD8i1T2g2}@pfp4vz41%# zJs|hw7OUd}^y>7d^5elw7pwsnKvl)sdyqa+8@QgSX0T`klqzR-rwNL(uP73W+2p7r zDGcf39!K!>NEV+IZ)Kk+!<^bQUOT+8Yu9sU9m6GM7uFdQvXGK20NbShXV1fD)XxFw z(|AyV@Jnu=3oztul|Hn23Vtenp9iqW4aCeH-l&?o`H-sBY7%QP{m@*K`#R$g>QOwu z0&OfcHV`lDb#eAyQjm4gCdU#8qx)_Q0Ik1!wXRhRYn7V|Y?YNeJomcY_L4GRz?zm; zlwc%%ub?_e>|cA`$IU`nM};NPeRfjZ*7Se&$)WvnaDQTIJsgboJ_gVc_Fn)nz*PBrNL zEu=7b3l8(M)djEr5C=f!9Bgv&35DJnJ;yieeyE9FRFl6SdW{T%p@p7i|32%zov-UT zSB7k@&1nx$ZGSBep5V82SKIk_$U)}xx~Pc1S&ivhRX*HnS1sOiNbHkYpPStQm>Z( zRzPOd>uwtiEqiN>DUwX=RVE*l=pVAWYMMVFeQ~H&YBI6o#rQk~fERSFJn@+3y-Z+M zb>Y(%cuG(T_Povr^m|v|dDS9JJ>o%n8BuMC8JK~r5rw0MvI`knTXdVKOY3-Oa{J=n z+Q`{V(-JvILDgpIET*SSjYYSKko0Ue3!8W^Pd!wy>405PTj^|cChX3w7Xybufv25z zsvS%-NJmT_d-Jut?!77WS^^q`IBX*@oFy@yzdA58?G{(IS?8;>9jPt#Vtt8d+LdpT_>?G*eTEchDZ(M@^N-#&Fwa9#EYNV^=}$(XhbkJql#sfR z6(XrX5}Xv)+k=v^3!295uU`EEOS<%dhanN&2RgHAJ|3^pFmo4UAe>5i^k}L6pR0&Q=eD*N*rvPp@hm%^Kq>nG;8h@B zgueb5-z-|lfhz>KHx$0S5i@YmW=jJPCtX9=aBQH|X)Ca6^mX@IJtKGlyVdL1%aFIj~6YbBYO za>VfkybDEbvOu7YAO%pq zKIpwD`z&1WUg#>i4c3N1yV{6@~Nqh~I{8LIO;D|(QoTgH`c#7e|Pj1kx)fOLBu z45#FsSaUFJqSJaf`$w<;EH$ojx2zlZviO9jYh45!b7Qq$mS9naFYT;SS@ zIt0Wj@fi{R=cDjzSqxfRhMM-1M9B4O8)n@zh~%xU1`y9GRp%LrjpLvU68 z1n#p?`IpeFISEgjNuI`&k0+k!n3os*H+PJ%lW5kE>lEyp>fXTPUSNZ6ujP;rxfx_d zAHvXwB>62BSO?rMs}Mu^|WI36dQ z<%fk1YbmA`&hM#nW<_A>*Hpfc5~*r&YLCA>*q)KEl;fn3bjai}QA+)YITd~a+!7YP zp`%ohSY~&fw8NAKy?4Ad;zovGsV>folI?Q`sSp@4*>BnJ7*NK6Z+AzoVxO(GNV~*= zgS~&2LwPg(+zwzjF#&x+al>AotE;WI+OB#3I)Ohc*h{xy3eD6|T_Zny){>iI-_#q$ zj~;!&~S z2;sE(qQ`IUdq3QO0`>V!FGCRC&G1wGN-+64XWn57mioDu5Y^+ z%wi(b&su9U5rkb2UT~WEuSY$_gqwGDr_IP(l99gSrq;Jd|{hp*TMgam|ugnBrl!*AJh)Z7miGF%{Q ztVltwKNS}es_*U3ht{<`rZ>1q^`A&GG$8EIKf{a6V~2T+ky`S5^bYbLou-s@aM#zmrj)SLBXXx+U18y(MGRQlJcHinw zXCPDdZ>0bVYmxPC=XwAO7H+!vrXDJSsAkL7;)QgF0s5cz#TGA`zpH2;oY6md(0(+c z0qf|<@PmD5+msw!|55K6N@x&JEb+Nbop>MzBCpo`hQ9cYO2PT_Ao8isamQCf#%|+b z{XQOWbKRA9bj z;T~i5kt(EZDdC)34oJdpJ18M4ROgy0{NHAR0RohwP9n@AB+02rAsS0gXODK8JswWo zRuaD_vmTUeM5*fat&U!WNsrw^Xjb+LyT=xW6?x3E>VH^TniqI(M?18eavby#pL(do z!$v&Oe`(-(>49`HB`FEX&Xk7aFHA5w7myiXllar0}lR2nmNGmjal`Q0&I7$sk%Q-}5aCO3XHH5j=F zPeCgDtenfXz1M58pLYcDY@M?g&+%iR2H+A_u@QH%{n*0vKfe-lj)UBAH@qr?-Qd8C zKjX-_@>>t1_lc0$fuzw}lEk4sp>yGSkEISZ$~-s5xqdV1OOQvDP$hlCDPY_Oa-b`*}MGX2iJZQ6dQhcNP0KQNi#4Mu+B`9!l(-S4DlW)dG z40w8RE6w=K1K>1NR2gA^;@PaSGT)w-JHx%Sk}mrE4wk?oUyac1iq^ncNIDb77IjNN zw)-g9#y|J#+C=W8l!m41_&2zqd*uS7D$;N-CRDd!NP|{! z(8wEZgDklWz$L|wE0RPixjT-g;u_~lF~iZPhQ`qB#+{6XJYB#iruVF^5S_pZ z6%89=5VQy4hmfrq@b+DQejCd1CJ|qnEqn%7dpeFey3wZF?LUlL*PP??f&?^uXVK>} zYvWc#M*-s5>*??GfU!?aYifrmKwp2M%)LVoa@_^p0@AL+J}cxc7GGJTPoi`ye^t!a zEd`lZ>fu(H@%sHe?6*>3o1dz7BaKjv9qb^NlLt-TE_>Q$L{)fRGnU8|S1*WY$zvF~$dg13dys2R)azYF(&>+Y*014uv=_ur*q z0a z%;_TrW>oxEfr#_ds{czS)#;beGpyS&Y&(GOa__DV&vC%N$?zuyDBwg;U5hMH1xO)|vxpV@3> z_!^ZWnhl0xt|7fEu3-cUU4F;43)P;t_B4RU_YqORV`%R(!$*@cry-=MQ(EF4H*fFO zM2mGvu{Muy0YO#O^t6_?828Nj-Q6e@#SO-sgJXDrY216ewt@D(*4CtQU2}__cAsrc zXG3L2Re7*`_W$+drllp`BfS}rr%(QtbShNDkA$%6ge1bsR5TdkR5!7vX@QX(ljFvt z-brRF8S{wVR&vwqX9TY5Us8a#0l!^Rt=$I{y;&e_M%p4l#@g)oNq#!>(WK7-i z(ck8hi>Y^xUN$yfHUnbBnxYy@A|w;u<`WG#(RpLvbH7&cIlU6xP5>q?>Hji9qog5; zL4xPD7|t6j&P&_XQ{i8Z)T@`G4(w3U7VECLhp}>#!8bpOWV6jp1Pl~zJCm38eDB$K zvem4rNS}E5>dag>+rV^vUXh)1KmMJPYI*gHtHj`$lVa02h=PU)350c(N<10hP_1KO z<#~O1wB#}6z!RYoV|U0J&N1}53+5{A%fw#GE%fKZdg1+Eq3i0|j@TLe-SFco>Uc!v zyXM&&7IJC8E9R)Tq;PY}urISVVGQ8WeY<3}rxC+rYQP|tV;(s@Hpzk+ zw!9HH8)%lXuKOaSaE06K_%HN7aWRHW8zcKBBh)bNvvZql5237hRpju3TF1qTdkCU5 z+l;bBRrw4^rdI;_MHg*@7Wt;X62<2^qc>KlpP${PRem0?TyZU3+pNs~33OBNy-P!- zd0B0Lo+J);`;?$9(}3v>uXkQB_k+fTYE_2-KXmT{MCV8MLA6cI%fQ&&WJI{} zMVNqolirGsfW)Rh{eq6bJTGrS-Usihw{H%^H+XTMiLLzjXG|8CdM`D7e|NQ*H8nKv z^kJdaTsfKPA;r@eoTJpMqm?^>z0bnbXHoKbP|!x`t4(iqy3?DSleef2%kv=FooVf; z+aeEExAm2q6HA?%TmVH@c!fevijEFQ@ZXCE!(;F~`F??FEen;`Ujn;dN{Jf_WO|su zp`^#|&p(?>Ku35~CzZLdPp;Z}4+n_+?tw<-P1rr&K!E)uGWck|4sr>!d)CLs?3w1u z_@P=Hmj8EN6TvVQh|rQUk%V_Nld|SKXc1}nPmzRzn*J8l*A`xec24fphsDP%uafN4wBh@ zaWx|8w)1v@B;Rb_GX{{5n{$xo;I|ept|w=F4|MAP`Z39=zXE&r z8W{W4Vj?)&YKwm7J@DZh6?ckvUeBbo-+{(|TMIK_&YEdC#CGAhV6QaY#bJnLsm^;& z#j_@Kc`v`Vmc2VVOFww2(PyRJ<=-&h^T<-gbUS?=J$=EgGo<{w@!1YQoJy=ee)Pzx zc1QN|*V~{gvoan&IiS(Oe;W%-30raV>oO z!k0M#@EjW#Ie8nP3mrjF=xsUh1-UIB3>y3Gl3v)i>@%m%5`^-c5COh70O%LlpsRz` zZs`}@Li8wsv0f}B#~r%KOs7^w>zT=D0LuPmH7P~YC9ubJDTa*osb<8VLSz4S8KcMw zXR6j!P6NHJFAYZcYxBYKdPl9?Lay3o#9yRlzgg`7u5rz!>FN%LY?x;rM+_OFlhn%h zs3^U)KAu%o^mbxxxEB3ujBD;15w(1@7-!#cB5>ySiMH*D5LR049{-`iBp5w;I$S!O z)3p;n0lmS4I@X}^BKiS>(eqz&pams2f>=D)K3;(x%Od>~)d07*4P1M*up7k(%CaK? zJS-j}Oimj=Ha(Kz{^+q(J%LBVP7%Q`d-+0GLoQ~Qj@t)+UAElv0)NsxU|v%=WbERX zp6)kDFAQ-VjWg9cS(gFksxsgMY(f?_fV1}e>|PVOLAZ2>P)g!SP^h1ct#^Dmav$&M ziS@?JG~XduU*EZ<>OEcJWPNjsq>CMPp~_?~`5ec_nK%REf4IucwiFB$ksw^$4Uk2+ zjw5lEX&+m$N$EqaaZQ~fjLR9nTB}KQoTv(3i|d0X!8@(Vl=0j&2)@El)8)^sKwds9 z$;t%%Gt;QsFP)m--E))#plf*i>yL_xut{ZlFy4NUBe+Db8EKm{H+J*7hqb50oKL9W z@P2mo9Xu;G6C^SR@DsvtL=?v;R4jUbHBy&6&-v;^1)8s-!M+Sy;TaAXO=gDcBKKb7 zVI2T(IsFv4g$!kT?Fu^rd%G|rHA7CSF{L+#m>>2>*SBTwpN#2H2z2UNqX{JGNb!J~ z7j^-_&_4;rDfw4_EKd4x$e5%9e~I}#3L7~iV~lQSZ~x&UW-w-11C-lUo9)rHd(qap zWru&04{r|(%TgFAzeec6FbV+x}&>-C@B_JgrjnXYGCM7rw%CW}m%RT!HffzZiU`-gjsL1B zfhAmv=%=&Uv?Qd1t9&Ug{=6G2w4mf1H%NoA>B+a&Z;N~9X|!oq8;jg5dR|kEQE}ASo7|4>%U|{R#2lAaPd>l}Vw=lmxvF)g!U1jW7h>sqKM-AL=n3U> z0J?7WXSHsW0H(%oK99lUyUk6*fs+{O^U8_)w3B>Sbh~lz?H3wBhpEbUFD*<=pXYro zrV8lsZn3gBG|bB6Ok#+-`}niYyP2zn2*{+cp9EP+idjtLm>Eq59=7;-c<4-=`L<9= z{#4cPyWSzW21ZYy8za0Lxlj-0Ne2dT0GDijIcw`^kB*FujEn)$a9n#F=&dyQpx(AD z+vr{5ad0uRu5*0RdzgPsz3aVzvNH+wUHXQ4wUG9Qdlbb40OXWEZ6Wq2F7T@G2zw%;6HHjF+_-GO z#<8`~H+NSl+VENZb66% zL#0+eA-R%Z=9XqSYYR&U4ars|5S%3q@}6l;Y;Ck6?UM=x8D2<<3r!G zzo~W&cCTggN=cXsg|-GI@G&47=tAYoJ90-$dgYsPKt*P8@@<@J6|t7%(AkqFtq(x;u-~2O8bN|yq0f7 zt}mW$c2%MH%xNH1%YQo#Wxp|aQiBtq9VRZWQOnN|6k6CI()cGwbgJd%zc`20EdCA% zom*C+dMT1G1KK_z5$3@zj$fXZo4C}gRakmXyH4!_^R`TLLnsj2a={@6@`=8?a@Ydz z5ilW&-pr!ce_h#4x&EAn9Z6j*4mIgi4TE{}=iHbdTqeh3@^^CswJM^5pr=~{0lFu1 zBF0xNafyX95#i6^iZx1W&ry8o&1FTXXPUQ$>A(69Fb z8*=E%)xsS2)-jTyWsDb?{`$7?I^Su|H)V((F$76BGUr`ifTS72>Eb*iRTu+aetGy( zqpI106~o!ZF<^L~PjRIc>CKrwylpX4&o`W9UoN#X?9$(8ze3jHDV&al2dcqR@oDeh zl#Hjy+v2$0)rkWgPfnig?|)^FGGK~xmSSAK-E83?B{gHnG2OSoB28VFqS;>r3ZG-) zs5+ohHjQy6=;+As@+>l6&S#y|O_`V-oMwyRL#p~fzl(tS{GHoeT83L(0P#0Bjgs@P z_6lZ&?8BLZTyce+pfqw-Wp?$qAoUb1FyHS(+tb8!pI!N*{sQ8AV-GfA73=FpE=RrA}N1ENvrTZu_P}0uBX7 zJ3c{uhBugx9EmNBSUY|KolQ1E@c6loiwCoqh8quhf1ilZ73vGLM1S5QdG!bJ%C66& z!mOtfbqaF91&#k@51a{rYs=Ozs`DqZz69CF_93E*i#brZ(7WpayBdq(;b@z8KOC}D z#QmN~=4*+Y=qDQa%o?$!ubJ?b6nWza}4lz?%VV;GdF$q>=|`<_XPsE ztw3TFWR% znBLy24Jy!xwNw(@M%lG6?Z~;k^siC&<{jfYqY5LSEFJ#%e%J|1Q?@3u9rBP{ctY6>|06`60oIUx$~`hVN`-mkm3o%kzYcINNzbPH z9bbsi``YDLiW!XW>wFuA>u@Yr|Soc^5y|Mc6w!7O?P>)8>PD9_t_!#Eg8Zw}w z!AxMr)kwN89NY!*WsPW9BZ}M;>Jn#7vN^9{2QTYl_XwRdL0?v;sLy5@qMlV)KFHdu zr?)Q{0)@@iT)X$s(O0gMw{*WsbXIu(?t1ub>7>?Y{#5)f|`y1Y{`S!F&OAU zsrx}nNu|kc8vDUqhNkaSBS~P5q|Uowc*fEFd(pK4%rzsZ8@3LwgLo26impGbi@$OvpSDfWP|(U|`0Uq35*vNIghbK0%PMeH&rrso z!g%-mS=}#2X*SL-`!l;7Ymb1GP&&%^XFGek45C|rL?6Rd{vj6c>QP-Kdcc|F3B7WR~mf#5bPaq-E(^Z3mPU|@zQF}X4lAi zj#Hx_NV{`cXi;Q$4>!WH(XLpO27VbNadG4;lc5>4@k69#pEg4Hc8vh6UPVX*G+gVQ zP@sLw_F2heT;6-N(kAQA(mU}4;|H5=0X$P3k?yK!It zv+->o1hioa_@8;cEmJT2aC*Yl(?Ft_;Y1>KHO{PLbqDq$F9vL1LfMc9*MZMp!1ai3 ze%&_}g1)8>*T4oV%}c1y-ZFU=s6!{y~|S;WBvn7sirVrzaWhRjO&)k zYZ^h6J_BmRF+<<`)>Blu&#W-4!;^(?Z*!M&ZD?j6YaXdBRM<;fSvaZ{Sq?k?mfxz~ zWFB3iL#{UQ7WjhQwXmY!2W%Z2#-=##Qr}yBj>A?d((cYh?yDS46!U0+u1Nq>h{%AJ zQkc!e9A)3F!|B$~2nKT6uNPDI@Ir~$YzcZ|6O7pNVL{OmHXSQYDRvi+Z6StS2A^dx z}n;ni4TkPR~9YVapN`G@7DhWhfVJYPISAD&mR71qHSFqQea5{BU*jJkICBc6hd(Q6xBgx@{aKJW zI+IE+(mLRzV@p?Ig~(RJ6Jn#J?f>if)j`{p%urc>moe#bi{R0N?OaE8@;EHJ{jO03 z{_DrAoZ2TaTdL`!!sEv${x*>XJEW_LeANS7tn+fuqqPUP`5f3Qy&KL

3E)CQnC_ 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 literal 15895 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 z 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 z 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