igv 2.15.3 → 2.15.5

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/igv.js CHANGED
@@ -18584,6 +18584,7 @@
18584
18584
  });
18585
18585
  this.RANGE_WARNING_GIVEN = false;
18586
18586
  this.oauth = new Oauth();
18587
+ this.contentLengthMap = new Map();
18587
18588
  }
18588
18589
 
18589
18590
  setApiKey(key) {
@@ -18661,6 +18662,18 @@
18661
18662
  }
18662
18663
  }
18663
18664
 
18665
+ async getContentLength(url, options) {
18666
+ if (!this.contentLengthMap.has(url)) {
18667
+ options = options || {};
18668
+ options.method = 'HEAD';
18669
+ options.GET_CONTENT_LENGTH = true;
18670
+ const contentLengthString = await this._loadURL(url, options);
18671
+ const contentLength = contentLengthString ? Number.parseInt(contentLengthString) : -1;
18672
+ this.contentLengthMap.set(url, contentLength);
18673
+ }
18674
+ return this.contentLengthMap.get(url)
18675
+ }
18676
+
18664
18677
  async _loadURL(url, options) {
18665
18678
 
18666
18679
  const self = this;
@@ -18675,6 +18688,11 @@
18675
18688
  oauthToken = await (typeof oauthToken === 'function' ? oauthToken() : oauthToken);
18676
18689
  }
18677
18690
 
18691
+ let contentLength = -1;
18692
+ if (options.range && !isAmazonV4Signed(url) && !isGoogleStorageSigned(url)) {
18693
+ contentLength = await this.getContentLength(url);
18694
+ }
18695
+
18678
18696
  return new Promise(function (resolve, reject) {
18679
18697
 
18680
18698
  // Various Google tansformations
@@ -18700,13 +18718,6 @@
18700
18718
  }
18701
18719
  const range = options.range;
18702
18720
 
18703
- // const isChrome = navigator.userAgent.indexOf('Chrome') > -1
18704
- // const isSafari = navigator.vendor.indexOf("Apple") === 0 && /\sSafari\//.test(navigator.userAgent)
18705
- // if (range && isChrome && !isAmazonV4Signed(url) && !isGoogleStorageSigned(url)) {
18706
- // // Hack to prevent caching for byte-ranges. Attempt to fix net:err-cache errors in Chrome
18707
- // url += url.includes("?") ? "&" : "?"
18708
- // url += "someRandomSeed=" + Math.random().toString(36)
18709
- // }
18710
18721
 
18711
18722
  const xhr = new XMLHttpRequest();
18712
18723
  const sendData = options.sendData || options.body;
@@ -18722,7 +18733,13 @@
18722
18733
  }
18723
18734
 
18724
18735
  if (range) {
18725
- var rangeEnd = range.size ? range.start + range.size - 1 : "";
18736
+ let rangeEnd = "";
18737
+ if (range.size) {
18738
+ rangeEnd = range.start + range.size - 1;
18739
+ if (contentLength > 0) {
18740
+ rangeEnd = Math.min(rangeEnd, contentLength - 1);
18741
+ }
18742
+ }
18726
18743
  xhr.setRequestHeader("Range", "bytes=" + range.start + "-" + rangeEnd);
18727
18744
  // xhr.setRequestHeader("Cache-Control", "no-cache"); <= This can cause CORS issues, disabled for now
18728
18745
  }
@@ -18748,6 +18765,11 @@
18748
18765
  }
18749
18766
 
18750
18767
  xhr.onload = async function (event) {
18768
+
18769
+ if (options.GET_CONTENT_LENGTH) {
18770
+ resolve(xhr.getResponseHeader('content-length'));
18771
+ }
18772
+
18751
18773
  // when the url points to a local file, the status is 0 but that is not an error
18752
18774
  if (xhr.status === 0 || (xhr.status >= 200 && xhr.status <= 300)) {
18753
18775
  if (range && xhr.status !== 206 && range.start !== 0) {
@@ -18780,6 +18802,7 @@
18780
18802
  }
18781
18803
  };
18782
18804
 
18805
+
18783
18806
  xhr.onerror = function (event) {
18784
18807
  if (isGoogleURL(url) && !options.retries) {
18785
18808
  tryGoogleAuth();
@@ -18911,7 +18934,6 @@
18911
18934
  }
18912
18935
 
18913
18936
 
18914
-
18915
18937
  /**
18916
18938
  * Return a Google oAuth token, triggering a sign in if required. This method should not be called until we know
18917
18939
  * a token is required, that is until we've tried the url and received a 401, 403, or 404.
@@ -19070,6 +19092,11 @@
19070
19092
  }
19071
19093
  }
19072
19094
 
19095
+ function isAmazonV4Signed(url) {
19096
+ return url.indexOf("X-Amz-Signature") > -1
19097
+ }
19098
+
19099
+
19073
19100
  const igvxhr = new IGVXhr();
19074
19101
 
19075
19102
  /*
@@ -23950,7 +23977,7 @@
23950
23977
  }
23951
23978
  };
23952
23979
 
23953
- const _version = "2.15.3";
23980
+ const _version = "2.15.5";
23954
23981
  function version() {
23955
23982
  return _version
23956
23983
  }
@@ -24002,7 +24029,7 @@
24002
24029
 
24003
24030
  // Delay loading cytbands untils after genome initialization to use chromosome aliases (1 vs chr1, etc).
24004
24031
  if (cytobandUrl) {
24005
- genome.cytobands = await loadCytobands(cytobandUrl, sequence.config, genome);
24032
+ genome.cytobands = await loadCytobands(cytobandUrl, sequence.config, genome);
24006
24033
  }
24007
24034
 
24008
24035
  return genome
@@ -24104,7 +24131,7 @@
24104
24131
  this.sequence = sequence;
24105
24132
  this.chromosomeNames = sequence.chromosomeNames;
24106
24133
  this.chromosomes = sequence.chromosomes; // An object (functions as a dictionary)
24107
- this.featureDB = {}; // Hash of name -> feature, used for search function.
24134
+ this.featureDB = new Map(); // Hash of name -> feature, used for search function.
24108
24135
 
24109
24136
  this.wholeGenomeView = config.wholeGenomeView === undefined || config.wholeGenomeView;
24110
24137
  if (this.wholeGenomeView && Object.keys(sequence.chromosomes).length > 1) {
@@ -24308,6 +24335,40 @@
24308
24335
  chr = this.getChromosomeName(chr);
24309
24336
  return this.sequence.getSequence(chr, start, end)
24310
24337
  }
24338
+
24339
+ addFeaturesToDB(featureList, config) {
24340
+
24341
+ const insertFeature = (name, feature) => {
24342
+ const current = this.featureDB.get(name);
24343
+ if (current) {
24344
+ feature = (feature.end - feature.start) > (current.end - current.start) ? feature : current;
24345
+
24346
+ }
24347
+ this.featureDB.set(name, feature);
24348
+ };
24349
+
24350
+ for (let feature of featureList) {
24351
+ if (feature.name) {
24352
+ insertFeature(feature.name.toUpperCase(), feature);
24353
+ }
24354
+ if (feature.gene && feature.gene.name) {
24355
+ insertFeature(feature.gene.name.toUpperCase(), feature);
24356
+ }
24357
+
24358
+ if (config.searchableFields) {
24359
+ for (let f of config.searchableFields) {
24360
+ const value = feature.getAttributeValue(f);
24361
+ if (value) {
24362
+ if (value.indexOf(" ") > 0) {
24363
+ insertFeature(value.replaceAll(" ", "+").toUpperCase(), feature);
24364
+ } else {
24365
+ insertFeature(value.toUpperCase(), feature);
24366
+ }
24367
+ }
24368
+ }
24369
+ }
24370
+ }
24371
+ }
24311
24372
  }
24312
24373
 
24313
24374
  async function loadCytobands(cytobandUrl, config, genome) {
@@ -27035,8 +27096,6 @@
27035
27096
  * THE SOFTWARE.
27036
27097
  */
27037
27098
 
27038
- const DEFAULT_COLOR$1 = 'rgb(150,150,150)';
27039
-
27040
27099
  const fixColor = (colorString) => {
27041
27100
  if (isString$2(colorString)) {
27042
27101
  return (colorString.indexOf(",") > 0 && !(colorString.startsWith("rgb(") || colorString.startsWith("rgba("))) ?
@@ -27055,6 +27114,15 @@
27055
27114
  */
27056
27115
  class TrackBase {
27057
27116
 
27117
+ static defaults = {
27118
+ height: 50,
27119
+ color: 'rgb(0, 0, 150)',
27120
+ altColor: 'rgb(0, 0, 150)',
27121
+ autoHeight: false,
27122
+ visibilityWindow: undefined,
27123
+ supportHiDPI: true
27124
+ }
27125
+
27058
27126
  constructor(config, browser) {
27059
27127
  this.browser = browser;
27060
27128
  this.init(config);
@@ -27068,15 +27136,25 @@
27068
27136
  */
27069
27137
  init(config) {
27070
27138
 
27139
+ this.config = config;
27140
+
27071
27141
  if (config.displayMode) {
27072
27142
  config.displayMode = config.displayMode.toUpperCase();
27073
27143
  }
27074
27144
 
27075
- this.config = config;
27076
- this.url = config.url;
27077
- this.type = config.type;
27078
-
27079
- this.supportHiDPI = config.supportHiDPI === undefined ? true : config.supportHiDPI;
27145
+ // Set default properties
27146
+ const defaults = Object.assign({}, TrackBase.defaults);
27147
+ if(this.constructor.defaults) {
27148
+ for(let key of Object.keys(this.constructor.defaults)) {
27149
+ defaults[key] = this.constructor.defaults[key];
27150
+ }
27151
+ }
27152
+ for(let key of Object.keys(defaults)) {
27153
+ this[key] = config.hasOwnProperty(key) ? config[key] : defaults[key];
27154
+ if(key === 'color' || key === 'altColor') {
27155
+ this[key] = fixColor(this[key]);
27156
+ }
27157
+ }
27080
27158
 
27081
27159
  if (config.name || config.label) {
27082
27160
  this.name = config.name || config.label;
@@ -27086,29 +27164,15 @@
27086
27164
  this.name = getFilename$2(config.url);
27087
27165
  }
27088
27166
 
27167
+ this.url = config.url;
27168
+ if(this.config.type) this.type = this.config.type;
27089
27169
  this.id = this.config.id === undefined ? this.name : this.config.id;
27090
-
27091
27170
  this.order = config.order;
27092
-
27093
- if (config.color) this.color = fixColor(config.color);
27094
- if (config.altColor) this.altColor = fixColor(config.altColor);
27095
- if ("civic-ws" === config.sourceType) { // Ugly proxy for specialized track type
27096
- this.defaultColor = "rgb(155,20,20)";
27097
- } else {
27098
- this.defaultColor = "rgb(0,0,150)";
27099
- }
27100
-
27101
27171
  this.autoscaleGroup = config.autoscaleGroup;
27102
-
27103
27172
  this.removable = config.removable === undefined ? true : config.removable; // Defaults to true
27104
-
27105
- this.height = config.height || 100;
27106
- this.autoHeight = config.autoHeight;
27107
27173
  this.minHeight = config.minHeight || Math.min(25, this.height);
27108
27174
  this.maxHeight = config.maxHeight || Math.max(1000, this.height);
27109
27175
 
27110
- this.visibilityWindow = config.visibilityWindow;
27111
-
27112
27176
  if (config.onclick) {
27113
27177
  this.onclick = config.onclick;
27114
27178
  config.onclick = undefined; // functions cannot be saved in sessions, clear it here.
@@ -27165,17 +27229,18 @@
27165
27229
  }
27166
27230
 
27167
27231
  /**
27168
- * Default implementation -- update config with current values.
27169
- * to create session object for bookmarking, sharing. Updates the track "config" object to reflect the
27170
- * current state. Only simple properties (string, number, boolean) are updated.
27232
+ * Used to create session object for bookmarking, sharing. Only simple property values (string, number, boolean)
27233
+ * are saved.
27171
27234
  */
27172
27235
  getState() {
27173
27236
 
27237
+ const jsonable = (v) => !(v === undefined || typeof v === 'function' || v instanceof File || v instanceof Promise);
27238
+
27174
27239
  // Create copy of config, minus transient properties (convention is name starts with '_'). Also, all
27175
27240
  // function properties are transient as they cannot be saved in json
27176
27241
  const state = {};
27177
27242
  for (let key of Object.keys(this.config)) {
27178
- if (!key.startsWith("_") && typeof this.config[key] !== "function" && this.config[key] !== undefined) {
27243
+ if (!key.startsWith("_") && jsonable(this.config[key])) {
27179
27244
  state[key] = this.config[key];
27180
27245
  }
27181
27246
  }
@@ -27189,8 +27254,18 @@
27189
27254
  }
27190
27255
  }
27191
27256
 
27192
- if (this.color) state.color = this.color;
27193
- if (this.altColor) state.altColor = this.altColor;
27257
+ // If user has changed other properties from defaults update state.
27258
+ const defs = TrackBase.defaults;
27259
+ if (this.constructor.defaults) {
27260
+ for (let key of Object.keys(this.constructor.defaults)) {
27261
+ defs[key] = this.constructor.defaults[key];
27262
+ }
27263
+ }
27264
+ for (let key of Object.keys(defs)) {
27265
+ if (undefined !== this[key] && defs[key] !== this[key]) {
27266
+ state[key] = this[key];
27267
+ }
27268
+ }
27194
27269
 
27195
27270
  // Flatten dataRange if present
27196
27271
  if (!this.autoscale && this.dataRange) {
@@ -27198,22 +27273,6 @@
27198
27273
  state.max = this.dataRange.max;
27199
27274
  }
27200
27275
 
27201
-
27202
- // Check for non-json-if-yable properties. Perhaps we should test what can be saved.
27203
- for (let key of Object.keys(state)) {
27204
- const value = state[key];
27205
- if (typeof value === 'function') {
27206
- throw Error(`Property '${key}' of track '${this.name} is a function. Functions cannot be saved in sessions.`)
27207
- }
27208
- if (value instanceof File) { // Test specifically for File. Other types of File-like objects might be savable
27209
- const str = `Track ${this.name} is a local file. Sessions cannot be saved with local file references.`;
27210
- throw Error(str)
27211
- }
27212
- if (value instanceof Promise) {
27213
- throw Error(`Property '${key}' of track '${this.name} is a Promise. Promises cannot be saved in sessions.`)
27214
- }
27215
- }
27216
-
27217
27276
  return state
27218
27277
  }
27219
27278
 
@@ -27509,7 +27568,7 @@
27509
27568
  * @returns {*|string|string}
27510
27569
  */
27511
27570
  getColorForFeature(f) {
27512
- return (typeof this.color === "function") ? this.color(feature) : this.color || DEFAULT_COLOR$1
27571
+ return (typeof this.color === "function") ? this.color(feature) : this.color
27513
27572
  }
27514
27573
 
27515
27574
  /**
@@ -30253,7 +30312,8 @@
30253
30312
  this.config = config || {};
30254
30313
  this.genome = genome;
30255
30314
  this.indexURL = config.indexURL;
30256
- this.indexed = config.indexed;
30315
+ this.indexed = config.indexed || this.indexURL !== undefined;
30316
+ this.queryable = this.indexed;
30257
30317
 
30258
30318
  if (isFile(this.config.url)) {
30259
30319
  this.filename = this.config.url.name;
@@ -31913,6 +31973,7 @@
31913
31973
 
31914
31974
  const queryableFormats = new Set(["bigwig", "bw", "bigbed", "bb", "biginteract", "biggenepred", "bignarrowpeak", "tdf"]);
31915
31975
 
31976
+ this.queryable = config.indexURL || config.queryable === true; // False by default, unless explicitly set
31916
31977
  if (config.reader) {
31917
31978
  // Explicit reader implementation
31918
31979
  this.reader = config.reader;
@@ -31946,6 +32007,11 @@
31946
32007
  this.queryable = true;
31947
32008
  } else ;
31948
32009
  }
32010
+
32011
+ // Set searchable unless explicitly turned off, or track uses in indexed or otherwise queryable
32012
+ // feature source. queryable => features loaded on demand (by query)
32013
+ this.searchable = config.searchable === true || config.searchableFields || (config.searchable !== false && !this.queryable);
32014
+
31949
32015
  }
31950
32016
 
31951
32017
  async defaultVisibilityWindow() {
@@ -32005,6 +32071,7 @@
32005
32071
  // * view is "whole genome" but no features are loaded
32006
32072
  // * cache is disabled
32007
32073
  // * cache does not contain requested range
32074
+ // const containsRange = this.featureCache.containsRange(new GenomicInterval(queryChr, start, end))
32008
32075
  if ((isWholeGenome && !this.wgFeatures && this.supportsWholeGenome()) ||
32009
32076
  this.config.disableCache ||
32010
32077
  !this.featureCache ||
@@ -32086,39 +32153,13 @@
32086
32153
  this.featureCache = new FeatureCache$1(features, this.genome, genomicInterval);
32087
32154
 
32088
32155
  // If track is marked "searchable"< cache features by name -- use this with caution, memory intensive
32089
- if (this.config.searchable || this.config.searchableFields) {
32090
- this.addFeaturesToDB(features);
32156
+ if (this.searchable) {
32157
+ this.genome.addFeaturesToDB(features, this.config);
32091
32158
  }
32092
32159
  } else {
32093
32160
  this.featureCache = new FeatureCache$1([], genomicInterval); // Empty cache
32094
32161
  }
32095
32162
  }
32096
-
32097
- addFeaturesToDB(featureList) {
32098
- for (let feature of featureList) {
32099
- if (feature.name) {
32100
- this.genome.featureDB[feature.name.toUpperCase()] = feature;
32101
- }
32102
- if (feature.gene && feature.gene.name) {
32103
- this.genome.featureDB[feature.gene.name.toUpperCase()] = feature;
32104
- }
32105
-
32106
- if (this.config.searchableFields) {
32107
- for (let f of this.config.searchableFields) {
32108
- const value = feature.getAttributeValue(f);
32109
- if (value) {
32110
- if (value.indexOf(" ") > 0) {
32111
- this.genome.featureDB[value.replaceAll(" ", "+").toUpperCase()] = feature;
32112
- this.genome.featureDB[value.replaceAll(" ", "%20").toUpperCase()] = feature;
32113
- } else {
32114
- this.genome.featureDB[value.toUpperCase()] = feature;
32115
- }
32116
- }
32117
- }
32118
- }
32119
- }
32120
- }
32121
-
32122
32163
  }
32123
32164
 
32124
32165
  /*
@@ -32934,7 +32975,8 @@
32934
32975
 
32935
32976
  const binaryParser = new BinaryParser(data);
32936
32977
  const chromId = binaryParser.getInt();
32937
- let chromStart = binaryParser.getInt();
32978
+ const blockStart = binaryParser.getInt();
32979
+ let chromStart = blockStart;
32938
32980
  let chromEnd = binaryParser.getInt();
32939
32981
  const itemStep = binaryParser.getInt();
32940
32982
  const itemSpan = binaryParser.getInt();
@@ -32944,6 +32986,7 @@
32944
32986
 
32945
32987
  if (chromId >= chrIdx1 && chromId <= chrIdx2) {
32946
32988
 
32989
+ let idx = 0;
32947
32990
  while (itemCount-- > 0) {
32948
32991
  let value;
32949
32992
  switch (type) {
@@ -32959,8 +33002,9 @@
32959
33002
  break
32960
33003
  case 3: // Fixed step
32961
33004
  value = binaryParser.getFloat();
33005
+ chromStart = blockStart + idx * itemStep;
32962
33006
  chromEnd = chromStart + itemSpan;
32963
- chromStart += itemStep;
33007
+ idx++;
32964
33008
  break
32965
33009
  }
32966
33010
 
@@ -32970,8 +33014,8 @@
32970
33014
  if (Number.isFinite(value)) {
32971
33015
  const chr = chrDict[chromId];
32972
33016
  featureArray.push({chr: chr, start: chromStart, end: chromEnd, value: value});
32973
-
32974
33017
  }
33018
+
32975
33019
  }
32976
33020
  }
32977
33021
  }
@@ -33107,6 +33151,7 @@
33107
33151
  this.genome = genome;
33108
33152
  this.format = config.format || "bigwig";
33109
33153
  this.wgValues = {};
33154
+ this.queryable = true;
33110
33155
  }
33111
33156
 
33112
33157
  async getFeatures({chr, start, end, bpPerPixel, windowFunction}) {
@@ -33648,6 +33693,7 @@
33648
33693
  this.genome = genome;
33649
33694
  this.windowFunction = config.windowFunction || "mean";
33650
33695
  this.reader = new TDFReader(config, genome);
33696
+ this.queryable = true;
33651
33697
  }
33652
33698
 
33653
33699
  async getFeatures({chr, start, end, bpPerPixel}) {
@@ -33857,8 +33903,8 @@
33857
33903
  this.config = config;
33858
33904
  this.genome = genome;
33859
33905
  this.queryable = false;
33906
+ this.searchable = config.searchable !== false; // searchable by default
33860
33907
  this.updateFeatures(config.features);
33861
-
33862
33908
  }
33863
33909
 
33864
33910
  updateFeatures(features) {
@@ -33868,6 +33914,10 @@
33868
33914
  mapProperties(features, this.config.mappings);
33869
33915
  }
33870
33916
  this.featureCache = new FeatureCache$1(features, this.genome);
33917
+
33918
+ if (this.searchable || this.config.searchableFields) {
33919
+ this.genome.addFeaturesToDB(features, this.config);
33920
+ }
33871
33921
  }
33872
33922
 
33873
33923
  /**
@@ -40061,8 +40111,8 @@
40061
40111
 
40062
40112
  // Set ctx color to a known valid color. If getColorForFeature returns an invalid color string it is ignored, and
40063
40113
  // this default will be used.
40064
- ctx.fillStyle = this.defaultColor;
40065
- ctx.strokeStyle = this.defaultColor;
40114
+ ctx.fillStyle = this.color;
40115
+ ctx.strokeStyle = this.color;
40066
40116
 
40067
40117
  const color = this.getColorForFeature(feature);
40068
40118
  ctx.fillStyle = color;
@@ -40386,6 +40436,17 @@
40386
40436
 
40387
40437
  class FeatureTrack extends TrackBase {
40388
40438
 
40439
+ static defaults = {
40440
+ type: "annotation",
40441
+ maxRows: 1000, // protects against pathological feature packing cases (# of rows of overlapping feaures)
40442
+ displayMode: "EXPANDED", // COLLAPSED | EXPANDED | SQUISHED
40443
+ margin: 10,
40444
+ featureHeight: 14,
40445
+ autoHeight: false,
40446
+ useScore: false
40447
+ }
40448
+
40449
+
40389
40450
  constructor(config, browser) {
40390
40451
  super(config, browser);
40391
40452
  }
@@ -40393,12 +40454,8 @@
40393
40454
  init(config) {
40394
40455
  super.init(config);
40395
40456
 
40396
- this.type = config.type || "annotation";
40397
40457
 
40398
- // Set maxRows -- protects against pathological feature packing cases (# of rows of overlapping feaures)
40399
- this.maxRows = config.maxRows === undefined ? 1000 : config.maxRows;
40400
-
40401
- this.displayMode = config.displayMode || "EXPANDED"; // COLLAPSED | EXPANDED | SQUISHED
40458
+ // Obscure option, not common or supoorted, included for backward compatibility
40402
40459
  this.labelDisplayMode = config.labelDisplayMode;
40403
40460
 
40404
40461
  if (config._featureSource) {
@@ -40410,12 +40467,6 @@
40410
40467
  FeatureSource(config, this.browser.genome);
40411
40468
  }
40412
40469
 
40413
- // Set default heights
40414
- this.autoHeight = config.autoHeight;
40415
- this.margin = config.margin === undefined ? 10 : config.margin;
40416
-
40417
- this.featureHeight = config.featureHeight || 14;
40418
-
40419
40470
  if ("FusionJuncSpan" === config.type) {
40420
40471
  this.render = config.render || renderFusionJuncSpan;
40421
40472
  this.squishedRowHeight = config.squishedRowHeight || 50;
@@ -40452,9 +40503,6 @@
40452
40503
  }
40453
40504
  }
40454
40505
  }
40455
-
40456
- //UCSC useScore option
40457
- this.useScore = config.useScore;
40458
40506
  }
40459
40507
 
40460
40508
  async postInit() {
@@ -40818,7 +40866,7 @@
40818
40866
  } else if (feature.color) {
40819
40867
  color = feature.color; // Explicit color for feature
40820
40868
  } else {
40821
- color = this.defaultColor; // Track default
40869
+ color = this.color; // Track default
40822
40870
  }
40823
40871
 
40824
40872
  if (feature.alpha && feature.alpha !== 1) {
@@ -40864,7 +40912,7 @@
40864
40912
 
40865
40913
  function onDragEnd() {
40866
40914
  if (track.trackView && track.displayMode !== "SQUISHED") {
40867
- track.trackView.repaintViews(); // TODO -- refine this to the viewport that was dragged after DOM refactor
40915
+ track.trackView.updateViews(); // TODO -- refine this to the viewport that was dragged after DOM refactor
40868
40916
  }
40869
40917
  }
40870
40918
 
@@ -40884,38 +40932,40 @@
40884
40932
 
40885
40933
  this.browser = config.browser;
40886
40934
 
40887
- this.container = domUtils.div({ class: 'igv-roi-table' });
40888
- if(config.width) {
40889
- this.container.style.width = config.width;
40935
+ this.columnFormat = config.columnFormat;
40890
40936
 
40891
- }
40937
+ this.tableRowSelectionList = [];
40892
40938
 
40893
- config.parent.appendChild(this.container);
40939
+ this.tableDOM = domUtils.div({ class: 'igv-roi-table' });
40940
+ // if(config.width) {
40941
+ // let [ w ] = config.width.split('px')
40942
+ // w = parseInt(w, 10)
40943
+ // this.tableDOM.style.width = `${Math.min(w, 1600)}px`
40944
+ //
40945
+ // }
40946
+
40947
+ config.parent.appendChild(this.tableDOM);
40894
40948
 
40895
40949
  this.headerDOM = config;
40896
40950
 
40897
- this.columnTitleDOM = config.columnFormat;
40951
+ this.tableColumnTitles = this.tableDOM;
40898
40952
 
40899
- this.rowContainerDOM = this.container;
40953
+ this.tableRowContainer = this.tableDOM;
40900
40954
 
40901
40955
  this.footerDOM = config.gotoButtonHandler;
40902
40956
 
40903
- this.columnFormat = config.columnFormat;
40904
-
40905
- this.tableRowSelectionList = [];
40906
-
40907
40957
  }
40908
40958
 
40909
40959
  set headerDOM({ browser, parent, headerTitle, dismissHandler }) {
40910
40960
 
40911
40961
  // header
40912
40962
  const dom = domUtils.div();
40913
- this.container.appendChild(dom);
40963
+ this.tableDOM.appendChild(dom);
40914
40964
 
40915
40965
  // header title
40916
40966
  const div = domUtils.div();
40917
40967
  dom.appendChild(div);
40918
- div.innerText = headerTitle;
40968
+ div.innerHTML = headerTitle;
40919
40969
 
40920
40970
  // table dismiss button
40921
40971
  const dismiss = domUtils.div();
@@ -40934,46 +40984,51 @@
40934
40984
  const { y:y_root } = browser.root.getBoundingClientRect();
40935
40985
  const { y:y_parent } = parent.getBoundingClientRect();
40936
40986
  const constraint = -(y_parent - y_root);
40937
- makeDraggable(this.container, dom, { minX:0, minY:constraint });
40987
+ makeDraggable(this.tableDOM, dom, { minX:0, minY:constraint });
40938
40988
 
40939
- this.container.style.display = 'none';
40989
+ this.tableDOM.style.display = 'none';
40940
40990
 
40941
40991
  this._headerDOM = dom;
40942
40992
 
40943
40993
  }
40944
40994
 
40945
- set columnTitleDOM(columnFormat) {
40995
+ set tableColumnTitles(tableDOM) {
40946
40996
 
40947
- const dom = domUtils.div({ class: 'igv-roi-table-column-titles' });
40948
- this.container.appendChild(dom);
40997
+ const tblColumnTitles = domUtils.div({ class: 'igv-roi-table-column-titles' });
40998
+ tableDOM.appendChild(tblColumnTitles);
40949
40999
 
40950
- for (const { label, width } of columnFormat) {
41000
+ for (const { label, width } of this.columnFormat) {
40951
41001
  const col = domUtils.div();
40952
- dom.appendChild(col);
41002
+ tblColumnTitles.appendChild(col);
40953
41003
  col.style.width = width;
40954
41004
  col.innerText = label;
40955
41005
  }
40956
41006
 
41007
+ this._tableColumnTitlesDOM = tblColumnTitles;
41008
+
41009
+ }
41010
+
41011
+ get tableColumnTitles() {
41012
+ return this._tableColumnTitlesDOM
40957
41013
  }
40958
41014
 
40959
- set rowContainerDOM(container) {
41015
+ set tableRowContainer(container) {
40960
41016
 
40961
- const dom = domUtils.div({ class: 'igv-roi-table-row-container' });
40962
- container.appendChild(dom);
41017
+ const tblRowContainer = domUtils.div({ class: 'igv-roi-table-row-container' });
41018
+ container.appendChild(tblRowContainer);
40963
41019
 
40964
- dom.style.minWidth = this.config.width;
41020
+ this._tableRowContainerDOM = tblRowContainer;
40965
41021
 
40966
- this._rowContainerDOM = dom;
40967
41022
  }
40968
41023
 
40969
- get rowContainerDOM() {
40970
- return this._rowContainerDOM
41024
+ get tableRowContainer() {
41025
+ return this._tableRowContainerDOM
40971
41026
  }
40972
41027
 
40973
41028
  set footerDOM(gotoButtonHandler) {
40974
41029
 
40975
41030
  const dom = domUtils.div();
40976
- this.container.appendChild(dom);
41031
+ this.tableDOM.appendChild(dom);
40977
41032
 
40978
41033
  // Go To Button
40979
41034
  const gotoButton = domUtils.div({class: 'igv-roi-table-button'});
@@ -41015,7 +41070,7 @@
41015
41070
  }
41016
41071
 
41017
41072
  clearTable() {
41018
- const elements = this.rowContainerDOM.querySelectorAll('.igv-roi-table-row');
41073
+ const elements = this.tableRowContainer.querySelectorAll('.igv-roi-table-row');
41019
41074
  for (let el of elements) {
41020
41075
  el.remove();
41021
41076
  }
@@ -41027,23 +41082,23 @@
41027
41082
  }
41028
41083
 
41029
41084
  present() {
41030
- this.container.style.left = `${ 0 }px`;
41085
+ this.tableDOM.style.left = `${ 0 }px`;
41031
41086
 
41032
41087
  const { y:y_root } = this.browser.root.getBoundingClientRect();
41033
41088
  const { y:y_parent } = this.config.parent.getBoundingClientRect();
41034
41089
 
41035
- this.container.style.top = `${ y_root - y_parent }px`;
41036
- this.container.style.display = 'flex';
41090
+ this.tableDOM.style.top = `${ y_root - y_parent }px`;
41091
+ this.tableDOM.style.display = 'flex';
41037
41092
  }
41038
41093
 
41039
41094
  dismiss() {
41040
- this.container.style.display = 'none';
41095
+ this.tableDOM.style.display = 'none';
41041
41096
  }
41042
41097
 
41043
41098
  dispose() {
41044
41099
 
41045
- this.container.innerHTML = '';
41046
- this.container.remove();
41100
+ this.tableDOM.innerHTML = '';
41101
+ this.tableDOM.remove();
41047
41102
 
41048
41103
  for (const key of Object.keys(this)) {
41049
41104
  this[key] = undefined;
@@ -41059,45 +41114,35 @@
41059
41114
 
41060
41115
  constructor(config) {
41061
41116
 
41062
- const cooked = Object.assign({ 'width':'1040px' }, config);
41117
+ const cooked = Object.assign({ 'width':'1024px' }, config);
41063
41118
  super(cooked);
41064
41119
 
41065
41120
  this.descriptionDOM = config;
41066
41121
 
41067
41122
  }
41068
41123
 
41069
-
41070
- set columnTitleDOM(columnFormat) {
41071
-
41072
- const dom = domUtils.div({ class: 'igv-roi-table-column-titles' });
41073
- this.columnTitlesDiv = dom;
41074
- this.container.appendChild(dom);
41075
-
41076
- for (const format of columnFormat) {
41077
- const col = domUtils.div();
41078
- dom.appendChild(col);
41079
- col.style.width = format.width || 'fit-content';
41080
- col.innerText = format.label;
41081
- }
41082
-
41083
- }
41084
-
41085
41124
  set descriptionDOM(config) {
41086
41125
 
41087
41126
  if (config.description) {
41088
41127
 
41089
41128
  let dom;
41090
41129
 
41130
+ // BLAT result for query sequence
41091
41131
  dom = domUtils.div({ class: 'igv-roi-table-description' });
41092
- this.container.insertBefore(dom, this.columnTitlesDiv);
41132
+ this.tableDOM.insertBefore(dom, this.tableColumnTitles);
41133
+ dom.style.height = 'auto';
41093
41134
  dom.innerHTML = `BLAT result for query sequence:`;
41094
41135
 
41136
+ // CTAATCAtctacactggtttctactg ...
41095
41137
  dom = domUtils.div({ class: 'igv-roi-table-description' });
41096
- this.container.insertBefore(dom, this.columnTitlesDiv);
41138
+ this.tableDOM.insertBefore(dom, this.tableColumnTitles);
41139
+ dom.style.height = 'auto';
41140
+ dom.style.maxHeight = '128px';
41097
41141
  dom.innerHTML = config.description;
41098
41142
 
41143
+ // Select one or more rows ...
41099
41144
  dom = domUtils.div({ class: 'igv-roi-table-goto-explainer' });
41100
- this.container.insertBefore(dom, this.columnTitlesDiv);
41145
+ this.tableDOM.insertBefore(dom, this.tableColumnTitles);
41101
41146
  dom.innerHTML = `Select one or more rows and click Go To to view the regions`;
41102
41147
 
41103
41148
  }
@@ -41127,13 +41172,13 @@
41127
41172
 
41128
41173
  renderTable(records) {
41129
41174
 
41130
- Array.from(this.rowContainerDOM.querySelectorAll('.igv-roi-table-row')).forEach(el => el.remove());
41175
+ Array.from(this.tableRowContainer.querySelectorAll('.igv-roi-table-row')).forEach(el => el.remove());
41131
41176
 
41132
41177
  if (records.length > 0) {
41133
41178
 
41134
41179
  for (let record of records) {
41135
41180
  const row = this.tableRowDOM(record);
41136
- this.rowContainerDOM.appendChild(row);
41181
+ this.tableRowContainer.appendChild(row);
41137
41182
  }
41138
41183
 
41139
41184
  }
@@ -41181,7 +41226,7 @@
41181
41226
 
41182
41227
  event.stopPropagation();
41183
41228
 
41184
- const selectedRows = this.container.querySelectorAll('.igv-roi-table-row-selected');
41229
+ const selectedRows = this.tableDOM.querySelectorAll('.igv-roi-table-row-selected');
41185
41230
 
41186
41231
  const loci = [];
41187
41232
  for (const row of selectedRows) {
@@ -41193,7 +41238,7 @@
41193
41238
  loci.push(`${ chr }:${ start }-${ end }`);
41194
41239
  }
41195
41240
 
41196
- for (const el of this.container.querySelectorAll('.igv-roi-table-row')) {
41241
+ for (const el of this.tableDOM.querySelectorAll('.igv-roi-table-row')) {
41197
41242
  el.classList.remove('igv-roi-table-row-selected');
41198
41243
  }
41199
41244
 
@@ -41388,8 +41433,6 @@
41388
41433
 
41389
41434
  const alignmentStartGap = 5;
41390
41435
  const downsampleRowHeight = 5;
41391
- const DEFAULT_COVERAGE_TRACK_HEIGHT = 50;
41392
- const DEFAULT_TRACK_HEIGHT$1 = 300;
41393
41436
  const DEFAULT_ALIGNMENT_COLOR = "rgb(185, 185, 185)";
41394
41437
  const DEFAULT_COVERAGE_COLOR = "rgb(150, 150, 150)";
41395
41438
  const DEFAULT_CONNECTOR_COLOR = "rgb(200, 200, 200)";
@@ -41397,35 +41440,37 @@
41397
41440
 
41398
41441
  class BAMTrack extends TrackBase {
41399
41442
 
41443
+ static defaults = {
41444
+ alleleFreqThreshold: 0.2,
41445
+ visibilityWindow: 30000,
41446
+ showCoverage: true,
41447
+ showAlignments: true,
41448
+ viewAsPairs: false,
41449
+ pairsSupported: true,
41450
+ showSoftClips: false,
41451
+ showAllBases: false,
41452
+ showInsertions: true,
41453
+ showMismatches: true,
41454
+ color: DEFAULT_ALIGNMENT_COLOR,
41455
+ coverageColor: DEFAULT_COVERAGE_COLOR,
41456
+ height: 300,
41457
+ coverageTrackHeight: 50
41458
+ }
41459
+
41400
41460
  constructor(config, browser) {
41401
41461
  super(config, browser);
41402
41462
  }
41403
41463
 
41404
41464
  init(config) {
41405
- super.init(config);
41406
- this.type = "alignment";
41407
-
41408
- if (config.alleleFreqThreshold === undefined) {
41409
- config.alleleFreqThreshold = 0.2;
41410
- }
41411
41465
 
41466
+ this.type = "alignment";
41412
41467
  this.featureSource = new BamSource(config, this.browser);
41413
-
41414
- this.showCoverage = config.showCoverage === undefined ? true : config.showCoverage;
41415
- this.showAlignments = config.showAlignments === undefined ? true : config.showAlignments;
41416
-
41417
41468
  this.coverageTrack = new CoverageTrack(config, this);
41418
41469
  this.alignmentTrack = new AlignmentTrack(config, this);
41470
+
41471
+ super.init(config);
41472
+
41419
41473
  this.alignmentTrack.setTop(this.coverageTrack, this.showCoverage);
41420
- this.visibilityWindow = config.visibilityWindow || 30000;
41421
- this.viewAsPairs = config.viewAsPairs;
41422
- this.pairsSupported = config.pairsSupported !== false;
41423
- this.showSoftClips = config.showSoftClips;
41424
- this.showAllBases = config.showAllBases;
41425
- this.showInsertions = false !== config.showInsertions;
41426
- this.showMismatches = false !== config.showMismatches;
41427
- this.color = config.color;
41428
- this.coverageColor = config.coverageColor;
41429
41474
 
41430
41475
  // The sort object can be an array in the case of multi-locus view, however if multiple sort positions
41431
41476
  // are present for a given reference frame the last one will take precedence
@@ -41438,14 +41483,12 @@
41438
41483
  }
41439
41484
  }
41440
41485
 
41441
- // Invoke height setter last to allocated to coverage and alignment tracks
41442
- this.height = (config.height !== undefined ? config.height : DEFAULT_TRACK_HEIGHT$1);
41443
41486
  }
41444
41487
 
41445
41488
  set height(h) {
41446
41489
  this._height = h;
41447
- if (this.coverageTrack && this.showAlignments) {
41448
- this.alignmentTrack.height = this.showCoverage ? h - this.coverageTrack.height : h;
41490
+ if (this.showAlignments) {
41491
+ this.alignmentTrack.height = this.showCoverage ? h - this.coverageTrackHeight : h;
41449
41492
  }
41450
41493
  }
41451
41494
 
@@ -41532,16 +41575,15 @@
41532
41575
  * @returns {number}
41533
41576
  */
41534
41577
  computePixelHeight(alignmentContainer) {
41535
- return (this.showCoverage ? this.coverageTrack.height : 0) +
41536
- (this.showAlignments ? this.alignmentTrack.computePixelHeight(alignmentContainer) : 0) +
41537
- 15
41578
+ return (this.showCoverage ? this.coverageTrackHeight : 0) +
41579
+ (this.showAlignments ? this.alignmentTrack.computePixelHeight(alignmentContainer) : 0)
41538
41580
  }
41539
41581
 
41540
41582
  draw(options) {
41541
41583
 
41542
41584
  IGVGraphics.fillRect(options.context, 0, options.pixelTop, options.pixelWidth, options.pixelHeight, {'fillStyle': "rgb(255, 255, 255)"});
41543
41585
 
41544
- if (true === this.showCoverage && this.coverageTrack.height > 0) {
41586
+ if (true === this.showCoverage && this.coverageTrackHeight > 0) {
41545
41587
  this.trackView.axisCanvas.style.display = 'block';
41546
41588
  this.coverageTrack.draw(options);
41547
41589
  } else {
@@ -41556,12 +41598,12 @@
41556
41598
 
41557
41599
  paintAxis(ctx, pixelWidth, pixelHeight) {
41558
41600
 
41559
- this.coverageTrack.paintAxis(ctx, pixelWidth, this.coverageTrack.height);
41601
+ this.coverageTrack.paintAxis(ctx, pixelWidth, this.coverageTrackHeight);
41560
41602
 
41561
41603
  // if (this.browser.isMultiLocusMode()) {
41562
41604
  // ctx.clearRect(0, 0, pixelWidth, pixelHeight);
41563
41605
  // } else {
41564
- // this.coverageTrack.paintAxis(ctx, pixelWidth, this.coverageTrack.height);
41606
+ // this.coverageTrack.paintAxis(ctx, pixelWidth, this.coverageTrackHeight);
41565
41607
  // }
41566
41608
  }
41567
41609
 
@@ -41570,7 +41612,7 @@
41570
41612
  }
41571
41613
 
41572
41614
  popupData(clickState) {
41573
- if (true === this.showCoverage && clickState.y >= this.coverageTrack.top && clickState.y < this.coverageTrack.height) {
41615
+ if (true === this.showCoverage && clickState.y >= this.coverageTrack.top && clickState.y < this.coverageTrackHeight) {
41574
41616
  return this.coverageTrack.popupData(clickState)
41575
41617
  } else {
41576
41618
  return this.alignmentTrack.popupData(clickState)
@@ -41585,7 +41627,7 @@
41585
41627
  clickedFeatures(clickState) {
41586
41628
 
41587
41629
  let clickedObject;
41588
- if (true === this.showCoverage && clickState.y >= this.coverageTrack.top && clickState.y < this.coverageTrack.height) {
41630
+ if (true === this.showCoverage && clickState.y >= this.coverageTrack.top && clickState.y < this.coverageTrackHeight) {
41589
41631
  clickedObject = this.coverageTrack.getClickedObject(clickState);
41590
41632
  } else {
41591
41633
  clickedObject = this.alignmentTrack.getClickedObject(clickState);
@@ -41594,7 +41636,7 @@
41594
41636
  }
41595
41637
 
41596
41638
  hoverText(clickState) {
41597
- if (true === this.showCoverage && clickState.y >= this.coverageTrack.top && clickState.y < this.coverageTrack.height) {
41639
+ if (true === this.showCoverage && clickState.y >= this.coverageTrack.top && clickState.y < this.coverageTrackHeight) {
41598
41640
  const clickedObject = this.coverageTrack.getClickedObject(clickState);
41599
41641
  if (clickedObject) {
41600
41642
  return clickedObject.hoverText()
@@ -41634,8 +41676,8 @@
41634
41676
  // Show coverage / alignment options
41635
41677
  const adjustTrackHeight = () => {
41636
41678
  if (!this.autoHeight) {
41637
- const h = 15 +
41638
- (this.showCoverage ? this.coverageTrack.height : 0) +
41679
+ const h =
41680
+ (this.showCoverage ? this.coverageTrackHeight : 0) +
41639
41681
  (this.showAlignments ? this.alignmentTrack.height : 0);
41640
41682
  this.trackView.setTrackHeight(h);
41641
41683
  }
@@ -41949,7 +41991,6 @@
41949
41991
  constructor(config, parent) {
41950
41992
  this.parent = parent;
41951
41993
  this.featureSource = parent.featureSource;
41952
- this.height = config.coverageTrackHeight !== undefined ? config.coverageTrackHeight : DEFAULT_COVERAGE_TRACK_HEIGHT;
41953
41994
 
41954
41995
  this.paintAxis = paintAxis;
41955
41996
  this.top = 0;
@@ -41964,6 +42005,10 @@
41964
42005
 
41965
42006
  }
41966
42007
 
42008
+ get height() {
42009
+ return this.parent.coverageTrackHeight
42010
+ }
42011
+
41967
42012
  draw(options) {
41968
42013
 
41969
42014
  const pixelTop = options.pixelTop;
@@ -42711,7 +42756,7 @@
42711
42756
  const seqstring = clickedAlignment.seq;
42712
42757
  if (seqstring && "*" != seqstring) {
42713
42758
 
42714
- if(seqstring.length < maxSequenceSize) {
42759
+ if (seqstring.length < maxSequenceSize) {
42715
42760
  list.push({
42716
42761
  label: 'BLAT read sequence',
42717
42762
  click: () => {
@@ -44658,25 +44703,34 @@
44658
44703
  * THE SOFTWARE.
44659
44704
  */
44660
44705
 
44661
- const DEFAULT_COLOR = "rgb(150,150,150)";
44662
-
44663
44706
  class WigTrack extends TrackBase {
44664
44707
 
44708
+ static defaults = {
44709
+ height: 50,
44710
+ color: 'rgb(150, 150, 150)',
44711
+ altColor: 'rgb(150, 150, 150)',
44712
+ flipAxis: false,
44713
+ logScale: false,
44714
+ windowFunction: 'mean',
44715
+ graphType: 'bar',
44716
+ autoscale: true,
44717
+ normalize: undefined,
44718
+ scaleFactor: undefined
44719
+ }
44720
+
44665
44721
  constructor(config, browser) {
44666
44722
  super(config, browser);
44667
44723
  }
44668
44724
 
44669
44725
  init(config) {
44726
+
44670
44727
  super.init(config);
44671
44728
 
44672
44729
  this.type = "wig";
44673
- this.height = config.height || 50;
44674
44730
  this.featureType = 'numeric';
44675
44731
  this.paintAxis = paintAxis;
44676
44732
 
44677
44733
  const format = config.format ? config.format.toLowerCase() : config.format;
44678
- this.flipAxis = config.flipAxis ? config.flipAxis : false;
44679
- this.logScale = config.logScale ? config.logScale : false;
44680
44734
  if (config.featureSource) {
44681
44735
  this.featureSource = config.featureSource;
44682
44736
  delete config.featureSource;
@@ -44688,18 +44742,16 @@
44688
44742
  this.featureSource = FeatureSource(config, this.browser.genome);
44689
44743
  }
44690
44744
 
44691
- this.autoscale = config.autoscale || config.max === undefined;
44692
- if (!this.autoscale) {
44745
+
44746
+ // Override autoscale default
44747
+ if(config.max === undefined || config.autoscale === true) {
44748
+ this.autoscale = true;
44749
+ } else {
44693
44750
  this.dataRange = {
44694
44751
  min: config.min || 0,
44695
44752
  max: config.max
44696
44753
  };
44697
44754
  }
44698
-
44699
- this.windowFunction = config.windowFunction || "mean";
44700
- this.graphType = config.graphType || "bar";
44701
- this.normalize = config.normalize; // boolean, for use with "TDF" files
44702
- this.scaleFactor = config.scaleFactor; // optional scale factor, ignored if normalize === true;
44703
44755
  }
44704
44756
 
44705
44757
  async postInit() {
@@ -44789,7 +44841,7 @@
44789
44841
  const pixelWidth = options.pixelWidth;
44790
44842
  options.pixelHeight;
44791
44843
  const bpEnd = bpStart + pixelWidth * bpPerPixel + 1;
44792
- const posColor = this.color || DEFAULT_COLOR;
44844
+ const posColor = this.color || WigTrack.defaults.color;
44793
44845
 
44794
44846
  let baselineColor;
44795
44847
  if (typeof posColor === "string" && posColor.startsWith("rgb(")) {
@@ -44933,7 +44985,7 @@
44933
44985
  */
44934
44986
 
44935
44987
  getColorForFeature(f) {
44936
- let c = (f.value < 0 && this.altColor) ? this.altColor : this.color || DEFAULT_COLOR;
44988
+ let c = (f.value < 0 && this.altColor) ? this.altColor : this.color || WigTrack.defaults.color;
44937
44989
  return (typeof c === "function") ? c(f.value) : c
44938
44990
  }
44939
44991
 
@@ -44944,20 +44996,6 @@
44944
44996
  this.trackView = undefined;
44945
44997
  }
44946
44998
 
44947
- /**
44948
- * Return the current state of the track. Used to create sessions and bookmarks.
44949
- *
44950
- * @returns {*|{}}
44951
- */
44952
- getState() {
44953
-
44954
- const config = super.getState();
44955
-
44956
- if (this.flipAxis !== undefined) config.flipAxis = this.flipAxis;
44957
- if (this.logScale !== undefined) config.logScale = this.logScale;
44958
-
44959
- return config
44960
- }
44961
44999
  }
44962
45000
 
44963
45001
  /**
@@ -45845,6 +45883,17 @@
45845
45883
 
45846
45884
  class InteractionTrack extends TrackBase {
45847
45885
 
45886
+ static defaults = {
45887
+ height: 250,
45888
+ theta: Math.PI / 4,
45889
+ arcOrientation: true,
45890
+ showBlocks: true,
45891
+ blockHeight: 3,
45892
+ thickness: 1,
45893
+ alpha: 0.02,
45894
+ logScale: true,
45895
+ }
45896
+
45848
45897
  constructor(config, browser) {
45849
45898
  super(config, browser);
45850
45899
  }
@@ -45852,16 +45901,10 @@
45852
45901
  init(config) {
45853
45902
 
45854
45903
  super.init(config);
45855
- this.theta = config.theta || Math.PI / 4;
45904
+
45856
45905
  this.sinTheta = Math.sin(this.theta);
45857
45906
  this.cosTheta = Math.cos(this.theta);
45858
- this.height = config.height || 250;
45859
45907
  this.arcType = getArcType(config); // nested | proportional | inView | partialInView
45860
- this.arcOrientation = (config.arcOrientation === undefined ? true : config.arcOrientation); // true for up, false for down
45861
- this.showBlocks = config.showBlocks === undefined ? true : config.showBlocks;
45862
- this.blockHeight = config.blockHeight || 3;
45863
- this.thickness = config.thickness || 1;
45864
- this.color = config.color;
45865
45908
  this.alpha = config.alpha || 0.02; // was: 0.15
45866
45909
  this.painter = {flipAxis: !this.arcOrientation, dataRange: this.dataRange, paintAxis: paintAxis};
45867
45910
 
@@ -45873,7 +45916,6 @@
45873
45916
  this.valueColumn = "score";
45874
45917
  }
45875
45918
 
45876
- this.logScale = config.logScale !== false; // i.e. defaul to true (undefined => true)
45877
45919
  if (config.max) {
45878
45920
  this.dataRange = {
45879
45921
  min: config.min || 0,
@@ -45898,7 +45940,7 @@
45898
45940
 
45899
45941
  if (typeof this.featureSource.getHeader === "function") {
45900
45942
  this.header = await this.featureSource.getHeader();
45901
- if(this.disposed) return; // This track was removed during async load
45943
+ if (this.disposed) return; // This track was removed during async load
45902
45944
  }
45903
45945
 
45904
45946
  // Set properties from track line
@@ -45971,7 +46013,7 @@
45971
46013
  feature.drawState = undefined;
45972
46014
 
45973
46015
  let color;
45974
- if(typeof this.color === 'function') {
46016
+ if (typeof this.color === 'function') {
45975
46017
  color = this.color(feature);
45976
46018
  } else {
45977
46019
  color = this.color || feature.color || DEFAULT_ARC_COLOR;
@@ -46316,7 +46358,7 @@
46316
46358
  contextMenuItemList(clickState) {
46317
46359
 
46318
46360
  // Experimental JBrowse feature
46319
- if (this.browser.circularView ) {
46361
+ if (this.browser.circularView) {
46320
46362
  const viewport = clickState.viewport;
46321
46363
  const list = [];
46322
46364
 
@@ -46345,7 +46387,7 @@
46345
46387
 
46346
46388
  // inView features are simply features that have been drawn, i.e. have a drawState
46347
46389
  const inView = cachedFeatures.filter(f => f.drawState);
46348
- if(inView.length === 0) return;
46390
+ if (inView.length === 0) return;
46349
46391
 
46350
46392
  const chords = makeBedPEChords(inView);
46351
46393
  sendChords(chords, this, refFrame, 0.5);
@@ -46381,7 +46423,7 @@
46381
46423
 
46382
46424
  popupData(clickState, features) {
46383
46425
 
46384
- if(features === undefined) features = this.clickedFeatures(clickState);
46426
+ if (features === undefined) features = this.clickedFeatures(clickState);
46385
46427
 
46386
46428
  const data = [];
46387
46429
  for (let feature of features) {
@@ -46405,7 +46447,7 @@
46405
46447
  const columnNames = this.header.columnNames;
46406
46448
  const stdColumns = this.header.hiccups ? 6 : 10;
46407
46449
  for (let i = stdColumns; i < columnNames.length; i++) {
46408
- if(this.header.colorColumn === i) continue;
46450
+ if (this.header.colorColumn === i) continue;
46409
46451
  if (columnNames[i] === 'info') {
46410
46452
  extractInfoColumn(data, f.extras[i - stdColumns]);
46411
46453
  } else {
@@ -46427,7 +46469,7 @@
46427
46469
 
46428
46470
  // We use the cached features rather than method to avoid async load. If the
46429
46471
  // feature is not already loaded this won't work, but the user wouldn't be mousing over it either.
46430
- const featureList = clickState.viewport.cachedFeatures;
46472
+ const featureList = clickState.viewport.cachedFeatures;
46431
46473
  const candidates = [];
46432
46474
  if (featureList) {
46433
46475
  const proportional = (this.arcType === "proportional" || this.arcType === "inView" || this.arcType === "partialInView");
@@ -46473,26 +46515,6 @@
46473
46515
  }
46474
46516
  return candidates.map((c) => c.feature)
46475
46517
  }
46476
-
46477
- /**
46478
- * Return the current state of the track. Used to create sessions and bookmarks.
46479
- *
46480
- * @returns {*|{}}
46481
- */
46482
- getState() {
46483
-
46484
- const config = super.getState();
46485
-
46486
- // if (this.height !== undefined) config.height = this.height;
46487
- if (this.arcType !== undefined) config.arcType = this.arcType;
46488
- if (this.arcOrientation !== undefined) config.arcOrientation = this.arcOrientation;
46489
- if (this.showBlocks !== undefined) config.showBlocks = this.showBlocks;
46490
- if (this.blockHeight !== undefined) config.blockHeight = this.blockHeight;
46491
- if (this.thickness !== undefined) config.thickness = this.thickness;
46492
- if (this.alpha !== undefined) config.alpha = this.alpha;
46493
-
46494
- return config
46495
- }
46496
46518
  }
46497
46519
 
46498
46520
  function getMidpoints(feature, genome) {
@@ -46699,6 +46721,31 @@
46699
46721
 
46700
46722
  class VariantTrack extends TrackBase {
46701
46723
 
46724
+ static defaults = {
46725
+ displayMode: "EXPANDED",
46726
+ sortDirection: "ASC",
46727
+ showGenotypes: true,
46728
+ squishedVariantHeight: 2,
46729
+ squishedCallHeight: 1,
46730
+ expandedCallHeight: 10,
46731
+ expandedVGap: 2,
46732
+ squishedVGap: 1,
46733
+ expandedGroupGap: 10,
46734
+ squishedGroupGap: 5,
46735
+ featureHeight: 14,
46736
+ noGenotypeColor: "rgb(200,180,180)",
46737
+ noCallColor: "rgb(225, 225, 225)",
46738
+ nonRefColor: "rgb(200, 200, 215)",
46739
+ mixedColor: "rgb(200, 220, 200)",
46740
+ homrefColor: "rgb(200, 200, 200)",
46741
+ homvarColor: "rgb(17,248,254)",
46742
+ hetvarColor: "rgb(34,12,253)",
46743
+ colorBy: undefined,
46744
+ visibilityWindow: undefined,
46745
+ labelDisplayMode: undefined,
46746
+ type: "variant"
46747
+ }
46748
+
46702
46749
  constructor(config, browser) {
46703
46750
  super(config, browser);
46704
46751
  }
@@ -46707,41 +46754,18 @@
46707
46754
 
46708
46755
  super.init(config);
46709
46756
 
46710
- this.visibilityWindow = config.visibilityWindow;
46711
- this.displayMode = config.displayMode || "EXPANDED"; // COLLAPSED | EXPANDED | SQUISHED
46712
- this.labelDisplayMode = config.labelDisplayMode;
46713
46757
  this.expandedVariantHeight = config.expandedVariantHeight || config.variantHeight || 10;
46714
- this.squishedVariantHeight = config.squishedVariantHeight || 2;
46715
- this.squishedCallHeight = config.squishedCallHeight || 1;
46716
- this.expandedCallHeight = config.expandedCallHeight || 10;
46717
- this.expandedVGap = config.expandedVGap !== undefined ? config.expandedVGap : 2;
46718
- this.squishedVGap = config.squishedVGap !== undefined ? config.squishedVGap : 1;
46719
- this.expandedGroupGap = config.expandedGroupGap || 10;
46720
- this.squishedGroupGap = config.squishedGroupGap || 5;
46721
- this.featureHeight = config.featureHeight || 14;
46722
- this.visibilityWindow = config.visibilityWindow;
46758
+
46723
46759
  this.featureSource = FeatureSource(config, this.browser.genome);
46724
- this.noGenotypeColor = config.noGenotypeColor || "rgb(200,180,180)";
46725
- this.noCallColor = config.noCallColor || "rgb(225, 225, 225)";
46726
- this.nonRefColor = config.nonRefColor || "rgb(200, 200, 215)";
46727
- this.mixedColor = config.mixedColor || "rgb(200, 220, 200)";
46728
- this.homrefColor = config.homrefColor || "rgb(200, 200, 200)";
46729
- this.homvarColor = config.homvarColor || "rgb(17,248,254)";
46730
- this.hetvarColor = config.hetvarColor || "rgb(34,12,253)";
46731
- this.sortDirection = "ASC";
46732
- this.type = config.type || "variant";
46733
-
46734
- this.colorBy = config.colorBy; // Can be undefined => default
46760
+
46735
46761
  this._initColorBy = config.colorBy;
46736
46762
  if (config.colorTable) {
46737
46763
  this.colorTables = new Map();
46738
46764
  this.colorTables.set(config.colorBy, new ColorTable(config.colorTable));
46739
46765
  }
46740
-
46741
46766
  this._strokecolor = config.strokecolor;
46742
46767
  this._context_hook = config.context_hook;
46743
46768
 
46744
- this.showGenotypes = config.showGenotypes === undefined ? true : config.showGenotypes;
46745
46769
 
46746
46770
  // The number of variant rows are computed dynamically, but start with "1" by default
46747
46771
  this.variantRowCount(1);
@@ -46751,7 +46775,7 @@
46751
46775
  async postInit() {
46752
46776
 
46753
46777
  this.header = await this.getHeader(); // cricital, don't remove'
46754
- if(this.disposed) return; // This track was removed during async load
46778
+ if (this.disposed) return // This track was removed during async load
46755
46779
  if (undefined === this.visibilityWindow && this.config.indexed !== false) {
46756
46780
  const fn = isFile(this.config.url) ? this.config.url.name : this.config.url;
46757
46781
  if (isString(fn) && fn.toLowerCase().includes("gnomad")) {
@@ -46854,7 +46878,7 @@
46854
46878
  this.variantBandHeight = TOP_MARGIN + rowCount * (variantHeight + vGap);
46855
46879
 
46856
46880
  let callSets = this.callSets;
46857
- if(!callSets && this._f) {
46881
+ if (!callSets && this._f) {
46858
46882
  callSets = this._f.callSets; // "Complementary" variant for structural variants
46859
46883
  }
46860
46884
  const nCalls = this.getCallsetsLength();
@@ -46894,9 +46918,9 @@
46894
46918
 
46895
46919
  //only paint stroke if a color is defined
46896
46920
  let strokecolor = this.getVariantStrokecolor(variant);
46897
- if (strokecolor){
46898
- context.strokeStyle = strokecolor;
46899
- context.strokeRect(x, y, w, h);
46921
+ if (strokecolor) {
46922
+ context.strokeStyle = strokecolor;
46923
+ context.strokeRect(x, y, w, h);
46900
46924
  }
46901
46925
 
46902
46926
  // call hook if _context_hook fn is defined
@@ -46912,7 +46936,7 @@
46912
46936
  this.sampleHeight = nVariantRows * (callHeight + vGap); // For each sample, there is a call for each variant at this position
46913
46937
 
46914
46938
  let sampleNumber = 0;
46915
- if(callSets && variant.calls) {
46939
+ if (callSets && variant.calls) {
46916
46940
  for (let callSet of callSets) {
46917
46941
  const call = variant.calls[callSet.id];
46918
46942
  if (call) {
@@ -46988,13 +47012,12 @@
46988
47012
  } else if ("MIXED" === v.type) {
46989
47013
  variantColor = this.mixedColor;
46990
47014
  } else {
46991
- variantColor = this.defaultColor;
47015
+ variantColor = this.color;
46992
47016
  }
46993
47017
  return variantColor
46994
47018
  }
46995
47019
 
46996
47020
 
46997
-
46998
47021
  getVariantStrokecolor(variant) {
46999
47022
 
47000
47023
  const v = variant._f || variant;
@@ -47010,13 +47033,13 @@
47010
47033
 
47011
47034
  callContextHook(variant, context, x, y, w, h) {
47012
47035
  if (this._context_hook) {
47013
- if (typeof this._context_hook === "function") {
47014
- const v = variant._f || variant;
47036
+ if (typeof this._context_hook === "function") {
47037
+ const v = variant._f || variant;
47015
47038
 
47016
- context.save();
47017
- this._context_hook(v, context, x, y, w, h);
47018
- context.restore();
47019
- }
47039
+ context.save();
47040
+ this._context_hook(v, context, x, y, w, h);
47041
+ context.restore();
47042
+ }
47020
47043
  }
47021
47044
  }
47022
47045
 
@@ -47060,7 +47083,7 @@
47060
47083
  */
47061
47084
  popupData(clickState, featureList) {
47062
47085
 
47063
- if(featureList === undefined) featureList = this.clickedFeatures(clickState);
47086
+ if (featureList === undefined) featureList = this.clickedFeatures(clickState);
47064
47087
  const genomicLocation = clickState.genomicLocation;
47065
47088
  const genomeID = this.browser.genome.id;
47066
47089
  const sampleInformation = this.browser.sampleInformation;
@@ -47288,12 +47311,12 @@
47288
47311
  sendChordsForViewport(viewport) {
47289
47312
  const refFrame = viewport.referenceFrame;
47290
47313
  let inView;
47291
- if("all" === refFrame.chr) {
47314
+ if ("all" === refFrame.chr) {
47292
47315
  const all = this.featureSource.getAllFeatures();
47293
47316
  const arrays = Object.keys(all).map(k => all[k]);
47294
47317
  inView = [].concat(...arrays);
47295
47318
  } else {
47296
- inView = this.featureSource.featureCache.queryFeatures(refFrame.chr, refFrame.start, refFrame.end);
47319
+ inView = this.featureSource.featureCache.queryFeatures(refFrame.chr, refFrame.start, refFrame.end);
47297
47320
 
47298
47321
  }
47299
47322
 
@@ -57531,7 +57554,7 @@
57531
57554
  let locusObject = parseLocusString(browser, locus);
57532
57555
 
57533
57556
  if (!locusObject) {
57534
- const feature = browser.genome.featureDB[locus.toUpperCase()];
57557
+ const feature = browser.genome.featureDB.get(locus.toUpperCase());
57535
57558
  if (feature) {
57536
57559
  locusObject = {
57537
57560
  chr: feature.chr,
@@ -59384,7 +59407,7 @@
59384
59407
 
59385
59408
  renderTable(records) {
59386
59409
 
59387
- Array.from(this.rowContainerDOM.querySelectorAll('.igv-roi-table-row')).forEach(el => el.remove());
59410
+ Array.from(this.tableRowContainer.querySelectorAll('.igv-roi-table-row')).forEach(el => el.remove());
59388
59411
 
59389
59412
  if (records.length > 0) {
59390
59413
 
@@ -59392,7 +59415,7 @@
59392
59415
 
59393
59416
  for (let record of sortedRecords) {
59394
59417
  const row = this.tableRowDOM(record);
59395
- this.rowContainerDOM.appendChild(row);
59418
+ this.tableRowContainer.appendChild(row);
59396
59419
  }
59397
59420
 
59398
59421
  }
@@ -59432,14 +59455,14 @@
59432
59455
 
59433
59456
  event.stopPropagation();
59434
59457
 
59435
- const selected = this.container.querySelectorAll('.igv-roi-table-row-selected');
59458
+ const selected = this.tableDOM.querySelectorAll('.igv-roi-table-row-selected');
59436
59459
  const loci = [];
59437
59460
  for (let el of selected) {
59438
59461
  const { locus } = parseRegionKey(el.dataset.region);
59439
59462
  loci.push(locus);
59440
59463
  }
59441
59464
 
59442
- for (let el of this.container.querySelectorAll('.igv-roi-table-row')) {
59465
+ for (let el of this.tableDOM.querySelectorAll('.igv-roi-table-row')) {
59443
59466
  el.classList.remove('igv-roi-table-row-selected');
59444
59467
  }
59445
59468
 
@@ -62072,7 +62095,7 @@
62072
62095
 
62073
62096
  function embedCSS() {
62074
62097
 
62075
- var css = '.igv-navbar {\n display: flex;\n flex-flow: row;\n flex-wrap: nowrap;\n justify-content: space-between;\n align-items: center;\n box-sizing: border-box;\n width: 100%;\n color: #444;\n font-size: 12px;\n font-family: \"Open Sans\", sans-serif;\n font-weight: 400;\n line-height: 32px;\n padding-left: 8px;\n padding-right: 8px;\n margin-top: 2px;\n margin-bottom: 6px;\n height: 32px;\n border-style: solid;\n border-radius: 3px;\n border-width: thin;\n border-color: #bfbfbf;\n background-color: #f3f3f3;\n}\n.igv-navbar .igv-navbar-left-container {\n display: flex;\n flex-flow: row;\n flex-wrap: nowrap;\n justify-content: space-between;\n align-items: center;\n height: 32px;\n line-height: 32px;\n}\n.igv-navbar .igv-navbar-left-container .igv-logo {\n width: 34px;\n height: 32px;\n margin-right: 8px;\n}\n.igv-navbar .igv-navbar-left-container .igv-current-genome {\n height: 32px;\n margin-left: 4px;\n margin-right: 4px;\n user-select: none;\n line-height: 32px;\n vertical-align: middle;\n text-align: center;\n}\n.igv-navbar .igv-navbar-left-container .igv-navbar-genomic-location {\n display: flex;\n flex-flow: row;\n flex-wrap: nowrap;\n justify-content: space-between;\n align-items: center;\n height: 100%;\n}\n.igv-navbar .igv-navbar-left-container .igv-navbar-genomic-location .igv-chromosome-select-widget-container {\n display: flex;\n flex-flow: column;\n flex-wrap: nowrap;\n justify-content: space-around;\n align-items: center;\n height: 100%;\n width: 125px;\n margin-right: 4px;\n}\n.igv-navbar .igv-navbar-left-container .igv-navbar-genomic-location .igv-chromosome-select-widget-container select {\n display: block;\n cursor: pointer;\n width: 100px;\n height: 75%;\n outline: none;\n font-size: 12px;\n font-family: \"Open Sans\", sans-serif;\n font-weight: 400;\n}\n.igv-navbar .igv-navbar-left-container .igv-navbar-genomic-location .igv-locus-size-group {\n display: flex;\n flex-flow: row;\n flex-wrap: nowrap;\n justify-content: space-between;\n align-items: center;\n margin-left: 8px;\n height: 22px;\n}\n.igv-navbar .igv-navbar-left-container .igv-navbar-genomic-location .igv-locus-size-group .igv-search-container {\n display: flex;\n flex-flow: row;\n flex-wrap: nowrap;\n justify-content: flex-start;\n align-items: center;\n width: 210px;\n height: 22px;\n line-height: 22px;\n}\n.igv-navbar .igv-navbar-left-container .igv-navbar-genomic-location .igv-locus-size-group .igv-search-container input.igv-search-input {\n cursor: text;\n width: 85%;\n height: 22px;\n line-height: 22px;\n font-size: 12px;\n font-family: \"Open Sans\", sans-serif;\n font-weight: 400;\n text-align: left;\n padding-left: 8px;\n margin-right: 8px;\n outline: none;\n border-style: solid;\n border-radius: 3px;\n border-width: thin;\n border-color: #bfbfbf;\n background-color: white;\n}\n.igv-navbar .igv-navbar-left-container .igv-navbar-genomic-location .igv-locus-size-group .igv-search-container .igv-search-icon-container {\n cursor: pointer;\n height: 16px;\n width: 16px;\n}\n.igv-navbar .igv-navbar-left-container .igv-navbar-genomic-location .igv-locus-size-group .igv-windowsize-panel-container {\n margin-left: 4px;\n user-select: none;\n}\n.igv-navbar .igv-navbar-right-container {\n display: flex;\n flex-flow: row;\n flex-wrap: nowrap;\n justify-content: space-between;\n align-items: center;\n height: 32px;\n line-height: 32px;\n}\n.igv-navbar .igv-navbar-right-container .igv-navbar-toggle-button-container {\n display: flex;\n flex-flow: row;\n flex-wrap: nowrap;\n justify-content: space-between;\n align-items: center;\n height: 100%;\n}\n.igv-navbar .igv-navbar-right-container .igv-navbar-toggle-button-container div {\n margin-left: 0;\n margin-right: 4px;\n}\n.igv-navbar .igv-navbar-right-container .igv-navbar-toggle-button-container div:last-child {\n margin-left: 0;\n margin-right: 0;\n}\n.igv-navbar .igv-navbar-right-container .igv-navbar-toggle-button-container-750 {\n display: none;\n}\n.igv-navbar .igv-navbar-right-container .igv-zoom-widget {\n color: #737373;\n font-size: 18px;\n height: 32px;\n line-height: 32px;\n margin-left: 8px;\n user-select: none;\n display: flex;\n flex-flow: row;\n flex-wrap: nowrap;\n justify-content: flex-end;\n align-items: center;\n}\n.igv-navbar .igv-navbar-right-container .igv-zoom-widget div {\n cursor: pointer;\n margin-left: unset;\n margin-right: unset;\n}\n.igv-navbar .igv-navbar-right-container .igv-zoom-widget div:first-child {\n height: 24px;\n width: 24px;\n margin-left: unset;\n margin-right: 8px;\n}\n.igv-navbar .igv-navbar-right-container .igv-zoom-widget div:last-child {\n height: 24px;\n width: 24px;\n margin-left: 8px;\n margin-right: unset;\n}\n.igv-navbar .igv-navbar-right-container .igv-zoom-widget div:nth-child(even) {\n display: block;\n height: fit-content;\n}\n.igv-navbar .igv-navbar-right-container .igv-zoom-widget input {\n display: block;\n width: 125px;\n}\n.igv-navbar .igv-navbar-right-container .igv-zoom-widget svg {\n display: block;\n}\n.igv-navbar .igv-navbar-right-container .igv-zoom-widget-900 {\n color: #737373;\n font-size: 18px;\n height: 32px;\n line-height: 32px;\n margin-left: 8px;\n user-select: none;\n display: flex;\n flex-flow: row;\n flex-wrap: nowrap;\n justify-content: flex-end;\n align-items: center;\n}\n.igv-navbar .igv-navbar-right-container .igv-zoom-widget-900 div {\n cursor: pointer;\n margin-left: unset;\n margin-right: unset;\n}\n.igv-navbar .igv-navbar-right-container .igv-zoom-widget-900 div:first-child {\n height: 24px;\n width: 24px;\n margin-left: unset;\n margin-right: 8px;\n}\n.igv-navbar .igv-navbar-right-container .igv-zoom-widget-900 div:last-child {\n height: 24px;\n width: 24px;\n margin-left: 8px;\n margin-right: unset;\n}\n.igv-navbar .igv-navbar-right-container .igv-zoom-widget-900 div:nth-child(even) {\n width: 0;\n height: 0;\n display: none;\n}\n.igv-navbar .igv-navbar-right-container .igv-zoom-widget-900 input {\n width: 0;\n height: 0;\n display: none;\n}\n.igv-navbar .igv-navbar-right-container .igv-zoom-widget-900 svg {\n display: block;\n}\n.igv-navbar .igv-navbar-right-container .igv-zoom-widget-hidden {\n display: none;\n}\n\n.igv-navbar-button {\n display: block;\n box-sizing: unset;\n padding-left: 6px;\n padding-right: 6px;\n height: 18px;\n text-transform: capitalize;\n user-select: none;\n line-height: 18px;\n text-align: center;\n vertical-align: middle;\n font-family: \"Open Sans\", sans-serif;\n font-size: 11px;\n font-weight: 200;\n color: #737373;\n background-color: #f3f3f3;\n border-color: #737373;\n border-style: solid;\n border-width: thin;\n border-radius: 6px;\n}\n\n.igv-navbar-button-clicked {\n color: white;\n background-color: #737373;\n}\n\n.igv-navbar-button:hover {\n cursor: pointer;\n}\n\n.igv-zoom-in-notice-container {\n z-index: 1024;\n position: absolute;\n top: 8px;\n left: 50%;\n transform: translate(-50%, 0%);\n display: flex;\n flex-direction: row;\n flex-wrap: nowrap;\n justify-content: center;\n align-items: center;\n background-color: white;\n}\n.igv-zoom-in-notice-container > div {\n padding-left: 4px;\n padding-right: 4px;\n padding-top: 2px;\n padding-bottom: 2px;\n width: 100%;\n height: 100%;\n font-family: \"Open Sans\", sans-serif;\n font-size: 14px;\n font-weight: 400;\n color: #3f3f3f;\n}\n\n.igv-zoom-in-notice {\n position: absolute;\n top: 10px;\n left: 50%;\n}\n.igv-zoom-in-notice div {\n position: relative;\n left: -50%;\n font-family: \"Open Sans\", sans-serif;\n font-size: medium;\n font-weight: 400;\n color: #3f3f3f;\n background-color: rgba(255, 255, 255, 0.51);\n z-index: 64;\n}\n\n.igv-container-spinner {\n position: absolute;\n top: 90%;\n left: 50%;\n transform: translate(-50%, -50%);\n z-index: 1024;\n width: 24px;\n height: 24px;\n pointer-events: none;\n color: #737373;\n}\n\n.igv-multi-locus-close-button {\n position: absolute;\n top: 2px;\n right: 0;\n padding-left: 2px;\n padding-right: 2px;\n width: 12px;\n height: 12px;\n color: #666666;\n background-color: white;\n z-index: 1000;\n}\n.igv-multi-locus-close-button > svg {\n vertical-align: top;\n}\n\n.igv-multi-locus-close-button:hover {\n cursor: pointer;\n color: #434343;\n}\n\n.igv-multi-locus-ruler-label {\n z-index: 64;\n position: absolute;\n top: 2px;\n left: 0;\n width: 100%;\n height: 12px;\n display: flex;\n flex-flow: row;\n flex-wrap: nowrap;\n justify-content: center;\n align-items: center;\n}\n.igv-multi-locus-ruler-label > div {\n font-family: \"Open Sans\", sans-serif;\n font-size: 12px;\n color: rgb(16, 16, 16);\n background-color: white;\n}\n.igv-multi-locus-ruler-label > div {\n cursor: pointer;\n}\n\n.igv-multi-locus-ruler-label-square-dot {\n z-index: 64;\n position: absolute;\n left: 50%;\n top: 5%;\n transform: translate(-50%, 0%);\n background-color: white;\n display: flex;\n flex-flow: row;\n flex-wrap: nowrap;\n justify-content: flex-start;\n align-items: center;\n}\n.igv-multi-locus-ruler-label-square-dot > div:first-child {\n width: 14px;\n height: 14px;\n}\n.igv-multi-locus-ruler-label-square-dot > div:last-child {\n margin-left: 16px;\n font-family: \"Open Sans\", sans-serif;\n font-size: 14px;\n font-weight: 400;\n color: rgb(16, 16, 16);\n}\n\n.igv-ruler-sweeper {\n display: none;\n pointer-events: none;\n position: absolute;\n top: 26px;\n bottom: 0;\n left: 0;\n width: 0;\n z-index: 99999;\n background-color: rgba(68, 134, 247, 0.25);\n}\n\n.igv-ruler-tooltip {\n pointer-events: none;\n z-index: 128;\n position: absolute;\n top: 0;\n left: 0;\n width: 1px;\n height: 32px;\n background-color: transparent;\n display: flex;\n flex-flow: row;\n flex-wrap: nowrap;\n justify-content: flex-start;\n align-items: center;\n}\n.igv-ruler-tooltip > div {\n pointer-events: none;\n width: 128px;\n height: auto;\n padding: 1px;\n color: #373737;\n font-size: 10px;\n font-family: \"Open Sans\", sans-serif;\n font-weight: 400;\n background-color: white;\n border-style: solid;\n border-width: thin;\n border-color: #373737;\n}\n\n.igv-track-label {\n position: absolute;\n left: 8px;\n top: 8px;\n width: auto;\n height: auto;\n max-width: 50%;\n padding-left: 4px;\n padding-right: 4px;\n white-space: nowrap;\n overflow: hidden;\n text-overflow: ellipsis;\n font-family: \"Open Sans\", sans-serif;\n font-size: small;\n font-weight: 400;\n text-align: center;\n user-select: none;\n -moz-user-select: none;\n -webkit-user-select: none;\n border-color: #444;\n border-radius: 2px;\n border-style: solid;\n border-width: thin;\n background-color: white;\n z-index: 128;\n cursor: pointer;\n}\n\n.igv-track-label:hover,\n.igv-track-label:focus,\n.igv-track-label:active {\n background-color: #e8e8e8;\n}\n\n.igv-track-label-popup-shim {\n padding-left: 8px;\n padding-right: 8px;\n padding-top: 4px;\n}\n\n.igv-center-line {\n display: none;\n pointer-events: none;\n position: absolute;\n top: 0;\n bottom: 0;\n left: 50%;\n transform: translateX(-50%);\n z-index: 8;\n user-select: none;\n -moz-user-select: none;\n -webkit-user-select: none;\n border-left-style: dashed;\n border-left-width: thin;\n border-right-style: dashed;\n border-right-width: thin;\n}\n\n.igv-center-line-wide {\n background-color: rgba(0, 0, 0, 0);\n border-left-color: rgba(127, 127, 127, 0.51);\n border-right-color: rgba(127, 127, 127, 0.51);\n}\n\n.igv-center-line-thin {\n background-color: rgba(0, 0, 0, 0);\n border-left-color: rgba(127, 127, 127, 0.51);\n border-right-color: rgba(0, 0, 0, 0);\n}\n\n.igv-cursor-guide-horizontal {\n display: none;\n pointer-events: none;\n user-select: none;\n -moz-user-select: none;\n -webkit-user-select: none;\n position: absolute;\n left: 0;\n right: 0;\n top: 50%;\n height: 1px;\n z-index: 1;\n margin-left: 50px;\n margin-right: 54px;\n border-top-style: dotted;\n border-top-width: thin;\n border-top-color: rgba(127, 127, 127, 0.76);\n}\n\n.igv-cursor-guide-vertical {\n pointer-events: none;\n user-select: none;\n -moz-user-select: none;\n -webkit-user-select: none;\n position: absolute;\n top: 0;\n bottom: 0;\n left: 50%;\n width: 1px;\n z-index: 1;\n border-left-style: dotted;\n border-left-width: thin;\n border-left-color: rgba(127, 127, 127, 0.76);\n display: none;\n}\n\n.igv-user-feedback {\n position: fixed;\n top: 50%;\n left: 50%;\n transform: translate(-50%, -50%);\n width: 512px;\n height: 360px;\n z-index: 2048;\n background-color: white;\n border-color: #a2a2a2;\n border-style: solid;\n border-width: thin;\n font-family: \"Open Sans\", sans-serif;\n font-size: medium;\n font-weight: 400;\n color: #444;\n display: flex;\n flex-direction: column;\n flex-wrap: nowrap;\n justify-content: flex-start;\n align-items: center;\n}\n.igv-user-feedback div:first-child {\n position: relative;\n height: 24px;\n width: 100%;\n background-color: white;\n border-bottom-color: #a2a2a2;\n border-bottom-style: solid;\n border-bottom-width: thin;\n}\n.igv-user-feedback div:first-child div {\n position: absolute;\n top: 2px;\n width: 16px;\n height: 16px;\n background-color: transparent;\n}\n.igv-user-feedback div:first-child div:first-child {\n left: 8px;\n}\n.igv-user-feedback div:first-child div:last-child {\n cursor: pointer;\n right: 8px;\n}\n.igv-user-feedback div:last-child {\n width: 100%;\n height: calc(100% - 24px);\n border-width: 0;\n}\n.igv-user-feedback div:last-child div {\n width: auto;\n height: auto;\n margin: 8px;\n}\n\n.igv-generic-dialog-container {\n position: absolute;\n top: 0;\n left: 0;\n width: 300px;\n height: 200px;\n border-color: #7F7F7F;\n border-radius: 4px;\n border-style: solid;\n border-width: thin;\n font-family: \"Open Sans\", sans-serif;\n font-size: medium;\n font-weight: 400;\n z-index: 2048;\n background-color: white;\n display: flex;\n flex-flow: column;\n flex-wrap: nowrap;\n justify-content: flex-start;\n align-items: center;\n}\n.igv-generic-dialog-container .igv-generic-dialog-header {\n display: flex;\n flex-flow: row;\n flex-wrap: nowrap;\n justify-content: flex-end;\n align-items: center;\n width: 100%;\n height: 24px;\n cursor: move;\n border-top-left-radius: 4px;\n border-top-right-radius: 4px;\n border-bottom-color: #7F7F7F;\n border-bottom-style: solid;\n border-bottom-width: thin;\n background-color: #eee;\n}\n.igv-generic-dialog-container .igv-generic-dialog-header div {\n margin-right: 4px;\n margin-bottom: 2px;\n height: 12px;\n width: 12px;\n color: #7F7F7F;\n}\n.igv-generic-dialog-container .igv-generic-dialog-header div:hover {\n cursor: pointer;\n color: #444;\n}\n.igv-generic-dialog-container .igv-generic-dialog-one-liner {\n color: #373737;\n width: 95%;\n height: 24px;\n line-height: 24px;\n text-align: left;\n margin-top: 8px;\n padding-left: 8px;\n overflow-wrap: break-word;\n background-color: white;\n}\n.igv-generic-dialog-container .igv-generic-dialog-label-input {\n margin-top: 8px;\n width: 95%;\n height: 24px;\n color: #373737;\n line-height: 24px;\n padding-left: 8px;\n background-color: white;\n display: flex;\n flex-flow: row;\n flex-wrap: nowrap;\n justify-content: flex-start;\n align-items: center;\n}\n.igv-generic-dialog-container .igv-generic-dialog-label-input div {\n width: 30%;\n height: 100%;\n font-size: 16px;\n text-align: right;\n padding-right: 8px;\n background-color: white;\n}\n.igv-generic-dialog-container .igv-generic-dialog-label-input input {\n display: block;\n height: 100%;\n width: 100%;\n padding-left: 4px;\n font-family: \"Open Sans\", sans-serif;\n font-weight: 400;\n color: #373737;\n text-align: left;\n outline: none;\n border-style: solid;\n border-width: thin;\n border-color: #7F7F7F;\n background-color: white;\n}\n.igv-generic-dialog-container .igv-generic-dialog-label-input input {\n width: 50%;\n font-size: 16px;\n}\n.igv-generic-dialog-container .igv-generic-dialog-input {\n margin-top: 8px;\n width: calc(100% - 16px);\n height: 24px;\n color: #373737;\n line-height: 24px;\n display: flex;\n flex-flow: row;\n flex-wrap: nowrap;\n justify-content: space-around;\n align-items: center;\n}\n.igv-generic-dialog-container .igv-generic-dialog-input input {\n display: block;\n height: 100%;\n width: 100%;\n padding-left: 4px;\n font-family: \"Open Sans\", sans-serif;\n font-weight: 400;\n color: #373737;\n text-align: left;\n outline: none;\n border-style: solid;\n border-width: thin;\n border-color: #7F7F7F;\n background-color: white;\n}\n.igv-generic-dialog-container .igv-generic-dialog-input input {\n font-size: 16px;\n}\n.igv-generic-dialog-container .igv-generic-dialog-ok-cancel {\n width: 100%;\n height: 28px;\n display: flex;\n flex-flow: row;\n flex-wrap: nowrap;\n justify-content: space-around;\n align-items: center;\n}\n.igv-generic-dialog-container .igv-generic-dialog-ok-cancel div {\n margin-top: 32px;\n color: white;\n font-family: \"Open Sans\", sans-serif;\n font-size: 14px;\n font-weight: 400;\n width: 75px;\n height: 28px;\n line-height: 28px;\n text-align: center;\n border-color: transparent;\n border-style: solid;\n border-width: thin;\n border-radius: 2px;\n}\n.igv-generic-dialog-container .igv-generic-dialog-ok-cancel div:first-child {\n margin-left: 32px;\n margin-right: 0;\n background-color: #5ea4e0;\n}\n.igv-generic-dialog-container .igv-generic-dialog-ok-cancel div:last-child {\n margin-left: 0;\n margin-right: 32px;\n background-color: #c4c4c4;\n}\n.igv-generic-dialog-container .igv-generic-dialog-ok-cancel div:first-child:hover {\n cursor: pointer;\n background-color: #3b5c7f;\n}\n.igv-generic-dialog-container .igv-generic-dialog-ok-cancel div:last-child:hover {\n cursor: pointer;\n background-color: #7f7f7f;\n}\n.igv-generic-dialog-container .igv-generic-dialog-ok {\n width: 100%;\n height: 36px;\n margin-top: 32px;\n display: flex;\n flex-flow: row;\n flex-wrap: nowrap;\n justify-content: space-around;\n align-items: center;\n}\n.igv-generic-dialog-container .igv-generic-dialog-ok div {\n width: 98px;\n height: 36px;\n line-height: 36px;\n text-align: center;\n color: white;\n font-family: \"Open Sans\", sans-serif;\n font-size: medium;\n font-weight: 400;\n border-color: white;\n border-style: solid;\n border-width: thin;\n border-radius: 4px;\n background-color: #2B81AF;\n}\n.igv-generic-dialog-container .igv-generic-dialog-ok div:hover {\n cursor: pointer;\n background-color: #25597f;\n}\n\n.igv-generic-container {\n position: absolute;\n top: 0;\n left: 0;\n z-index: 2048;\n background-color: white;\n cursor: pointer;\n display: flex;\n flex-direction: row;\n flex-wrap: wrap;\n justify-content: flex-start;\n align-items: center;\n}\n.igv-generic-container div:first-child {\n cursor: move;\n display: flex;\n flex-flow: row;\n flex-wrap: nowrap;\n justify-content: flex-end;\n align-items: center;\n height: 24px;\n width: 100%;\n background-color: #dddddd;\n}\n.igv-generic-container div:first-child i {\n display: block;\n color: #5f5f5f;\n cursor: pointer;\n width: 14px;\n height: 14px;\n margin-right: 8px;\n margin-bottom: 4px;\n}\n\n.igv-menu-popup {\n position: absolute;\n top: 0;\n left: 0;\n width: max-content;\n z-index: 4096;\n cursor: pointer;\n font-family: \"Open Sans\", sans-serif;\n font-size: small;\n font-weight: 400;\n color: #4b4b4b;\n background: white;\n border-radius: 4px;\n border-color: #7F7F7F;\n border-style: solid;\n border-width: thin;\n display: flex;\n flex-flow: column;\n flex-wrap: nowrap;\n justify-content: flex-start;\n align-items: flex-end;\n text-align: left;\n}\n.igv-menu-popup > div:not(:first-child) {\n width: 100%;\n}\n.igv-menu-popup > div:not(:first-child) > div {\n background: white;\n}\n.igv-menu-popup > div:not(:first-child) > div.context-menu {\n padding-left: 4px;\n padding-right: 4px;\n}\n.igv-menu-popup > div:not(:first-child) > div:last-child {\n border-bottom-left-radius: 4px;\n border-bottom-right-radius: 4px;\n border-bottom-color: transparent;\n border-bottom-style: solid;\n border-bottom-width: thin;\n}\n.igv-menu-popup > div:not(:first-child) > div:hover {\n background: #efefef;\n}\n\n.igv-menu-popup-shim {\n padding-left: 8px;\n padding-right: 8px;\n padding-bottom: 1px;\n padding-top: 1px;\n}\n\n.igv-menu-popup-header {\n position: relative;\n width: 100%;\n height: 24px;\n cursor: move;\n border-top-color: transparent;\n border-top-left-radius: 4px;\n border-top-right-radius: 4px;\n border-bottom-color: #7F7F7F;\n border-bottom-style: solid;\n border-bottom-width: thin;\n background-color: #eee;\n display: flex;\n flex-flow: row;\n flex-wrap: nowrap;\n justify-content: flex-end;\n align-items: center;\n}\n.igv-menu-popup-header div {\n margin-right: 4px;\n height: 12px;\n width: 12px;\n color: #7F7F7F;\n}\n.igv-menu-popup-header div:hover {\n cursor: pointer;\n color: #444;\n}\n\n.igv-menu-popup-check-container {\n display: flex;\n flex-flow: row;\n flex-wrap: nowrap;\n justify-content: flex-start;\n align-items: center;\n width: 100%;\n height: 20px;\n margin-right: 4px;\n background-color: transparent;\n}\n.igv-menu-popup-check-container div {\n padding-top: 2px;\n padding-left: 8px;\n}\n.igv-menu-popup-check-container div:first-child {\n position: relative;\n width: 12px;\n height: 12px;\n}\n.igv-menu-popup-check-container div:first-child svg {\n position: absolute;\n width: 12px;\n height: 12px;\n}\n\n.igv-user-feedback {\n position: fixed;\n top: 50%;\n left: 50%;\n transform: translate(-50%, -50%);\n width: 512px;\n height: 360px;\n z-index: 2048;\n background-color: white;\n border-color: #a2a2a2;\n border-style: solid;\n border-width: thin;\n font-family: \"Open Sans\", sans-serif;\n font-size: medium;\n font-weight: 400;\n color: #444;\n display: flex;\n flex-direction: column;\n flex-wrap: nowrap;\n justify-content: flex-start;\n align-items: center;\n}\n.igv-user-feedback div:first-child {\n position: relative;\n height: 24px;\n width: 100%;\n background-color: white;\n border-bottom-color: #a2a2a2;\n border-bottom-style: solid;\n border-bottom-width: thin;\n}\n.igv-user-feedback div:first-child div {\n position: absolute;\n top: 2px;\n width: 16px;\n height: 16px;\n background-color: transparent;\n}\n.igv-user-feedback div:first-child div:first-child {\n left: 8px;\n}\n.igv-user-feedback div:first-child div:last-child {\n cursor: pointer;\n right: 8px;\n}\n.igv-user-feedback div:last-child {\n width: 100%;\n height: calc(100% - 24px);\n border-width: 0;\n}\n.igv-user-feedback div:last-child div {\n width: auto;\n height: auto;\n margin: 8px;\n}\n\n.igv-loading-spinner-container {\n z-index: 1024;\n position: absolute;\n top: 50%;\n left: 50%;\n transform: translate(-50%, -50%);\n width: 32px;\n height: 32px;\n display: flex;\n flex-direction: row;\n flex-wrap: nowrap;\n justify-content: center;\n align-items: center;\n}\n.igv-loading-spinner-container > div {\n box-sizing: border-box;\n width: 100%;\n height: 100%;\n border-radius: 50%;\n border: 4px solid rgba(128, 128, 128, 0.5);\n border-top-color: rgb(255, 255, 255);\n animation: spin 1s ease-in-out infinite;\n -webkit-animation: spin 1s ease-in-out infinite;\n}\n\n@keyframes spin {\n to {\n -webkit-transform: rotate(360deg);\n transform: rotate(360deg);\n }\n}\n@-webkit-keyframes spin {\n to {\n -webkit-transform: rotate(360deg);\n transform: rotate(360deg);\n }\n}\n.igv-roi-menu-next-gen {\n position: absolute;\n z-index: 512;\n font-family: \"Open Sans\", sans-serif;\n font-size: small;\n font-weight: 400;\n color: #4b4b4b;\n background-color: white;\n width: 192px;\n border-radius: 4px;\n border-color: #7F7F7F;\n border-style: solid;\n border-width: thin;\n display: flex;\n flex-direction: column;\n flex-wrap: nowrap;\n justify-content: flex-start;\n align-items: stretch;\n}\n.igv-roi-menu-next-gen > div:first-child {\n height: 24px;\n border-top-color: transparent;\n border-top-left-radius: 4px;\n border-top-right-radius: 4px;\n border-bottom-color: #7F7F7F;\n border-bottom-style: solid;\n border-bottom-width: thin;\n background-color: #eee;\n display: flex;\n flex-flow: row;\n flex-wrap: nowrap;\n justify-content: flex-end;\n align-items: center;\n}\n.igv-roi-menu-next-gen > div:first-child > div {\n margin-right: 4px;\n height: 12px;\n width: 12px;\n color: #7F7F7F;\n}\n.igv-roi-menu-next-gen > div:first-child > div:hover {\n cursor: pointer;\n color: #444;\n}\n.igv-roi-menu-next-gen > div:last-child {\n background-color: white;\n border-bottom-left-radius: 4px;\n border-bottom-right-radius: 4px;\n border-bottom-color: transparent;\n border-bottom-style: solid;\n border-bottom-width: 0;\n display: flex;\n flex-direction: column;\n flex-wrap: nowrap;\n justify-content: flex-start;\n align-items: stretch;\n text-align: start;\n vertical-align: middle;\n}\n.igv-roi-menu-next-gen > div:last-child > div {\n height: 24px;\n padding-left: 4px;\n border-bottom-style: solid;\n border-bottom-width: thin;\n border-bottom-color: #7f7f7f;\n}\n.igv-roi-menu-next-gen > div:last-child > div:not(:first-child):hover {\n background-color: rgba(127, 127, 127, 0.1);\n}\n.igv-roi-menu-next-gen > div:last-child div:first-child {\n font-style: italic;\n text-align: center;\n padding-right: 4px;\n white-space: nowrap;\n overflow: hidden;\n text-overflow: ellipsis;\n}\n.igv-roi-menu-next-gen > div:last-child > div:last-child {\n border-bottom-width: 0;\n border-bottom-color: transparent;\n}\n\n.igv-roi-placeholder {\n font-style: normal;\n color: rgba(75, 75, 75, 0.6);\n}\n\n.igv-roi-table {\n position: absolute;\n z-index: 1024;\n width: fit-content;\n border-color: #7f7f7f;\n border-radius: 4px;\n border-style: solid;\n border-width: thin;\n font-family: \"Open Sans\", sans-serif;\n font-size: 12px;\n font-weight: 400;\n background-color: white;\n display: flex;\n flex-flow: column;\n flex-wrap: nowrap;\n justify-content: flex-start;\n align-items: stretch;\n cursor: default;\n}\n.igv-roi-table > div {\n height: 24px;\n font-size: 14px;\n text-align: start;\n vertical-align: middle;\n line-height: 24px;\n}\n.igv-roi-table > div:first-child {\n border-color: transparent;\n border-top-left-radius: 4px;\n border-top-right-radius: 4px;\n border-top-width: 0;\n border-bottom-color: #7f7f7f;\n border-bottom-style: solid;\n border-bottom-width: thin;\n background-color: #eee;\n cursor: move;\n display: flex;\n flex-flow: row;\n flex-wrap: nowrap;\n justify-content: space-between;\n align-items: center;\n}\n.igv-roi-table > div:first-child > div:first-child {\n text-align: center;\n width: calc(100% - 4px - 12px);\n}\n.igv-roi-table > div:first-child > div:last-child {\n margin-right: 4px;\n margin-bottom: 2px;\n height: 12px;\n width: 12px;\n color: #7f7f7f;\n}\n.igv-roi-table > div:first-child > div:last-child > svg {\n display: block;\n}\n.igv-roi-table > div:first-child > div:last-child:hover {\n cursor: pointer;\n color: #444;\n}\n.igv-roi-table > .igv-roi-table-description {\n height: fit-content;\n padding: 4px;\n margin-left: 4px;\n display: flex;\n flex-flow: row;\n flex-wrap: nowrap;\n word-break: break-all;\n max-height: 300px;\n overflow-y: auto;\n}\n.igv-roi-table > .igv-roi-table-goto-explainer {\n margin-left: 4px;\n color: #7F7F7F;\n font-style: italic;\n border-top: solid lightgray;\n margin-top: 5px;\n}\n.igv-roi-table > .igv-roi-table-column-titles {\n height: 24px;\n display: flex;\n flex-flow: row;\n flex-wrap: nowrap;\n justify-content: stretch;\n align-items: stretch;\n padding-right: 16px;\n background-color: white;\n border-top-color: #7f7f7f;\n border-top-style: solid;\n border-top-width: thin;\n border-bottom-color: #7f7f7f;\n border-bottom-style: solid;\n border-bottom-width: thin;\n}\n.igv-roi-table > .igv-roi-table-column-titles > div {\n font-size: 14px;\n vertical-align: middle;\n line-height: 24px;\n text-align: left;\n margin-left: 4px;\n height: 24px;\n white-space: nowrap;\n overflow: hidden;\n text-overflow: ellipsis;\n border-right-color: #7f7f7f;\n border-right-style: solid;\n border-right-width: thin;\n}\n.igv-roi-table > .igv-roi-table-column-titles > div:last-child {\n border-right: unset;\n}\n.igv-roi-table > .igv-roi-table-row-container {\n overflow: scroll;\n min-height: 72px;\n height: 144px;\n max-height: 480px;\n background-color: white;\n display: flex;\n flex-flow: column;\n flex-wrap: nowrap;\n justify-content: flex-start;\n align-items: stretch;\n}\n.igv-roi-table > .igv-roi-table-row-container > .igv-roi-table-row {\n height: 24px;\n display: flex;\n flex-flow: row;\n flex-wrap: nowrap;\n justify-content: stretch;\n align-items: stretch;\n}\n.igv-roi-table > .igv-roi-table-row-container > .igv-roi-table-row > div {\n font-size: 14px;\n vertical-align: middle;\n line-height: 24px;\n text-align: left;\n margin-left: 4px;\n height: 24px;\n white-space: nowrap;\n overflow: hidden;\n text-overflow: ellipsis;\n border-right-color: transparent;\n border-right-style: solid;\n border-right-width: thin;\n}\n.igv-roi-table > .igv-roi-table-row-container > .igv-roi-table-row > div:last-child {\n border-right: unset;\n}\n.igv-roi-table > .igv-roi-table-row-container > .igv-roi-table-row-hover {\n background-color: rgba(0, 0, 0, 0.04);\n}\n.igv-roi-table > div:last-child {\n height: 32px;\n line-height: 32px;\n border-top-color: #7f7f7f;\n border-top-style: solid;\n border-top-width: thin;\n border-bottom-color: transparent;\n border-bottom-left-radius: 4px;\n border-bottom-right-radius: 4px;\n border-bottom-width: 0;\n background-color: #eee;\n display: flex;\n flex-flow: row;\n flex-wrap: nowrap;\n justify-content: space-around;\n align-items: center;\n}\n\n.igv-roi-table-row-selected {\n background-color: rgba(0, 0, 0, 0.125);\n}\n\n.igv-roi-table-button {\n cursor: pointer;\n height: 20px;\n user-select: none;\n line-height: 20px;\n text-align: center;\n vertical-align: middle;\n font-family: \"Open Sans\", sans-serif;\n font-size: 13px;\n font-weight: 400;\n color: black;\n padding-left: 6px;\n padding-right: 6px;\n background-color: rgb(239, 239, 239);\n border-color: black;\n border-style: solid;\n border-width: thin;\n border-radius: 3px;\n}\n\n.igv-roi-table-button:hover {\n font-weight: 400;\n background-color: rgba(0, 0, 0, 0.13);\n}\n\n.igv-roi-region {\n z-index: 64;\n position: absolute;\n top: 0;\n bottom: 0;\n pointer-events: none;\n overflow: visible;\n margin-top: 44px;\n display: flex;\n flex-direction: column;\n flex-wrap: nowrap;\n justify-content: flex-start;\n align-items: stretch;\n}\n.igv-roi-region > div {\n position: relative;\n width: 100%;\n height: 8px;\n pointer-events: auto;\n}\n\n.igv-roi-menu {\n position: absolute;\n z-index: 1024;\n width: 144px;\n border-color: #7f7f7f;\n border-radius: 4px;\n border-style: solid;\n border-width: thin;\n font-family: \"Open Sans\", sans-serif;\n background-color: white;\n display: flex;\n flex-flow: column;\n flex-wrap: nowrap;\n justify-content: flex-start;\n align-items: stretch;\n}\n.igv-roi-menu > div:not(:last-child) {\n border-bottom-color: rgba(128, 128, 128, 0.5);\n border-bottom-style: solid;\n border-bottom-width: thin;\n}\n.igv-roi-menu > div:first-child {\n border-top-left-radius: 4px;\n border-top-right-radius: 4px;\n border-top-color: transparent;\n border-top-style: solid;\n border-top-width: 0;\n}\n.igv-roi-menu > div:last-child {\n border-bottom-left-radius: 4px;\n border-bottom-right-radius: 4px;\n border-bottom-color: transparent;\n border-bottom-style: solid;\n border-bottom-width: 0;\n}\n\n.igv-roi-menu-row {\n height: 24px;\n padding-left: 8px;\n font-size: small;\n text-align: start;\n vertical-align: middle;\n line-height: 24px;\n background-color: white;\n}\n\n.igv-roi-menu-row-edit-description {\n width: -webkit-fill-available;\n font-size: small;\n text-align: start;\n vertical-align: middle;\n background-color: white;\n padding-left: 4px;\n padding-right: 4px;\n padding-bottom: 4px;\n display: flex;\n flex-direction: column;\n flex-wrap: nowrap;\n justify-content: stretch;\n align-items: stretch;\n}\n.igv-roi-menu-row-edit-description > label {\n margin-left: 2px;\n margin-bottom: 0;\n display: block;\n width: -webkit-fill-available;\n}\n.igv-roi-menu-row-edit-description > input {\n display: block;\n margin-left: 2px;\n margin-right: 2px;\n margin-bottom: 1px;\n width: -webkit-fill-available;\n}\n\n.igv-container {\n position: relative;\n display: flex;\n flex-direction: column;\n flex-wrap: nowrap;\n justify-content: flex-start;\n align-items: flex-start;\n padding-top: 4px;\n user-select: none;\n -webkit-user-select: none;\n -ms-user-select: none;\n}\n\n.igv-viewport {\n position: relative;\n margin-top: 5px;\n line-height: 1;\n overflow-x: hidden;\n overflow-y: hidden;\n}\n\n.igv-viewport-content {\n position: relative;\n width: 100%;\n}\n.igv-viewport-content > canvas {\n position: relative;\n display: block;\n}\n\n.igv-column-container {\n position: relative;\n display: flex;\n flex-direction: row;\n flex-wrap: nowrap;\n justify-content: flex-start;\n align-items: stretch;\n width: 100%;\n}\n\n.igv-column-shim {\n width: 1px;\n margin-left: 2px;\n margin-right: 2px;\n background-color: #545453;\n}\n\n.igv-column {\n position: relative;\n position: relative;\n display: flex;\n flex-direction: column;\n flex-wrap: nowrap;\n justify-content: flex-start;\n align-items: flex-start;\n box-sizing: border-box;\n height: 100%;\n}\n\n.igv-axis-column {\n position: relative;\n display: flex;\n flex-direction: column;\n flex-wrap: nowrap;\n justify-content: flex-start;\n align-items: flex-start;\n box-sizing: border-box;\n height: 100%;\n width: 50px;\n}\n.igv-axis-column > div {\n margin-top: 5px;\n width: 100%;\n}\n\n.igv-sample-name-column {\n position: relative;\n display: flex;\n flex-direction: column;\n flex-wrap: nowrap;\n justify-content: flex-start;\n align-items: flex-start;\n box-sizing: border-box;\n height: 100%;\n}\n\n.igv-scrollbar-column {\n position: relative;\n display: flex;\n flex-direction: column;\n flex-wrap: nowrap;\n justify-content: flex-start;\n align-items: flex-start;\n box-sizing: border-box;\n height: 100%;\n width: 14px;\n}\n.igv-scrollbar-column > div {\n position: relative;\n margin-top: 5px;\n width: 14px;\n}\n.igv-scrollbar-column > div > div {\n cursor: pointer;\n position: absolute;\n top: 0;\n left: 2px;\n width: 8px;\n border-width: 1px;\n border-style: solid;\n border-color: #c4c4c4;\n border-top-left-radius: 4px;\n border-top-right-radius: 4px;\n border-bottom-left-radius: 4px;\n border-bottom-right-radius: 4px;\n}\n.igv-scrollbar-column > div > div:hover {\n background-color: #c4c4c4;\n}\n\n.igv-track-drag-column {\n position: relative;\n display: flex;\n flex-direction: column;\n flex-wrap: nowrap;\n justify-content: flex-start;\n align-items: flex-start;\n box-sizing: border-box;\n height: 100%;\n width: 12px;\n background-color: white;\n}\n.igv-track-drag-column > .igv-track-drag-handle {\n z-index: 512;\n position: relative;\n cursor: pointer;\n margin-top: 5px;\n width: 100%;\n border-style: solid;\n border-width: 0;\n border-top-right-radius: 6px;\n border-bottom-right-radius: 6px;\n background-color: #c4c4c4;\n}\n.igv-track-drag-column .igv-track-drag-handle-hover {\n background-color: #787878;\n}\n.igv-track-drag-column > .igv-track-drag-shim {\n position: relative;\n margin-top: 5px;\n width: 100%;\n border-style: solid;\n border-width: 0;\n}\n\n.igv-gear-menu-column {\n position: relative;\n display: flex;\n flex-direction: column;\n flex-wrap: nowrap;\n justify-content: flex-start;\n align-items: flex-start;\n box-sizing: border-box;\n height: 100%;\n width: 28px;\n}\n.igv-gear-menu-column > div {\n display: flex;\n flex-direction: column;\n flex-wrap: nowrap;\n justify-content: flex-start;\n align-items: center;\n margin-top: 5px;\n width: 100%;\n background: white;\n}\n.igv-gear-menu-column > div > div {\n position: relative;\n margin-top: 4px;\n width: 16px;\n height: 16px;\n color: #7F7F7F;\n}\n.igv-gear-menu-column > div > div:hover {\n cursor: pointer;\n color: #444;\n}\n\n/*# sourceMappingURL=dom.css.map */\n';
62098
+ var css = '.igv-navbar {\n display: flex;\n flex-flow: row;\n flex-wrap: nowrap;\n justify-content: space-between;\n align-items: center;\n box-sizing: border-box;\n width: 100%;\n color: #444;\n font-size: 12px;\n font-family: \"Open Sans\", sans-serif;\n font-weight: 400;\n line-height: 32px;\n padding-left: 8px;\n padding-right: 8px;\n margin-top: 2px;\n margin-bottom: 6px;\n height: 32px;\n border-style: solid;\n border-radius: 3px;\n border-width: thin;\n border-color: #bfbfbf;\n background-color: #f3f3f3;\n}\n.igv-navbar .igv-navbar-left-container {\n display: flex;\n flex-flow: row;\n flex-wrap: nowrap;\n justify-content: space-between;\n align-items: center;\n height: 32px;\n line-height: 32px;\n}\n.igv-navbar .igv-navbar-left-container .igv-logo {\n width: 34px;\n height: 32px;\n margin-right: 8px;\n}\n.igv-navbar .igv-navbar-left-container .igv-current-genome {\n height: 32px;\n margin-left: 4px;\n margin-right: 4px;\n user-select: none;\n line-height: 32px;\n vertical-align: middle;\n text-align: center;\n}\n.igv-navbar .igv-navbar-left-container .igv-navbar-genomic-location {\n display: flex;\n flex-flow: row;\n flex-wrap: nowrap;\n justify-content: space-between;\n align-items: center;\n height: 100%;\n}\n.igv-navbar .igv-navbar-left-container .igv-navbar-genomic-location .igv-chromosome-select-widget-container {\n display: flex;\n flex-flow: column;\n flex-wrap: nowrap;\n justify-content: space-around;\n align-items: center;\n height: 100%;\n width: 125px;\n margin-right: 4px;\n}\n.igv-navbar .igv-navbar-left-container .igv-navbar-genomic-location .igv-chromosome-select-widget-container select {\n display: block;\n cursor: pointer;\n width: 100px;\n height: 75%;\n outline: none;\n font-size: 12px;\n font-family: \"Open Sans\", sans-serif;\n font-weight: 400;\n}\n.igv-navbar .igv-navbar-left-container .igv-navbar-genomic-location .igv-locus-size-group {\n display: flex;\n flex-flow: row;\n flex-wrap: nowrap;\n justify-content: space-between;\n align-items: center;\n margin-left: 8px;\n height: 22px;\n}\n.igv-navbar .igv-navbar-left-container .igv-navbar-genomic-location .igv-locus-size-group .igv-search-container {\n display: flex;\n flex-flow: row;\n flex-wrap: nowrap;\n justify-content: flex-start;\n align-items: center;\n width: 210px;\n height: 22px;\n line-height: 22px;\n}\n.igv-navbar .igv-navbar-left-container .igv-navbar-genomic-location .igv-locus-size-group .igv-search-container input.igv-search-input {\n cursor: text;\n width: 85%;\n height: 22px;\n line-height: 22px;\n font-size: 12px;\n font-family: \"Open Sans\", sans-serif;\n font-weight: 400;\n text-align: left;\n padding-left: 8px;\n margin-right: 8px;\n outline: none;\n border-style: solid;\n border-radius: 3px;\n border-width: thin;\n border-color: #bfbfbf;\n background-color: white;\n}\n.igv-navbar .igv-navbar-left-container .igv-navbar-genomic-location .igv-locus-size-group .igv-search-container .igv-search-icon-container {\n cursor: pointer;\n height: 16px;\n width: 16px;\n}\n.igv-navbar .igv-navbar-left-container .igv-navbar-genomic-location .igv-locus-size-group .igv-windowsize-panel-container {\n margin-left: 4px;\n user-select: none;\n}\n.igv-navbar .igv-navbar-right-container {\n display: flex;\n flex-flow: row;\n flex-wrap: nowrap;\n justify-content: space-between;\n align-items: center;\n height: 32px;\n line-height: 32px;\n}\n.igv-navbar .igv-navbar-right-container .igv-navbar-toggle-button-container {\n display: flex;\n flex-flow: row;\n flex-wrap: nowrap;\n justify-content: space-between;\n align-items: center;\n height: 100%;\n}\n.igv-navbar .igv-navbar-right-container .igv-navbar-toggle-button-container div {\n margin-left: 0;\n margin-right: 4px;\n}\n.igv-navbar .igv-navbar-right-container .igv-navbar-toggle-button-container div:last-child {\n margin-left: 0;\n margin-right: 0;\n}\n.igv-navbar .igv-navbar-right-container .igv-navbar-toggle-button-container-750 {\n display: none;\n}\n.igv-navbar .igv-navbar-right-container .igv-zoom-widget {\n color: #737373;\n font-size: 18px;\n height: 32px;\n line-height: 32px;\n margin-left: 8px;\n user-select: none;\n display: flex;\n flex-flow: row;\n flex-wrap: nowrap;\n justify-content: flex-end;\n align-items: center;\n}\n.igv-navbar .igv-navbar-right-container .igv-zoom-widget div {\n cursor: pointer;\n margin-left: unset;\n margin-right: unset;\n}\n.igv-navbar .igv-navbar-right-container .igv-zoom-widget div:first-child {\n height: 24px;\n width: 24px;\n margin-left: unset;\n margin-right: 8px;\n}\n.igv-navbar .igv-navbar-right-container .igv-zoom-widget div:last-child {\n height: 24px;\n width: 24px;\n margin-left: 8px;\n margin-right: unset;\n}\n.igv-navbar .igv-navbar-right-container .igv-zoom-widget div:nth-child(even) {\n display: block;\n height: fit-content;\n}\n.igv-navbar .igv-navbar-right-container .igv-zoom-widget input {\n display: block;\n width: 125px;\n}\n.igv-navbar .igv-navbar-right-container .igv-zoom-widget svg {\n display: block;\n}\n.igv-navbar .igv-navbar-right-container .igv-zoom-widget-900 {\n color: #737373;\n font-size: 18px;\n height: 32px;\n line-height: 32px;\n margin-left: 8px;\n user-select: none;\n display: flex;\n flex-flow: row;\n flex-wrap: nowrap;\n justify-content: flex-end;\n align-items: center;\n}\n.igv-navbar .igv-navbar-right-container .igv-zoom-widget-900 div {\n cursor: pointer;\n margin-left: unset;\n margin-right: unset;\n}\n.igv-navbar .igv-navbar-right-container .igv-zoom-widget-900 div:first-child {\n height: 24px;\n width: 24px;\n margin-left: unset;\n margin-right: 8px;\n}\n.igv-navbar .igv-navbar-right-container .igv-zoom-widget-900 div:last-child {\n height: 24px;\n width: 24px;\n margin-left: 8px;\n margin-right: unset;\n}\n.igv-navbar .igv-navbar-right-container .igv-zoom-widget-900 div:nth-child(even) {\n width: 0;\n height: 0;\n display: none;\n}\n.igv-navbar .igv-navbar-right-container .igv-zoom-widget-900 input {\n width: 0;\n height: 0;\n display: none;\n}\n.igv-navbar .igv-navbar-right-container .igv-zoom-widget-900 svg {\n display: block;\n}\n.igv-navbar .igv-navbar-right-container .igv-zoom-widget-hidden {\n display: none;\n}\n\n.igv-navbar-button {\n display: block;\n box-sizing: unset;\n padding-left: 6px;\n padding-right: 6px;\n height: 18px;\n text-transform: capitalize;\n user-select: none;\n line-height: 18px;\n text-align: center;\n vertical-align: middle;\n font-family: \"Open Sans\", sans-serif;\n font-size: 11px;\n font-weight: 200;\n color: #737373;\n background-color: #f3f3f3;\n border-color: #737373;\n border-style: solid;\n border-width: thin;\n border-radius: 6px;\n}\n\n.igv-navbar-button-clicked {\n color: white;\n background-color: #737373;\n}\n\n.igv-navbar-button:hover {\n cursor: pointer;\n}\n\n.igv-zoom-in-notice-container {\n z-index: 1024;\n position: absolute;\n top: 8px;\n left: 50%;\n transform: translate(-50%, 0%);\n display: flex;\n flex-direction: row;\n flex-wrap: nowrap;\n justify-content: center;\n align-items: center;\n background-color: white;\n}\n.igv-zoom-in-notice-container > div {\n padding-left: 4px;\n padding-right: 4px;\n padding-top: 2px;\n padding-bottom: 2px;\n width: 100%;\n height: 100%;\n font-family: \"Open Sans\", sans-serif;\n font-size: 14px;\n font-weight: 400;\n color: #3f3f3f;\n}\n\n.igv-zoom-in-notice {\n position: absolute;\n top: 10px;\n left: 50%;\n}\n.igv-zoom-in-notice div {\n position: relative;\n left: -50%;\n font-family: \"Open Sans\", sans-serif;\n font-size: medium;\n font-weight: 400;\n color: #3f3f3f;\n background-color: rgba(255, 255, 255, 0.51);\n z-index: 64;\n}\n\n.igv-container-spinner {\n position: absolute;\n top: 90%;\n left: 50%;\n transform: translate(-50%, -50%);\n z-index: 1024;\n width: 24px;\n height: 24px;\n pointer-events: none;\n color: #737373;\n}\n\n.igv-multi-locus-close-button {\n position: absolute;\n top: 2px;\n right: 0;\n padding-left: 2px;\n padding-right: 2px;\n width: 12px;\n height: 12px;\n color: #666666;\n background-color: white;\n z-index: 1000;\n}\n.igv-multi-locus-close-button > svg {\n vertical-align: top;\n}\n\n.igv-multi-locus-close-button:hover {\n cursor: pointer;\n color: #434343;\n}\n\n.igv-multi-locus-ruler-label {\n z-index: 64;\n position: absolute;\n top: 2px;\n left: 0;\n width: 100%;\n height: 12px;\n display: flex;\n flex-flow: row;\n flex-wrap: nowrap;\n justify-content: center;\n align-items: center;\n}\n.igv-multi-locus-ruler-label > div {\n font-family: \"Open Sans\", sans-serif;\n font-size: 12px;\n color: rgb(16, 16, 16);\n background-color: white;\n}\n.igv-multi-locus-ruler-label > div {\n cursor: pointer;\n}\n\n.igv-multi-locus-ruler-label-square-dot {\n z-index: 64;\n position: absolute;\n left: 50%;\n top: 5%;\n transform: translate(-50%, 0%);\n background-color: white;\n display: flex;\n flex-flow: row;\n flex-wrap: nowrap;\n justify-content: flex-start;\n align-items: center;\n}\n.igv-multi-locus-ruler-label-square-dot > div:first-child {\n width: 14px;\n height: 14px;\n}\n.igv-multi-locus-ruler-label-square-dot > div:last-child {\n margin-left: 16px;\n font-family: \"Open Sans\", sans-serif;\n font-size: 14px;\n font-weight: 400;\n color: rgb(16, 16, 16);\n}\n\n.igv-ruler-sweeper {\n display: none;\n pointer-events: none;\n position: absolute;\n top: 26px;\n bottom: 0;\n left: 0;\n width: 0;\n z-index: 99999;\n background-color: rgba(68, 134, 247, 0.25);\n}\n\n.igv-ruler-tooltip {\n pointer-events: none;\n z-index: 128;\n position: absolute;\n top: 0;\n left: 0;\n width: 1px;\n height: 32px;\n background-color: transparent;\n display: flex;\n flex-flow: row;\n flex-wrap: nowrap;\n justify-content: flex-start;\n align-items: center;\n}\n.igv-ruler-tooltip > div {\n pointer-events: none;\n width: 128px;\n height: auto;\n padding: 1px;\n color: #373737;\n font-size: 10px;\n font-family: \"Open Sans\", sans-serif;\n font-weight: 400;\n background-color: white;\n border-style: solid;\n border-width: thin;\n border-color: #373737;\n}\n\n.igv-track-label {\n position: absolute;\n left: 8px;\n top: 8px;\n width: auto;\n height: auto;\n max-width: 50%;\n padding-left: 4px;\n padding-right: 4px;\n white-space: nowrap;\n overflow: hidden;\n text-overflow: ellipsis;\n font-family: \"Open Sans\", sans-serif;\n font-size: small;\n font-weight: 400;\n text-align: center;\n user-select: none;\n -moz-user-select: none;\n -webkit-user-select: none;\n border-color: #444;\n border-radius: 2px;\n border-style: solid;\n border-width: thin;\n background-color: white;\n z-index: 128;\n cursor: pointer;\n}\n\n.igv-track-label:hover,\n.igv-track-label:focus,\n.igv-track-label:active {\n background-color: #e8e8e8;\n}\n\n.igv-track-label-popup-shim {\n padding-left: 8px;\n padding-right: 8px;\n padding-top: 4px;\n}\n\n.igv-center-line {\n display: none;\n pointer-events: none;\n position: absolute;\n top: 0;\n bottom: 0;\n left: 50%;\n transform: translateX(-50%);\n z-index: 8;\n user-select: none;\n -moz-user-select: none;\n -webkit-user-select: none;\n border-left-style: dashed;\n border-left-width: thin;\n border-right-style: dashed;\n border-right-width: thin;\n}\n\n.igv-center-line-wide {\n background-color: rgba(0, 0, 0, 0);\n border-left-color: rgba(127, 127, 127, 0.51);\n border-right-color: rgba(127, 127, 127, 0.51);\n}\n\n.igv-center-line-thin {\n background-color: rgba(0, 0, 0, 0);\n border-left-color: rgba(127, 127, 127, 0.51);\n border-right-color: rgba(0, 0, 0, 0);\n}\n\n.igv-cursor-guide-horizontal {\n display: none;\n pointer-events: none;\n user-select: none;\n -moz-user-select: none;\n -webkit-user-select: none;\n position: absolute;\n left: 0;\n right: 0;\n top: 50%;\n height: 1px;\n z-index: 1;\n margin-left: 50px;\n margin-right: 54px;\n border-top-style: dotted;\n border-top-width: thin;\n border-top-color: rgba(127, 127, 127, 0.76);\n}\n\n.igv-cursor-guide-vertical {\n pointer-events: none;\n user-select: none;\n -moz-user-select: none;\n -webkit-user-select: none;\n position: absolute;\n top: 0;\n bottom: 0;\n left: 50%;\n width: 1px;\n z-index: 1;\n border-left-style: dotted;\n border-left-width: thin;\n border-left-color: rgba(127, 127, 127, 0.76);\n display: none;\n}\n\n.igv-user-feedback {\n position: fixed;\n top: 50%;\n left: 50%;\n transform: translate(-50%, -50%);\n width: 512px;\n height: 360px;\n z-index: 2048;\n background-color: white;\n border-color: #a2a2a2;\n border-style: solid;\n border-width: thin;\n font-family: \"Open Sans\", sans-serif;\n font-size: medium;\n font-weight: 400;\n color: #444;\n display: flex;\n flex-direction: column;\n flex-wrap: nowrap;\n justify-content: flex-start;\n align-items: center;\n}\n.igv-user-feedback div:first-child {\n position: relative;\n height: 24px;\n width: 100%;\n background-color: white;\n border-bottom-color: #a2a2a2;\n border-bottom-style: solid;\n border-bottom-width: thin;\n}\n.igv-user-feedback div:first-child div {\n position: absolute;\n top: 2px;\n width: 16px;\n height: 16px;\n background-color: transparent;\n}\n.igv-user-feedback div:first-child div:first-child {\n left: 8px;\n}\n.igv-user-feedback div:first-child div:last-child {\n cursor: pointer;\n right: 8px;\n}\n.igv-user-feedback div:last-child {\n width: 100%;\n height: calc(100% - 24px);\n border-width: 0;\n}\n.igv-user-feedback div:last-child div {\n width: auto;\n height: auto;\n margin: 8px;\n}\n\n.igv-generic-dialog-container {\n position: absolute;\n top: 0;\n left: 0;\n width: 300px;\n height: 200px;\n border-color: #7F7F7F;\n border-radius: 4px;\n border-style: solid;\n border-width: thin;\n font-family: \"Open Sans\", sans-serif;\n font-size: medium;\n font-weight: 400;\n z-index: 2048;\n background-color: white;\n display: flex;\n flex-flow: column;\n flex-wrap: nowrap;\n justify-content: flex-start;\n align-items: center;\n}\n.igv-generic-dialog-container .igv-generic-dialog-header {\n display: flex;\n flex-flow: row;\n flex-wrap: nowrap;\n justify-content: flex-end;\n align-items: center;\n width: 100%;\n height: 24px;\n cursor: move;\n border-top-left-radius: 4px;\n border-top-right-radius: 4px;\n border-bottom-color: #7F7F7F;\n border-bottom-style: solid;\n border-bottom-width: thin;\n background-color: #eee;\n}\n.igv-generic-dialog-container .igv-generic-dialog-header div {\n margin-right: 4px;\n margin-bottom: 2px;\n height: 12px;\n width: 12px;\n color: #7F7F7F;\n}\n.igv-generic-dialog-container .igv-generic-dialog-header div:hover {\n cursor: pointer;\n color: #444;\n}\n.igv-generic-dialog-container .igv-generic-dialog-one-liner {\n color: #373737;\n width: 95%;\n height: 24px;\n line-height: 24px;\n text-align: left;\n margin-top: 8px;\n padding-left: 8px;\n overflow-wrap: break-word;\n background-color: white;\n}\n.igv-generic-dialog-container .igv-generic-dialog-label-input {\n margin-top: 8px;\n width: 95%;\n height: 24px;\n color: #373737;\n line-height: 24px;\n padding-left: 8px;\n background-color: white;\n display: flex;\n flex-flow: row;\n flex-wrap: nowrap;\n justify-content: flex-start;\n align-items: center;\n}\n.igv-generic-dialog-container .igv-generic-dialog-label-input div {\n width: 30%;\n height: 100%;\n font-size: 16px;\n text-align: right;\n padding-right: 8px;\n background-color: white;\n}\n.igv-generic-dialog-container .igv-generic-dialog-label-input input {\n display: block;\n height: 100%;\n width: 100%;\n padding-left: 4px;\n font-family: \"Open Sans\", sans-serif;\n font-weight: 400;\n color: #373737;\n text-align: left;\n outline: none;\n border-style: solid;\n border-width: thin;\n border-color: #7F7F7F;\n background-color: white;\n}\n.igv-generic-dialog-container .igv-generic-dialog-label-input input {\n width: 50%;\n font-size: 16px;\n}\n.igv-generic-dialog-container .igv-generic-dialog-input {\n margin-top: 8px;\n width: calc(100% - 16px);\n height: 24px;\n color: #373737;\n line-height: 24px;\n display: flex;\n flex-flow: row;\n flex-wrap: nowrap;\n justify-content: space-around;\n align-items: center;\n}\n.igv-generic-dialog-container .igv-generic-dialog-input input {\n display: block;\n height: 100%;\n width: 100%;\n padding-left: 4px;\n font-family: \"Open Sans\", sans-serif;\n font-weight: 400;\n color: #373737;\n text-align: left;\n outline: none;\n border-style: solid;\n border-width: thin;\n border-color: #7F7F7F;\n background-color: white;\n}\n.igv-generic-dialog-container .igv-generic-dialog-input input {\n font-size: 16px;\n}\n.igv-generic-dialog-container .igv-generic-dialog-ok-cancel {\n width: 100%;\n height: 28px;\n display: flex;\n flex-flow: row;\n flex-wrap: nowrap;\n justify-content: space-around;\n align-items: center;\n}\n.igv-generic-dialog-container .igv-generic-dialog-ok-cancel div {\n margin-top: 32px;\n color: white;\n font-family: \"Open Sans\", sans-serif;\n font-size: 14px;\n font-weight: 400;\n width: 75px;\n height: 28px;\n line-height: 28px;\n text-align: center;\n border-color: transparent;\n border-style: solid;\n border-width: thin;\n border-radius: 2px;\n}\n.igv-generic-dialog-container .igv-generic-dialog-ok-cancel div:first-child {\n margin-left: 32px;\n margin-right: 0;\n background-color: #5ea4e0;\n}\n.igv-generic-dialog-container .igv-generic-dialog-ok-cancel div:last-child {\n margin-left: 0;\n margin-right: 32px;\n background-color: #c4c4c4;\n}\n.igv-generic-dialog-container .igv-generic-dialog-ok-cancel div:first-child:hover {\n cursor: pointer;\n background-color: #3b5c7f;\n}\n.igv-generic-dialog-container .igv-generic-dialog-ok-cancel div:last-child:hover {\n cursor: pointer;\n background-color: #7f7f7f;\n}\n.igv-generic-dialog-container .igv-generic-dialog-ok {\n width: 100%;\n height: 36px;\n margin-top: 32px;\n display: flex;\n flex-flow: row;\n flex-wrap: nowrap;\n justify-content: space-around;\n align-items: center;\n}\n.igv-generic-dialog-container .igv-generic-dialog-ok div {\n width: 98px;\n height: 36px;\n line-height: 36px;\n text-align: center;\n color: white;\n font-family: \"Open Sans\", sans-serif;\n font-size: medium;\n font-weight: 400;\n border-color: white;\n border-style: solid;\n border-width: thin;\n border-radius: 4px;\n background-color: #2B81AF;\n}\n.igv-generic-dialog-container .igv-generic-dialog-ok div:hover {\n cursor: pointer;\n background-color: #25597f;\n}\n\n.igv-generic-container {\n position: absolute;\n top: 0;\n left: 0;\n z-index: 2048;\n background-color: white;\n cursor: pointer;\n display: flex;\n flex-direction: row;\n flex-wrap: wrap;\n justify-content: flex-start;\n align-items: center;\n}\n.igv-generic-container div:first-child {\n cursor: move;\n display: flex;\n flex-flow: row;\n flex-wrap: nowrap;\n justify-content: flex-end;\n align-items: center;\n height: 24px;\n width: 100%;\n background-color: #dddddd;\n}\n.igv-generic-container div:first-child i {\n display: block;\n color: #5f5f5f;\n cursor: pointer;\n width: 14px;\n height: 14px;\n margin-right: 8px;\n margin-bottom: 4px;\n}\n\n.igv-menu-popup {\n position: absolute;\n top: 0;\n left: 0;\n width: max-content;\n z-index: 4096;\n cursor: pointer;\n font-family: \"Open Sans\", sans-serif;\n font-size: small;\n font-weight: 400;\n color: #4b4b4b;\n background: white;\n border-radius: 4px;\n border-color: #7F7F7F;\n border-style: solid;\n border-width: thin;\n display: flex;\n flex-flow: column;\n flex-wrap: nowrap;\n justify-content: flex-start;\n align-items: flex-end;\n text-align: left;\n}\n.igv-menu-popup > div:not(:first-child) {\n width: 100%;\n}\n.igv-menu-popup > div:not(:first-child) > div {\n background: white;\n}\n.igv-menu-popup > div:not(:first-child) > div.context-menu {\n padding-left: 4px;\n padding-right: 4px;\n}\n.igv-menu-popup > div:not(:first-child) > div:last-child {\n border-bottom-left-radius: 4px;\n border-bottom-right-radius: 4px;\n border-bottom-color: transparent;\n border-bottom-style: solid;\n border-bottom-width: thin;\n}\n.igv-menu-popup > div:not(:first-child) > div:hover {\n background: #efefef;\n}\n\n.igv-menu-popup-shim {\n padding-left: 8px;\n padding-right: 8px;\n padding-bottom: 1px;\n padding-top: 1px;\n}\n\n.igv-menu-popup-header {\n position: relative;\n width: 100%;\n height: 24px;\n cursor: move;\n border-top-color: transparent;\n border-top-left-radius: 4px;\n border-top-right-radius: 4px;\n border-bottom-color: #7F7F7F;\n border-bottom-style: solid;\n border-bottom-width: thin;\n background-color: #eee;\n display: flex;\n flex-flow: row;\n flex-wrap: nowrap;\n justify-content: flex-end;\n align-items: center;\n}\n.igv-menu-popup-header div {\n margin-right: 4px;\n height: 12px;\n width: 12px;\n color: #7F7F7F;\n}\n.igv-menu-popup-header div:hover {\n cursor: pointer;\n color: #444;\n}\n\n.igv-menu-popup-check-container {\n display: flex;\n flex-flow: row;\n flex-wrap: nowrap;\n justify-content: flex-start;\n align-items: center;\n width: 100%;\n height: 20px;\n margin-right: 4px;\n background-color: transparent;\n}\n.igv-menu-popup-check-container div {\n padding-top: 2px;\n padding-left: 8px;\n}\n.igv-menu-popup-check-container div:first-child {\n position: relative;\n width: 12px;\n height: 12px;\n}\n.igv-menu-popup-check-container div:first-child svg {\n position: absolute;\n width: 12px;\n height: 12px;\n}\n\n.igv-user-feedback {\n position: fixed;\n top: 50%;\n left: 50%;\n transform: translate(-50%, -50%);\n width: 512px;\n height: 360px;\n z-index: 2048;\n background-color: white;\n border-color: #a2a2a2;\n border-style: solid;\n border-width: thin;\n font-family: \"Open Sans\", sans-serif;\n font-size: medium;\n font-weight: 400;\n color: #444;\n display: flex;\n flex-direction: column;\n flex-wrap: nowrap;\n justify-content: flex-start;\n align-items: center;\n}\n.igv-user-feedback div:first-child {\n position: relative;\n height: 24px;\n width: 100%;\n background-color: white;\n border-bottom-color: #a2a2a2;\n border-bottom-style: solid;\n border-bottom-width: thin;\n}\n.igv-user-feedback div:first-child div {\n position: absolute;\n top: 2px;\n width: 16px;\n height: 16px;\n background-color: transparent;\n}\n.igv-user-feedback div:first-child div:first-child {\n left: 8px;\n}\n.igv-user-feedback div:first-child div:last-child {\n cursor: pointer;\n right: 8px;\n}\n.igv-user-feedback div:last-child {\n width: 100%;\n height: calc(100% - 24px);\n border-width: 0;\n}\n.igv-user-feedback div:last-child div {\n width: auto;\n height: auto;\n margin: 8px;\n}\n\n.igv-loading-spinner-container {\n z-index: 1024;\n position: absolute;\n top: 50%;\n left: 50%;\n transform: translate(-50%, -50%);\n width: 32px;\n height: 32px;\n display: flex;\n flex-direction: row;\n flex-wrap: nowrap;\n justify-content: center;\n align-items: center;\n}\n.igv-loading-spinner-container > div {\n box-sizing: border-box;\n width: 100%;\n height: 100%;\n border-radius: 50%;\n border: 4px solid rgba(128, 128, 128, 0.5);\n border-top-color: rgb(255, 255, 255);\n animation: spin 1s ease-in-out infinite;\n -webkit-animation: spin 1s ease-in-out infinite;\n}\n\n@keyframes spin {\n to {\n -webkit-transform: rotate(360deg);\n transform: rotate(360deg);\n }\n}\n@-webkit-keyframes spin {\n to {\n -webkit-transform: rotate(360deg);\n transform: rotate(360deg);\n }\n}\n.igv-roi-menu-next-gen {\n position: absolute;\n z-index: 512;\n font-family: \"Open Sans\", sans-serif;\n font-size: small;\n font-weight: 400;\n color: #4b4b4b;\n background-color: white;\n width: 192px;\n border-radius: 4px;\n border-color: #7F7F7F;\n border-style: solid;\n border-width: thin;\n display: flex;\n flex-direction: column;\n flex-wrap: nowrap;\n justify-content: flex-start;\n align-items: stretch;\n}\n.igv-roi-menu-next-gen > div:first-child {\n height: 24px;\n border-top-color: transparent;\n border-top-left-radius: 4px;\n border-top-right-radius: 4px;\n border-bottom-color: #7F7F7F;\n border-bottom-style: solid;\n border-bottom-width: thin;\n background-color: #eee;\n display: flex;\n flex-flow: row;\n flex-wrap: nowrap;\n justify-content: flex-end;\n align-items: center;\n}\n.igv-roi-menu-next-gen > div:first-child > div {\n margin-right: 4px;\n height: 12px;\n width: 12px;\n color: #7F7F7F;\n}\n.igv-roi-menu-next-gen > div:first-child > div:hover {\n cursor: pointer;\n color: #444;\n}\n.igv-roi-menu-next-gen > div:last-child {\n background-color: white;\n border-bottom-left-radius: 4px;\n border-bottom-right-radius: 4px;\n border-bottom-color: transparent;\n border-bottom-style: solid;\n border-bottom-width: 0;\n display: flex;\n flex-direction: column;\n flex-wrap: nowrap;\n justify-content: flex-start;\n align-items: stretch;\n text-align: start;\n vertical-align: middle;\n}\n.igv-roi-menu-next-gen > div:last-child > div {\n height: 24px;\n padding-left: 4px;\n border-bottom-style: solid;\n border-bottom-width: thin;\n border-bottom-color: #7f7f7f;\n}\n.igv-roi-menu-next-gen > div:last-child > div:not(:first-child):hover {\n background-color: rgba(127, 127, 127, 0.1);\n}\n.igv-roi-menu-next-gen > div:last-child div:first-child {\n font-style: italic;\n text-align: center;\n padding-right: 4px;\n white-space: nowrap;\n overflow: hidden;\n text-overflow: ellipsis;\n}\n.igv-roi-menu-next-gen > div:last-child > div:last-child {\n border-bottom-width: 0;\n border-bottom-color: transparent;\n}\n\n.igv-roi-placeholder {\n font-style: normal;\n color: rgba(75, 75, 75, 0.6);\n}\n\n.igv-roi-table {\n position: absolute;\n z-index: 1024;\n width: min-content;\n max-width: 1600px;\n border-color: #7f7f7f;\n border-radius: 4px;\n border-style: solid;\n border-width: thin;\n font-family: \"Open Sans\", sans-serif;\n font-size: 12px;\n font-weight: 400;\n background-color: white;\n display: flex;\n flex-flow: column;\n flex-wrap: nowrap;\n justify-content: flex-start;\n align-items: stretch;\n cursor: default;\n}\n.igv-roi-table > div {\n height: 24px;\n font-size: 14px;\n text-align: start;\n vertical-align: middle;\n line-height: 24px;\n}\n.igv-roi-table > div:first-child {\n border-color: transparent;\n border-top-left-radius: 4px;\n border-top-right-radius: 4px;\n border-top-width: 0;\n border-bottom-color: #7f7f7f;\n border-bottom-style: solid;\n border-bottom-width: thin;\n background-color: #eee;\n cursor: move;\n display: flex;\n flex-flow: row;\n flex-wrap: nowrap;\n justify-content: space-between;\n align-items: center;\n}\n.igv-roi-table > div:first-child > div:first-child {\n text-align: center;\n white-space: nowrap;\n text-overflow: ellipsis;\n overflow: hidden;\n margin-left: 4px;\n margin-right: 4px;\n width: calc(100% - 4px - 12px);\n}\n.igv-roi-table > div:first-child > div:last-child {\n margin-right: 4px;\n margin-bottom: 2px;\n height: 12px;\n width: 12px;\n color: #7f7f7f;\n}\n.igv-roi-table > div:first-child > div:last-child > svg {\n display: block;\n}\n.igv-roi-table > div:first-child > div:last-child:hover {\n cursor: pointer;\n color: #444;\n}\n.igv-roi-table > .igv-roi-table-description {\n padding: 4px;\n margin-left: 4px;\n word-break: break-all;\n overflow-y: auto;\n display: flex;\n flex-flow: row;\n flex-wrap: nowrap;\n background-color: transparent;\n}\n.igv-roi-table > .igv-roi-table-goto-explainer {\n margin-top: 5px;\n margin-left: 4px;\n color: #7F7F7F;\n font-style: italic;\n height: 24px;\n border-top: solid lightgray;\n background-color: transparent;\n}\n.igv-roi-table > .igv-roi-table-column-titles {\n height: 24px;\n display: flex;\n flex-flow: row;\n flex-wrap: nowrap;\n justify-content: stretch;\n align-items: stretch;\n padding-right: 16px;\n background-color: white;\n border-top-color: #7f7f7f;\n border-top-style: solid;\n border-top-width: thin;\n border-bottom-color: #7f7f7f;\n border-bottom-style: solid;\n border-bottom-width: thin;\n}\n.igv-roi-table > .igv-roi-table-column-titles > div {\n font-size: 14px;\n vertical-align: middle;\n line-height: 24px;\n text-align: left;\n margin-left: 4px;\n height: 24px;\n overflow: hidden;\n text-overflow: ellipsis;\n border-right-color: #7f7f7f;\n border-right-style: solid;\n border-right-width: thin;\n}\n.igv-roi-table > .igv-roi-table-column-titles > div:last-child {\n border-right: unset;\n}\n.igv-roi-table > .igv-roi-table-row-container {\n overflow: auto;\n resize: both;\n max-width: 1600px;\n height: 360px;\n background-color: transparent;\n display: flex;\n flex-flow: column;\n flex-wrap: nowrap;\n justify-content: flex-start;\n align-items: stretch;\n}\n.igv-roi-table > .igv-roi-table-row-container > .igv-roi-table-row {\n height: 24px;\n display: flex;\n flex-flow: row;\n flex-wrap: nowrap;\n justify-content: stretch;\n align-items: stretch;\n}\n.igv-roi-table > .igv-roi-table-row-container > .igv-roi-table-row > div {\n font-size: 14px;\n vertical-align: middle;\n line-height: 24px;\n text-align: left;\n margin-left: 4px;\n height: 24px;\n white-space: nowrap;\n overflow: hidden;\n text-overflow: ellipsis;\n border-right-color: transparent;\n border-right-style: solid;\n border-right-width: thin;\n}\n.igv-roi-table > .igv-roi-table-row-container > .igv-roi-table-row > div:last-child {\n border-right: unset;\n}\n.igv-roi-table > .igv-roi-table-row-container > .igv-roi-table-row-hover {\n background-color: rgba(0, 0, 0, 0.04);\n}\n.igv-roi-table > div:last-child {\n height: 32px;\n line-height: 32px;\n border-top-color: #7f7f7f;\n border-top-style: solid;\n border-top-width: thin;\n border-bottom-color: transparent;\n border-bottom-left-radius: 4px;\n border-bottom-right-radius: 4px;\n border-bottom-width: 0;\n background-color: #eee;\n display: flex;\n flex-flow: row;\n flex-wrap: nowrap;\n justify-content: space-around;\n align-items: center;\n}\n\n.igv-roi-table-row-selected {\n background-color: rgba(0, 0, 0, 0.125);\n}\n\n.igv-roi-table-button {\n cursor: pointer;\n height: 20px;\n user-select: none;\n line-height: 20px;\n text-align: center;\n vertical-align: middle;\n font-family: \"Open Sans\", sans-serif;\n font-size: 13px;\n font-weight: 400;\n color: black;\n padding-left: 6px;\n padding-right: 6px;\n background-color: rgb(239, 239, 239);\n border-color: black;\n border-style: solid;\n border-width: thin;\n border-radius: 3px;\n}\n\n.igv-roi-table-button:hover {\n font-weight: 400;\n background-color: rgba(0, 0, 0, 0.13);\n}\n\n.igv-roi-region {\n z-index: 64;\n position: absolute;\n top: 0;\n bottom: 0;\n pointer-events: none;\n overflow: visible;\n margin-top: 44px;\n display: flex;\n flex-direction: column;\n flex-wrap: nowrap;\n justify-content: flex-start;\n align-items: stretch;\n}\n.igv-roi-region > div {\n position: relative;\n width: 100%;\n height: 8px;\n pointer-events: auto;\n}\n\n.igv-roi-menu {\n position: absolute;\n z-index: 1024;\n width: 144px;\n border-color: #7f7f7f;\n border-radius: 4px;\n border-style: solid;\n border-width: thin;\n font-family: \"Open Sans\", sans-serif;\n background-color: white;\n display: flex;\n flex-flow: column;\n flex-wrap: nowrap;\n justify-content: flex-start;\n align-items: stretch;\n}\n.igv-roi-menu > div:not(:last-child) {\n border-bottom-color: rgba(128, 128, 128, 0.5);\n border-bottom-style: solid;\n border-bottom-width: thin;\n}\n.igv-roi-menu > div:first-child {\n border-top-left-radius: 4px;\n border-top-right-radius: 4px;\n border-top-color: transparent;\n border-top-style: solid;\n border-top-width: 0;\n}\n.igv-roi-menu > div:last-child {\n border-bottom-left-radius: 4px;\n border-bottom-right-radius: 4px;\n border-bottom-color: transparent;\n border-bottom-style: solid;\n border-bottom-width: 0;\n}\n\n.igv-roi-menu-row {\n height: 24px;\n padding-left: 8px;\n font-size: small;\n text-align: start;\n vertical-align: middle;\n line-height: 24px;\n background-color: white;\n}\n\n.igv-roi-menu-row-edit-description {\n width: -webkit-fill-available;\n font-size: small;\n text-align: start;\n vertical-align: middle;\n background-color: white;\n padding-left: 4px;\n padding-right: 4px;\n padding-bottom: 4px;\n display: flex;\n flex-direction: column;\n flex-wrap: nowrap;\n justify-content: stretch;\n align-items: stretch;\n}\n.igv-roi-menu-row-edit-description > label {\n margin-left: 2px;\n margin-bottom: 0;\n display: block;\n width: -webkit-fill-available;\n}\n.igv-roi-menu-row-edit-description > input {\n display: block;\n margin-left: 2px;\n margin-right: 2px;\n margin-bottom: 1px;\n width: -webkit-fill-available;\n}\n\n.igv-container {\n position: relative;\n display: flex;\n flex-direction: column;\n flex-wrap: nowrap;\n justify-content: flex-start;\n align-items: flex-start;\n padding-top: 4px;\n user-select: none;\n -webkit-user-select: none;\n -ms-user-select: none;\n}\n\n.igv-viewport {\n position: relative;\n margin-top: 5px;\n line-height: 1;\n overflow-x: hidden;\n overflow-y: hidden;\n}\n\n.igv-viewport-content {\n position: relative;\n width: 100%;\n}\n.igv-viewport-content > canvas {\n position: relative;\n display: block;\n}\n\n.igv-column-container {\n position: relative;\n display: flex;\n flex-direction: row;\n flex-wrap: nowrap;\n justify-content: flex-start;\n align-items: stretch;\n width: 100%;\n}\n\n.igv-column-shim {\n width: 1px;\n margin-left: 2px;\n margin-right: 2px;\n background-color: #545453;\n}\n\n.igv-column {\n position: relative;\n position: relative;\n display: flex;\n flex-direction: column;\n flex-wrap: nowrap;\n justify-content: flex-start;\n align-items: flex-start;\n box-sizing: border-box;\n height: 100%;\n}\n\n.igv-axis-column {\n position: relative;\n display: flex;\n flex-direction: column;\n flex-wrap: nowrap;\n justify-content: flex-start;\n align-items: flex-start;\n box-sizing: border-box;\n height: 100%;\n width: 50px;\n}\n.igv-axis-column > div {\n margin-top: 5px;\n width: 100%;\n}\n\n.igv-sample-name-column {\n position: relative;\n display: flex;\n flex-direction: column;\n flex-wrap: nowrap;\n justify-content: flex-start;\n align-items: flex-start;\n box-sizing: border-box;\n height: 100%;\n}\n\n.igv-scrollbar-column {\n position: relative;\n display: flex;\n flex-direction: column;\n flex-wrap: nowrap;\n justify-content: flex-start;\n align-items: flex-start;\n box-sizing: border-box;\n height: 100%;\n width: 14px;\n}\n.igv-scrollbar-column > div {\n position: relative;\n margin-top: 5px;\n width: 14px;\n}\n.igv-scrollbar-column > div > div {\n cursor: pointer;\n position: absolute;\n top: 0;\n left: 2px;\n width: 8px;\n border-width: 1px;\n border-style: solid;\n border-color: #c4c4c4;\n border-top-left-radius: 4px;\n border-top-right-radius: 4px;\n border-bottom-left-radius: 4px;\n border-bottom-right-radius: 4px;\n}\n.igv-scrollbar-column > div > div:hover {\n background-color: #c4c4c4;\n}\n\n.igv-track-drag-column {\n position: relative;\n display: flex;\n flex-direction: column;\n flex-wrap: nowrap;\n justify-content: flex-start;\n align-items: flex-start;\n box-sizing: border-box;\n height: 100%;\n width: 12px;\n background-color: white;\n}\n.igv-track-drag-column > .igv-track-drag-handle {\n z-index: 512;\n position: relative;\n cursor: pointer;\n margin-top: 5px;\n width: 100%;\n border-style: solid;\n border-width: 0;\n border-top-right-radius: 6px;\n border-bottom-right-radius: 6px;\n background-color: #c4c4c4;\n}\n.igv-track-drag-column .igv-track-drag-handle-hover {\n background-color: #787878;\n}\n.igv-track-drag-column > .igv-track-drag-shim {\n position: relative;\n margin-top: 5px;\n width: 100%;\n border-style: solid;\n border-width: 0;\n}\n\n.igv-gear-menu-column {\n position: relative;\n display: flex;\n flex-direction: column;\n flex-wrap: nowrap;\n justify-content: flex-start;\n align-items: flex-start;\n box-sizing: border-box;\n height: 100%;\n width: 28px;\n}\n.igv-gear-menu-column > div {\n display: flex;\n flex-direction: column;\n flex-wrap: nowrap;\n justify-content: flex-start;\n align-items: center;\n margin-top: 5px;\n width: 100%;\n background: white;\n}\n.igv-gear-menu-column > div > div {\n position: relative;\n margin-top: 4px;\n width: 16px;\n height: 16px;\n color: #7F7F7F;\n}\n.igv-gear-menu-column > div > div:hover {\n cursor: pointer;\n color: #444;\n}\n\n/*# sourceMappingURL=dom.css.map */\n';
62076
62099
 
62077
62100
  var style = document.createElement('style');
62078
62101
  style.setAttribute('type', 'text/css');