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.esm.js CHANGED
@@ -18578,6 +18578,7 @@ class IGVXhr {
18578
18578
  });
18579
18579
  this.RANGE_WARNING_GIVEN = false;
18580
18580
  this.oauth = new Oauth();
18581
+ this.contentLengthMap = new Map();
18581
18582
  }
18582
18583
 
18583
18584
  setApiKey(key) {
@@ -18655,6 +18656,18 @@ class IGVXhr {
18655
18656
  }
18656
18657
  }
18657
18658
 
18659
+ async getContentLength(url, options) {
18660
+ if (!this.contentLengthMap.has(url)) {
18661
+ options = options || {};
18662
+ options.method = 'HEAD';
18663
+ options.GET_CONTENT_LENGTH = true;
18664
+ const contentLengthString = await this._loadURL(url, options);
18665
+ const contentLength = contentLengthString ? Number.parseInt(contentLengthString) : -1;
18666
+ this.contentLengthMap.set(url, contentLength);
18667
+ }
18668
+ return this.contentLengthMap.get(url)
18669
+ }
18670
+
18658
18671
  async _loadURL(url, options) {
18659
18672
 
18660
18673
  const self = this;
@@ -18669,6 +18682,11 @@ class IGVXhr {
18669
18682
  oauthToken = await (typeof oauthToken === 'function' ? oauthToken() : oauthToken);
18670
18683
  }
18671
18684
 
18685
+ let contentLength = -1;
18686
+ if (options.range && !isAmazonV4Signed(url) && !isGoogleStorageSigned(url)) {
18687
+ contentLength = await this.getContentLength(url);
18688
+ }
18689
+
18672
18690
  return new Promise(function (resolve, reject) {
18673
18691
 
18674
18692
  // Various Google tansformations
@@ -18694,13 +18712,6 @@ class IGVXhr {
18694
18712
  }
18695
18713
  const range = options.range;
18696
18714
 
18697
- // const isChrome = navigator.userAgent.indexOf('Chrome') > -1
18698
- // const isSafari = navigator.vendor.indexOf("Apple") === 0 && /\sSafari\//.test(navigator.userAgent)
18699
- // if (range && isChrome && !isAmazonV4Signed(url) && !isGoogleStorageSigned(url)) {
18700
- // // Hack to prevent caching for byte-ranges. Attempt to fix net:err-cache errors in Chrome
18701
- // url += url.includes("?") ? "&" : "?"
18702
- // url += "someRandomSeed=" + Math.random().toString(36)
18703
- // }
18704
18715
 
18705
18716
  const xhr = new XMLHttpRequest();
18706
18717
  const sendData = options.sendData || options.body;
@@ -18716,7 +18727,13 @@ class IGVXhr {
18716
18727
  }
18717
18728
 
18718
18729
  if (range) {
18719
- var rangeEnd = range.size ? range.start + range.size - 1 : "";
18730
+ let rangeEnd = "";
18731
+ if (range.size) {
18732
+ rangeEnd = range.start + range.size - 1;
18733
+ if (contentLength > 0) {
18734
+ rangeEnd = Math.min(rangeEnd, contentLength - 1);
18735
+ }
18736
+ }
18720
18737
  xhr.setRequestHeader("Range", "bytes=" + range.start + "-" + rangeEnd);
18721
18738
  // xhr.setRequestHeader("Cache-Control", "no-cache"); <= This can cause CORS issues, disabled for now
18722
18739
  }
@@ -18742,6 +18759,11 @@ class IGVXhr {
18742
18759
  }
18743
18760
 
18744
18761
  xhr.onload = async function (event) {
18762
+
18763
+ if (options.GET_CONTENT_LENGTH) {
18764
+ resolve(xhr.getResponseHeader('content-length'));
18765
+ }
18766
+
18745
18767
  // when the url points to a local file, the status is 0 but that is not an error
18746
18768
  if (xhr.status === 0 || (xhr.status >= 200 && xhr.status <= 300)) {
18747
18769
  if (range && xhr.status !== 206 && range.start !== 0) {
@@ -18774,6 +18796,7 @@ class IGVXhr {
18774
18796
  }
18775
18797
  };
18776
18798
 
18799
+
18777
18800
  xhr.onerror = function (event) {
18778
18801
  if (isGoogleURL(url) && !options.retries) {
18779
18802
  tryGoogleAuth();
@@ -18905,7 +18928,6 @@ function isGoogleStorageSigned(url) {
18905
18928
  }
18906
18929
 
18907
18930
 
18908
-
18909
18931
  /**
18910
18932
  * Return a Google oAuth token, triggering a sign in if required. This method should not be called until we know
18911
18933
  * a token is required, that is until we've tried the url and received a 401, 403, or 404.
@@ -19064,6 +19086,11 @@ function getGlobalObject() {
19064
19086
  }
19065
19087
  }
19066
19088
 
19089
+ function isAmazonV4Signed(url) {
19090
+ return url.indexOf("X-Amz-Signature") > -1
19091
+ }
19092
+
19093
+
19067
19094
  const igvxhr = new IGVXhr();
19068
19095
 
19069
19096
  /*
@@ -23944,7 +23971,7 @@ const Cytoband = function (start, end, name, typestain) {
23944
23971
  }
23945
23972
  };
23946
23973
 
23947
- const _version = "2.15.3";
23974
+ const _version = "2.15.5";
23948
23975
  function version() {
23949
23976
  return _version
23950
23977
  }
@@ -23996,7 +24023,7 @@ const GenomeUtils = {
23996
24023
 
23997
24024
  // Delay loading cytbands untils after genome initialization to use chromosome aliases (1 vs chr1, etc).
23998
24025
  if (cytobandUrl) {
23999
- genome.cytobands = await loadCytobands(cytobandUrl, sequence.config, genome);
24026
+ genome.cytobands = await loadCytobands(cytobandUrl, sequence.config, genome);
24000
24027
  }
24001
24028
 
24002
24029
  return genome
@@ -24098,7 +24125,7 @@ class Genome {
24098
24125
  this.sequence = sequence;
24099
24126
  this.chromosomeNames = sequence.chromosomeNames;
24100
24127
  this.chromosomes = sequence.chromosomes; // An object (functions as a dictionary)
24101
- this.featureDB = {}; // Hash of name -> feature, used for search function.
24128
+ this.featureDB = new Map(); // Hash of name -> feature, used for search function.
24102
24129
 
24103
24130
  this.wholeGenomeView = config.wholeGenomeView === undefined || config.wholeGenomeView;
24104
24131
  if (this.wholeGenomeView && Object.keys(sequence.chromosomes).length > 1) {
@@ -24302,6 +24329,40 @@ class Genome {
24302
24329
  chr = this.getChromosomeName(chr);
24303
24330
  return this.sequence.getSequence(chr, start, end)
24304
24331
  }
24332
+
24333
+ addFeaturesToDB(featureList, config) {
24334
+
24335
+ const insertFeature = (name, feature) => {
24336
+ const current = this.featureDB.get(name);
24337
+ if (current) {
24338
+ feature = (feature.end - feature.start) > (current.end - current.start) ? feature : current;
24339
+
24340
+ }
24341
+ this.featureDB.set(name, feature);
24342
+ };
24343
+
24344
+ for (let feature of featureList) {
24345
+ if (feature.name) {
24346
+ insertFeature(feature.name.toUpperCase(), feature);
24347
+ }
24348
+ if (feature.gene && feature.gene.name) {
24349
+ insertFeature(feature.gene.name.toUpperCase(), feature);
24350
+ }
24351
+
24352
+ if (config.searchableFields) {
24353
+ for (let f of config.searchableFields) {
24354
+ const value = feature.getAttributeValue(f);
24355
+ if (value) {
24356
+ if (value.indexOf(" ") > 0) {
24357
+ insertFeature(value.replaceAll(" ", "+").toUpperCase(), feature);
24358
+ } else {
24359
+ insertFeature(value.toUpperCase(), feature);
24360
+ }
24361
+ }
24362
+ }
24363
+ }
24364
+ }
24365
+ }
24305
24366
  }
24306
24367
 
24307
24368
  async function loadCytobands(cytobandUrl, config, genome) {
@@ -27029,8 +27090,6 @@ function parseVariableStep(line) {
27029
27090
  * THE SOFTWARE.
27030
27091
  */
27031
27092
 
27032
- const DEFAULT_COLOR$1 = 'rgb(150,150,150)';
27033
-
27034
27093
  const fixColor = (colorString) => {
27035
27094
  if (isString$2(colorString)) {
27036
27095
  return (colorString.indexOf(",") > 0 && !(colorString.startsWith("rgb(") || colorString.startsWith("rgba("))) ?
@@ -27049,6 +27108,15 @@ const fixColor = (colorString) => {
27049
27108
  */
27050
27109
  class TrackBase {
27051
27110
 
27111
+ static defaults = {
27112
+ height: 50,
27113
+ color: 'rgb(0, 0, 150)',
27114
+ altColor: 'rgb(0, 0, 150)',
27115
+ autoHeight: false,
27116
+ visibilityWindow: undefined,
27117
+ supportHiDPI: true
27118
+ }
27119
+
27052
27120
  constructor(config, browser) {
27053
27121
  this.browser = browser;
27054
27122
  this.init(config);
@@ -27062,15 +27130,25 @@ class TrackBase {
27062
27130
  */
27063
27131
  init(config) {
27064
27132
 
27133
+ this.config = config;
27134
+
27065
27135
  if (config.displayMode) {
27066
27136
  config.displayMode = config.displayMode.toUpperCase();
27067
27137
  }
27068
27138
 
27069
- this.config = config;
27070
- this.url = config.url;
27071
- this.type = config.type;
27072
-
27073
- this.supportHiDPI = config.supportHiDPI === undefined ? true : config.supportHiDPI;
27139
+ // Set default properties
27140
+ const defaults = Object.assign({}, TrackBase.defaults);
27141
+ if(this.constructor.defaults) {
27142
+ for(let key of Object.keys(this.constructor.defaults)) {
27143
+ defaults[key] = this.constructor.defaults[key];
27144
+ }
27145
+ }
27146
+ for(let key of Object.keys(defaults)) {
27147
+ this[key] = config.hasOwnProperty(key) ? config[key] : defaults[key];
27148
+ if(key === 'color' || key === 'altColor') {
27149
+ this[key] = fixColor(this[key]);
27150
+ }
27151
+ }
27074
27152
 
27075
27153
  if (config.name || config.label) {
27076
27154
  this.name = config.name || config.label;
@@ -27080,29 +27158,15 @@ class TrackBase {
27080
27158
  this.name = getFilename$2(config.url);
27081
27159
  }
27082
27160
 
27161
+ this.url = config.url;
27162
+ if(this.config.type) this.type = this.config.type;
27083
27163
  this.id = this.config.id === undefined ? this.name : this.config.id;
27084
-
27085
27164
  this.order = config.order;
27086
-
27087
- if (config.color) this.color = fixColor(config.color);
27088
- if (config.altColor) this.altColor = fixColor(config.altColor);
27089
- if ("civic-ws" === config.sourceType) { // Ugly proxy for specialized track type
27090
- this.defaultColor = "rgb(155,20,20)";
27091
- } else {
27092
- this.defaultColor = "rgb(0,0,150)";
27093
- }
27094
-
27095
27165
  this.autoscaleGroup = config.autoscaleGroup;
27096
-
27097
27166
  this.removable = config.removable === undefined ? true : config.removable; // Defaults to true
27098
-
27099
- this.height = config.height || 100;
27100
- this.autoHeight = config.autoHeight;
27101
27167
  this.minHeight = config.minHeight || Math.min(25, this.height);
27102
27168
  this.maxHeight = config.maxHeight || Math.max(1000, this.height);
27103
27169
 
27104
- this.visibilityWindow = config.visibilityWindow;
27105
-
27106
27170
  if (config.onclick) {
27107
27171
  this.onclick = config.onclick;
27108
27172
  config.onclick = undefined; // functions cannot be saved in sessions, clear it here.
@@ -27159,17 +27223,18 @@ class TrackBase {
27159
27223
  }
27160
27224
 
27161
27225
  /**
27162
- * Default implementation -- update config with current values.
27163
- * to create session object for bookmarking, sharing. Updates the track "config" object to reflect the
27164
- * current state. Only simple properties (string, number, boolean) are updated.
27226
+ * Used to create session object for bookmarking, sharing. Only simple property values (string, number, boolean)
27227
+ * are saved.
27165
27228
  */
27166
27229
  getState() {
27167
27230
 
27231
+ const jsonable = (v) => !(v === undefined || typeof v === 'function' || v instanceof File || v instanceof Promise);
27232
+
27168
27233
  // Create copy of config, minus transient properties (convention is name starts with '_'). Also, all
27169
27234
  // function properties are transient as they cannot be saved in json
27170
27235
  const state = {};
27171
27236
  for (let key of Object.keys(this.config)) {
27172
- if (!key.startsWith("_") && typeof this.config[key] !== "function" && this.config[key] !== undefined) {
27237
+ if (!key.startsWith("_") && jsonable(this.config[key])) {
27173
27238
  state[key] = this.config[key];
27174
27239
  }
27175
27240
  }
@@ -27183,8 +27248,18 @@ class TrackBase {
27183
27248
  }
27184
27249
  }
27185
27250
 
27186
- if (this.color) state.color = this.color;
27187
- if (this.altColor) state.altColor = this.altColor;
27251
+ // If user has changed other properties from defaults update state.
27252
+ const defs = TrackBase.defaults;
27253
+ if (this.constructor.defaults) {
27254
+ for (let key of Object.keys(this.constructor.defaults)) {
27255
+ defs[key] = this.constructor.defaults[key];
27256
+ }
27257
+ }
27258
+ for (let key of Object.keys(defs)) {
27259
+ if (undefined !== this[key] && defs[key] !== this[key]) {
27260
+ state[key] = this[key];
27261
+ }
27262
+ }
27188
27263
 
27189
27264
  // Flatten dataRange if present
27190
27265
  if (!this.autoscale && this.dataRange) {
@@ -27192,22 +27267,6 @@ class TrackBase {
27192
27267
  state.max = this.dataRange.max;
27193
27268
  }
27194
27269
 
27195
-
27196
- // Check for non-json-if-yable properties. Perhaps we should test what can be saved.
27197
- for (let key of Object.keys(state)) {
27198
- const value = state[key];
27199
- if (typeof value === 'function') {
27200
- throw Error(`Property '${key}' of track '${this.name} is a function. Functions cannot be saved in sessions.`)
27201
- }
27202
- if (value instanceof File) { // Test specifically for File. Other types of File-like objects might be savable
27203
- const str = `Track ${this.name} is a local file. Sessions cannot be saved with local file references.`;
27204
- throw Error(str)
27205
- }
27206
- if (value instanceof Promise) {
27207
- throw Error(`Property '${key}' of track '${this.name} is a Promise. Promises cannot be saved in sessions.`)
27208
- }
27209
- }
27210
-
27211
27270
  return state
27212
27271
  }
27213
27272
 
@@ -27503,7 +27562,7 @@ class TrackBase {
27503
27562
  * @returns {*|string|string}
27504
27563
  */
27505
27564
  getColorForFeature(f) {
27506
- return (typeof this.color === "function") ? this.color(feature) : this.color || DEFAULT_COLOR$1
27565
+ return (typeof this.color === "function") ? this.color(feature) : this.color
27507
27566
  }
27508
27567
 
27509
27568
  /**
@@ -30247,7 +30306,8 @@ class FeatureFileReader {
30247
30306
  this.config = config || {};
30248
30307
  this.genome = genome;
30249
30308
  this.indexURL = config.indexURL;
30250
- this.indexed = config.indexed;
30309
+ this.indexed = config.indexed || this.indexURL !== undefined;
30310
+ this.queryable = this.indexed;
30251
30311
 
30252
30312
  if (isFile(this.config.url)) {
30253
30313
  this.filename = this.config.url.name;
@@ -31907,6 +31967,7 @@ class TextFeatureSource {
31907
31967
 
31908
31968
  const queryableFormats = new Set(["bigwig", "bw", "bigbed", "bb", "biginteract", "biggenepred", "bignarrowpeak", "tdf"]);
31909
31969
 
31970
+ this.queryable = config.indexURL || config.queryable === true; // False by default, unless explicitly set
31910
31971
  if (config.reader) {
31911
31972
  // Explicit reader implementation
31912
31973
  this.reader = config.reader;
@@ -31940,6 +32001,11 @@ class TextFeatureSource {
31940
32001
  this.queryable = true;
31941
32002
  } else ;
31942
32003
  }
32004
+
32005
+ // Set searchable unless explicitly turned off, or track uses in indexed or otherwise queryable
32006
+ // feature source. queryable => features loaded on demand (by query)
32007
+ this.searchable = config.searchable === true || config.searchableFields || (config.searchable !== false && !this.queryable);
32008
+
31943
32009
  }
31944
32010
 
31945
32011
  async defaultVisibilityWindow() {
@@ -31999,6 +32065,7 @@ class TextFeatureSource {
31999
32065
  // * view is "whole genome" but no features are loaded
32000
32066
  // * cache is disabled
32001
32067
  // * cache does not contain requested range
32068
+ // const containsRange = this.featureCache.containsRange(new GenomicInterval(queryChr, start, end))
32002
32069
  if ((isWholeGenome && !this.wgFeatures && this.supportsWholeGenome()) ||
32003
32070
  this.config.disableCache ||
32004
32071
  !this.featureCache ||
@@ -32080,39 +32147,13 @@ class TextFeatureSource {
32080
32147
  this.featureCache = new FeatureCache$1(features, this.genome, genomicInterval);
32081
32148
 
32082
32149
  // If track is marked "searchable"< cache features by name -- use this with caution, memory intensive
32083
- if (this.config.searchable || this.config.searchableFields) {
32084
- this.addFeaturesToDB(features);
32150
+ if (this.searchable) {
32151
+ this.genome.addFeaturesToDB(features, this.config);
32085
32152
  }
32086
32153
  } else {
32087
32154
  this.featureCache = new FeatureCache$1([], genomicInterval); // Empty cache
32088
32155
  }
32089
32156
  }
32090
-
32091
- addFeaturesToDB(featureList) {
32092
- for (let feature of featureList) {
32093
- if (feature.name) {
32094
- this.genome.featureDB[feature.name.toUpperCase()] = feature;
32095
- }
32096
- if (feature.gene && feature.gene.name) {
32097
- this.genome.featureDB[feature.gene.name.toUpperCase()] = feature;
32098
- }
32099
-
32100
- if (this.config.searchableFields) {
32101
- for (let f of this.config.searchableFields) {
32102
- const value = feature.getAttributeValue(f);
32103
- if (value) {
32104
- if (value.indexOf(" ") > 0) {
32105
- this.genome.featureDB[value.replaceAll(" ", "+").toUpperCase()] = feature;
32106
- this.genome.featureDB[value.replaceAll(" ", "%20").toUpperCase()] = feature;
32107
- } else {
32108
- this.genome.featureDB[value.toUpperCase()] = feature;
32109
- }
32110
- }
32111
- }
32112
- }
32113
- }
32114
- }
32115
-
32116
32157
  }
32117
32158
 
32118
32159
  /*
@@ -32928,7 +32969,8 @@ function decodeWigData(data, chrIdx1, bpStart, chrIdx2, bpEnd, featureArray, chr
32928
32969
 
32929
32970
  const binaryParser = new BinaryParser(data);
32930
32971
  const chromId = binaryParser.getInt();
32931
- let chromStart = binaryParser.getInt();
32972
+ const blockStart = binaryParser.getInt();
32973
+ let chromStart = blockStart;
32932
32974
  let chromEnd = binaryParser.getInt();
32933
32975
  const itemStep = binaryParser.getInt();
32934
32976
  const itemSpan = binaryParser.getInt();
@@ -32938,6 +32980,7 @@ function decodeWigData(data, chrIdx1, bpStart, chrIdx2, bpEnd, featureArray, chr
32938
32980
 
32939
32981
  if (chromId >= chrIdx1 && chromId <= chrIdx2) {
32940
32982
 
32983
+ let idx = 0;
32941
32984
  while (itemCount-- > 0) {
32942
32985
  let value;
32943
32986
  switch (type) {
@@ -32953,8 +32996,9 @@ function decodeWigData(data, chrIdx1, bpStart, chrIdx2, bpEnd, featureArray, chr
32953
32996
  break
32954
32997
  case 3: // Fixed step
32955
32998
  value = binaryParser.getFloat();
32999
+ chromStart = blockStart + idx * itemStep;
32956
33000
  chromEnd = chromStart + itemSpan;
32957
- chromStart += itemStep;
33001
+ idx++;
32958
33002
  break
32959
33003
  }
32960
33004
 
@@ -32964,8 +33008,8 @@ function decodeWigData(data, chrIdx1, bpStart, chrIdx2, bpEnd, featureArray, chr
32964
33008
  if (Number.isFinite(value)) {
32965
33009
  const chr = chrDict[chromId];
32966
33010
  featureArray.push({chr: chr, start: chromStart, end: chromEnd, value: value});
32967
-
32968
33011
  }
33012
+
32969
33013
  }
32970
33014
  }
32971
33015
  }
@@ -33101,6 +33145,7 @@ class BWSource {
33101
33145
  this.genome = genome;
33102
33146
  this.format = config.format || "bigwig";
33103
33147
  this.wgValues = {};
33148
+ this.queryable = true;
33104
33149
  }
33105
33150
 
33106
33151
  async getFeatures({chr, start, end, bpPerPixel, windowFunction}) {
@@ -33642,6 +33687,7 @@ class TDFSource {
33642
33687
  this.genome = genome;
33643
33688
  this.windowFunction = config.windowFunction || "mean";
33644
33689
  this.reader = new TDFReader(config, genome);
33690
+ this.queryable = true;
33645
33691
  }
33646
33692
 
33647
33693
  async getFeatures({chr, start, end, bpPerPixel}) {
@@ -33851,8 +33897,8 @@ class StaticFeatureSource {
33851
33897
  this.config = config;
33852
33898
  this.genome = genome;
33853
33899
  this.queryable = false;
33900
+ this.searchable = config.searchable !== false; // searchable by default
33854
33901
  this.updateFeatures(config.features);
33855
-
33856
33902
  }
33857
33903
 
33858
33904
  updateFeatures(features) {
@@ -33862,6 +33908,10 @@ class StaticFeatureSource {
33862
33908
  mapProperties(features, this.config.mappings);
33863
33909
  }
33864
33910
  this.featureCache = new FeatureCache$1(features, this.genome);
33911
+
33912
+ if (this.searchable || this.config.searchableFields) {
33913
+ this.genome.addFeaturesToDB(features, this.config);
33914
+ }
33865
33915
  }
33866
33916
 
33867
33917
  /**
@@ -40055,8 +40105,8 @@ function renderFeature(feature, bpStart, xScale, pixelHeight, ctx, options) {
40055
40105
 
40056
40106
  // Set ctx color to a known valid color. If getColorForFeature returns an invalid color string it is ignored, and
40057
40107
  // this default will be used.
40058
- ctx.fillStyle = this.defaultColor;
40059
- ctx.strokeStyle = this.defaultColor;
40108
+ ctx.fillStyle = this.color;
40109
+ ctx.strokeStyle = this.color;
40060
40110
 
40061
40111
  const color = this.getColorForFeature(feature);
40062
40112
  ctx.fillStyle = color;
@@ -40380,6 +40430,17 @@ function renderFusionJuncSpan(feature, bpStart, xScale, pixelHeight, ctx) {
40380
40430
 
40381
40431
  class FeatureTrack extends TrackBase {
40382
40432
 
40433
+ static defaults = {
40434
+ type: "annotation",
40435
+ maxRows: 1000, // protects against pathological feature packing cases (# of rows of overlapping feaures)
40436
+ displayMode: "EXPANDED", // COLLAPSED | EXPANDED | SQUISHED
40437
+ margin: 10,
40438
+ featureHeight: 14,
40439
+ autoHeight: false,
40440
+ useScore: false
40441
+ }
40442
+
40443
+
40383
40444
  constructor(config, browser) {
40384
40445
  super(config, browser);
40385
40446
  }
@@ -40387,12 +40448,8 @@ class FeatureTrack extends TrackBase {
40387
40448
  init(config) {
40388
40449
  super.init(config);
40389
40450
 
40390
- this.type = config.type || "annotation";
40391
40451
 
40392
- // Set maxRows -- protects against pathological feature packing cases (# of rows of overlapping feaures)
40393
- this.maxRows = config.maxRows === undefined ? 1000 : config.maxRows;
40394
-
40395
- this.displayMode = config.displayMode || "EXPANDED"; // COLLAPSED | EXPANDED | SQUISHED
40452
+ // Obscure option, not common or supoorted, included for backward compatibility
40396
40453
  this.labelDisplayMode = config.labelDisplayMode;
40397
40454
 
40398
40455
  if (config._featureSource) {
@@ -40404,12 +40461,6 @@ class FeatureTrack extends TrackBase {
40404
40461
  FeatureSource(config, this.browser.genome);
40405
40462
  }
40406
40463
 
40407
- // Set default heights
40408
- this.autoHeight = config.autoHeight;
40409
- this.margin = config.margin === undefined ? 10 : config.margin;
40410
-
40411
- this.featureHeight = config.featureHeight || 14;
40412
-
40413
40464
  if ("FusionJuncSpan" === config.type) {
40414
40465
  this.render = config.render || renderFusionJuncSpan;
40415
40466
  this.squishedRowHeight = config.squishedRowHeight || 50;
@@ -40446,9 +40497,6 @@ class FeatureTrack extends TrackBase {
40446
40497
  }
40447
40498
  }
40448
40499
  }
40449
-
40450
- //UCSC useScore option
40451
- this.useScore = config.useScore;
40452
40500
  }
40453
40501
 
40454
40502
  async postInit() {
@@ -40812,7 +40860,7 @@ class FeatureTrack extends TrackBase {
40812
40860
  } else if (feature.color) {
40813
40861
  color = feature.color; // Explicit color for feature
40814
40862
  } else {
40815
- color = this.defaultColor; // Track default
40863
+ color = this.color; // Track default
40816
40864
  }
40817
40865
 
40818
40866
  if (feature.alpha && feature.alpha !== 1) {
@@ -40858,7 +40906,7 @@ function monitorTrackDrag(track) {
40858
40906
 
40859
40907
  function onDragEnd() {
40860
40908
  if (track.trackView && track.displayMode !== "SQUISHED") {
40861
- track.trackView.repaintViews(); // TODO -- refine this to the viewport that was dragged after DOM refactor
40909
+ track.trackView.updateViews(); // TODO -- refine this to the viewport that was dragged after DOM refactor
40862
40910
  }
40863
40911
  }
40864
40912
 
@@ -40878,38 +40926,40 @@ class RegionTableBase {
40878
40926
 
40879
40927
  this.browser = config.browser;
40880
40928
 
40881
- this.container = domUtils.div({ class: 'igv-roi-table' });
40882
- if(config.width) {
40883
- this.container.style.width = config.width;
40929
+ this.columnFormat = config.columnFormat;
40884
40930
 
40885
- }
40931
+ this.tableRowSelectionList = [];
40886
40932
 
40887
- config.parent.appendChild(this.container);
40933
+ this.tableDOM = domUtils.div({ class: 'igv-roi-table' });
40934
+ // if(config.width) {
40935
+ // let [ w ] = config.width.split('px')
40936
+ // w = parseInt(w, 10)
40937
+ // this.tableDOM.style.width = `${Math.min(w, 1600)}px`
40938
+ //
40939
+ // }
40940
+
40941
+ config.parent.appendChild(this.tableDOM);
40888
40942
 
40889
40943
  this.headerDOM = config;
40890
40944
 
40891
- this.columnTitleDOM = config.columnFormat;
40945
+ this.tableColumnTitles = this.tableDOM;
40892
40946
 
40893
- this.rowContainerDOM = this.container;
40947
+ this.tableRowContainer = this.tableDOM;
40894
40948
 
40895
40949
  this.footerDOM = config.gotoButtonHandler;
40896
40950
 
40897
- this.columnFormat = config.columnFormat;
40898
-
40899
- this.tableRowSelectionList = [];
40900
-
40901
40951
  }
40902
40952
 
40903
40953
  set headerDOM({ browser, parent, headerTitle, dismissHandler }) {
40904
40954
 
40905
40955
  // header
40906
40956
  const dom = domUtils.div();
40907
- this.container.appendChild(dom);
40957
+ this.tableDOM.appendChild(dom);
40908
40958
 
40909
40959
  // header title
40910
40960
  const div = domUtils.div();
40911
40961
  dom.appendChild(div);
40912
- div.innerText = headerTitle;
40962
+ div.innerHTML = headerTitle;
40913
40963
 
40914
40964
  // table dismiss button
40915
40965
  const dismiss = domUtils.div();
@@ -40928,46 +40978,51 @@ class RegionTableBase {
40928
40978
  const { y:y_root } = browser.root.getBoundingClientRect();
40929
40979
  const { y:y_parent } = parent.getBoundingClientRect();
40930
40980
  const constraint = -(y_parent - y_root);
40931
- makeDraggable(this.container, dom, { minX:0, minY:constraint });
40981
+ makeDraggable(this.tableDOM, dom, { minX:0, minY:constraint });
40932
40982
 
40933
- this.container.style.display = 'none';
40983
+ this.tableDOM.style.display = 'none';
40934
40984
 
40935
40985
  this._headerDOM = dom;
40936
40986
 
40937
40987
  }
40938
40988
 
40939
- set columnTitleDOM(columnFormat) {
40989
+ set tableColumnTitles(tableDOM) {
40940
40990
 
40941
- const dom = domUtils.div({ class: 'igv-roi-table-column-titles' });
40942
- this.container.appendChild(dom);
40991
+ const tblColumnTitles = domUtils.div({ class: 'igv-roi-table-column-titles' });
40992
+ tableDOM.appendChild(tblColumnTitles);
40943
40993
 
40944
- for (const { label, width } of columnFormat) {
40994
+ for (const { label, width } of this.columnFormat) {
40945
40995
  const col = domUtils.div();
40946
- dom.appendChild(col);
40996
+ tblColumnTitles.appendChild(col);
40947
40997
  col.style.width = width;
40948
40998
  col.innerText = label;
40949
40999
  }
40950
41000
 
41001
+ this._tableColumnTitlesDOM = tblColumnTitles;
41002
+
41003
+ }
41004
+
41005
+ get tableColumnTitles() {
41006
+ return this._tableColumnTitlesDOM
40951
41007
  }
40952
41008
 
40953
- set rowContainerDOM(container) {
41009
+ set tableRowContainer(container) {
40954
41010
 
40955
- const dom = domUtils.div({ class: 'igv-roi-table-row-container' });
40956
- container.appendChild(dom);
41011
+ const tblRowContainer = domUtils.div({ class: 'igv-roi-table-row-container' });
41012
+ container.appendChild(tblRowContainer);
40957
41013
 
40958
- dom.style.minWidth = this.config.width;
41014
+ this._tableRowContainerDOM = tblRowContainer;
40959
41015
 
40960
- this._rowContainerDOM = dom;
40961
41016
  }
40962
41017
 
40963
- get rowContainerDOM() {
40964
- return this._rowContainerDOM
41018
+ get tableRowContainer() {
41019
+ return this._tableRowContainerDOM
40965
41020
  }
40966
41021
 
40967
41022
  set footerDOM(gotoButtonHandler) {
40968
41023
 
40969
41024
  const dom = domUtils.div();
40970
- this.container.appendChild(dom);
41025
+ this.tableDOM.appendChild(dom);
40971
41026
 
40972
41027
  // Go To Button
40973
41028
  const gotoButton = domUtils.div({class: 'igv-roi-table-button'});
@@ -41009,7 +41064,7 @@ class RegionTableBase {
41009
41064
  }
41010
41065
 
41011
41066
  clearTable() {
41012
- const elements = this.rowContainerDOM.querySelectorAll('.igv-roi-table-row');
41067
+ const elements = this.tableRowContainer.querySelectorAll('.igv-roi-table-row');
41013
41068
  for (let el of elements) {
41014
41069
  el.remove();
41015
41070
  }
@@ -41021,23 +41076,23 @@ class RegionTableBase {
41021
41076
  }
41022
41077
 
41023
41078
  present() {
41024
- this.container.style.left = `${ 0 }px`;
41079
+ this.tableDOM.style.left = `${ 0 }px`;
41025
41080
 
41026
41081
  const { y:y_root } = this.browser.root.getBoundingClientRect();
41027
41082
  const { y:y_parent } = this.config.parent.getBoundingClientRect();
41028
41083
 
41029
- this.container.style.top = `${ y_root - y_parent }px`;
41030
- this.container.style.display = 'flex';
41084
+ this.tableDOM.style.top = `${ y_root - y_parent }px`;
41085
+ this.tableDOM.style.display = 'flex';
41031
41086
  }
41032
41087
 
41033
41088
  dismiss() {
41034
- this.container.style.display = 'none';
41089
+ this.tableDOM.style.display = 'none';
41035
41090
  }
41036
41091
 
41037
41092
  dispose() {
41038
41093
 
41039
- this.container.innerHTML = '';
41040
- this.container.remove();
41094
+ this.tableDOM.innerHTML = '';
41095
+ this.tableDOM.remove();
41041
41096
 
41042
41097
  for (const key of Object.keys(this)) {
41043
41098
  this[key] = undefined;
@@ -41053,45 +41108,35 @@ class BlatTable extends RegionTableBase {
41053
41108
 
41054
41109
  constructor(config) {
41055
41110
 
41056
- const cooked = Object.assign({ 'width':'1040px' }, config);
41111
+ const cooked = Object.assign({ 'width':'1024px' }, config);
41057
41112
  super(cooked);
41058
41113
 
41059
41114
  this.descriptionDOM = config;
41060
41115
 
41061
41116
  }
41062
41117
 
41063
-
41064
- set columnTitleDOM(columnFormat) {
41065
-
41066
- const dom = domUtils.div({ class: 'igv-roi-table-column-titles' });
41067
- this.columnTitlesDiv = dom;
41068
- this.container.appendChild(dom);
41069
-
41070
- for (const format of columnFormat) {
41071
- const col = domUtils.div();
41072
- dom.appendChild(col);
41073
- col.style.width = format.width || 'fit-content';
41074
- col.innerText = format.label;
41075
- }
41076
-
41077
- }
41078
-
41079
41118
  set descriptionDOM(config) {
41080
41119
 
41081
41120
  if (config.description) {
41082
41121
 
41083
41122
  let dom;
41084
41123
 
41124
+ // BLAT result for query sequence
41085
41125
  dom = domUtils.div({ class: 'igv-roi-table-description' });
41086
- this.container.insertBefore(dom, this.columnTitlesDiv);
41126
+ this.tableDOM.insertBefore(dom, this.tableColumnTitles);
41127
+ dom.style.height = 'auto';
41087
41128
  dom.innerHTML = `BLAT result for query sequence:`;
41088
41129
 
41130
+ // CTAATCAtctacactggtttctactg ...
41089
41131
  dom = domUtils.div({ class: 'igv-roi-table-description' });
41090
- this.container.insertBefore(dom, this.columnTitlesDiv);
41132
+ this.tableDOM.insertBefore(dom, this.tableColumnTitles);
41133
+ dom.style.height = 'auto';
41134
+ dom.style.maxHeight = '128px';
41091
41135
  dom.innerHTML = config.description;
41092
41136
 
41137
+ // Select one or more rows ...
41093
41138
  dom = domUtils.div({ class: 'igv-roi-table-goto-explainer' });
41094
- this.container.insertBefore(dom, this.columnTitlesDiv);
41139
+ this.tableDOM.insertBefore(dom, this.tableColumnTitles);
41095
41140
  dom.innerHTML = `Select one or more rows and click Go To to view the regions`;
41096
41141
 
41097
41142
  }
@@ -41121,13 +41166,13 @@ class BlatTable extends RegionTableBase {
41121
41166
 
41122
41167
  renderTable(records) {
41123
41168
 
41124
- Array.from(this.rowContainerDOM.querySelectorAll('.igv-roi-table-row')).forEach(el => el.remove());
41169
+ Array.from(this.tableRowContainer.querySelectorAll('.igv-roi-table-row')).forEach(el => el.remove());
41125
41170
 
41126
41171
  if (records.length > 0) {
41127
41172
 
41128
41173
  for (let record of records) {
41129
41174
  const row = this.tableRowDOM(record);
41130
- this.rowContainerDOM.appendChild(row);
41175
+ this.tableRowContainer.appendChild(row);
41131
41176
  }
41132
41177
 
41133
41178
  }
@@ -41175,7 +41220,7 @@ class BlatTable extends RegionTableBase {
41175
41220
 
41176
41221
  event.stopPropagation();
41177
41222
 
41178
- const selectedRows = this.container.querySelectorAll('.igv-roi-table-row-selected');
41223
+ const selectedRows = this.tableDOM.querySelectorAll('.igv-roi-table-row-selected');
41179
41224
 
41180
41225
  const loci = [];
41181
41226
  for (const row of selectedRows) {
@@ -41187,7 +41232,7 @@ class BlatTable extends RegionTableBase {
41187
41232
  loci.push(`${ chr }:${ start }-${ end }`);
41188
41233
  }
41189
41234
 
41190
- for (const el of this.container.querySelectorAll('.igv-roi-table-row')) {
41235
+ for (const el of this.tableDOM.querySelectorAll('.igv-roi-table-row')) {
41191
41236
  el.classList.remove('igv-roi-table-row-selected');
41192
41237
  }
41193
41238
 
@@ -41382,8 +41427,6 @@ async function createBlatTrack({sequence, browser, name, title}) {
41382
41427
 
41383
41428
  const alignmentStartGap = 5;
41384
41429
  const downsampleRowHeight = 5;
41385
- const DEFAULT_COVERAGE_TRACK_HEIGHT = 50;
41386
- const DEFAULT_TRACK_HEIGHT$1 = 300;
41387
41430
  const DEFAULT_ALIGNMENT_COLOR = "rgb(185, 185, 185)";
41388
41431
  const DEFAULT_COVERAGE_COLOR = "rgb(150, 150, 150)";
41389
41432
  const DEFAULT_CONNECTOR_COLOR = "rgb(200, 200, 200)";
@@ -41391,35 +41434,37 @@ const MINIMUM_BLAT_LENGTH = 20;
41391
41434
 
41392
41435
  class BAMTrack extends TrackBase {
41393
41436
 
41437
+ static defaults = {
41438
+ alleleFreqThreshold: 0.2,
41439
+ visibilityWindow: 30000,
41440
+ showCoverage: true,
41441
+ showAlignments: true,
41442
+ viewAsPairs: false,
41443
+ pairsSupported: true,
41444
+ showSoftClips: false,
41445
+ showAllBases: false,
41446
+ showInsertions: true,
41447
+ showMismatches: true,
41448
+ color: DEFAULT_ALIGNMENT_COLOR,
41449
+ coverageColor: DEFAULT_COVERAGE_COLOR,
41450
+ height: 300,
41451
+ coverageTrackHeight: 50
41452
+ }
41453
+
41394
41454
  constructor(config, browser) {
41395
41455
  super(config, browser);
41396
41456
  }
41397
41457
 
41398
41458
  init(config) {
41399
- super.init(config);
41400
- this.type = "alignment";
41401
-
41402
- if (config.alleleFreqThreshold === undefined) {
41403
- config.alleleFreqThreshold = 0.2;
41404
- }
41405
41459
 
41460
+ this.type = "alignment";
41406
41461
  this.featureSource = new BamSource(config, this.browser);
41407
-
41408
- this.showCoverage = config.showCoverage === undefined ? true : config.showCoverage;
41409
- this.showAlignments = config.showAlignments === undefined ? true : config.showAlignments;
41410
-
41411
41462
  this.coverageTrack = new CoverageTrack(config, this);
41412
41463
  this.alignmentTrack = new AlignmentTrack(config, this);
41464
+
41465
+ super.init(config);
41466
+
41413
41467
  this.alignmentTrack.setTop(this.coverageTrack, this.showCoverage);
41414
- this.visibilityWindow = config.visibilityWindow || 30000;
41415
- this.viewAsPairs = config.viewAsPairs;
41416
- this.pairsSupported = config.pairsSupported !== false;
41417
- this.showSoftClips = config.showSoftClips;
41418
- this.showAllBases = config.showAllBases;
41419
- this.showInsertions = false !== config.showInsertions;
41420
- this.showMismatches = false !== config.showMismatches;
41421
- this.color = config.color;
41422
- this.coverageColor = config.coverageColor;
41423
41468
 
41424
41469
  // The sort object can be an array in the case of multi-locus view, however if multiple sort positions
41425
41470
  // are present for a given reference frame the last one will take precedence
@@ -41432,14 +41477,12 @@ class BAMTrack extends TrackBase {
41432
41477
  }
41433
41478
  }
41434
41479
 
41435
- // Invoke height setter last to allocated to coverage and alignment tracks
41436
- this.height = (config.height !== undefined ? config.height : DEFAULT_TRACK_HEIGHT$1);
41437
41480
  }
41438
41481
 
41439
41482
  set height(h) {
41440
41483
  this._height = h;
41441
- if (this.coverageTrack && this.showAlignments) {
41442
- this.alignmentTrack.height = this.showCoverage ? h - this.coverageTrack.height : h;
41484
+ if (this.showAlignments) {
41485
+ this.alignmentTrack.height = this.showCoverage ? h - this.coverageTrackHeight : h;
41443
41486
  }
41444
41487
  }
41445
41488
 
@@ -41526,16 +41569,15 @@ class BAMTrack extends TrackBase {
41526
41569
  * @returns {number}
41527
41570
  */
41528
41571
  computePixelHeight(alignmentContainer) {
41529
- return (this.showCoverage ? this.coverageTrack.height : 0) +
41530
- (this.showAlignments ? this.alignmentTrack.computePixelHeight(alignmentContainer) : 0) +
41531
- 15
41572
+ return (this.showCoverage ? this.coverageTrackHeight : 0) +
41573
+ (this.showAlignments ? this.alignmentTrack.computePixelHeight(alignmentContainer) : 0)
41532
41574
  }
41533
41575
 
41534
41576
  draw(options) {
41535
41577
 
41536
41578
  IGVGraphics.fillRect(options.context, 0, options.pixelTop, options.pixelWidth, options.pixelHeight, {'fillStyle': "rgb(255, 255, 255)"});
41537
41579
 
41538
- if (true === this.showCoverage && this.coverageTrack.height > 0) {
41580
+ if (true === this.showCoverage && this.coverageTrackHeight > 0) {
41539
41581
  this.trackView.axisCanvas.style.display = 'block';
41540
41582
  this.coverageTrack.draw(options);
41541
41583
  } else {
@@ -41550,12 +41592,12 @@ class BAMTrack extends TrackBase {
41550
41592
 
41551
41593
  paintAxis(ctx, pixelWidth, pixelHeight) {
41552
41594
 
41553
- this.coverageTrack.paintAxis(ctx, pixelWidth, this.coverageTrack.height);
41595
+ this.coverageTrack.paintAxis(ctx, pixelWidth, this.coverageTrackHeight);
41554
41596
 
41555
41597
  // if (this.browser.isMultiLocusMode()) {
41556
41598
  // ctx.clearRect(0, 0, pixelWidth, pixelHeight);
41557
41599
  // } else {
41558
- // this.coverageTrack.paintAxis(ctx, pixelWidth, this.coverageTrack.height);
41600
+ // this.coverageTrack.paintAxis(ctx, pixelWidth, this.coverageTrackHeight);
41559
41601
  // }
41560
41602
  }
41561
41603
 
@@ -41564,7 +41606,7 @@ class BAMTrack extends TrackBase {
41564
41606
  }
41565
41607
 
41566
41608
  popupData(clickState) {
41567
- if (true === this.showCoverage && clickState.y >= this.coverageTrack.top && clickState.y < this.coverageTrack.height) {
41609
+ if (true === this.showCoverage && clickState.y >= this.coverageTrack.top && clickState.y < this.coverageTrackHeight) {
41568
41610
  return this.coverageTrack.popupData(clickState)
41569
41611
  } else {
41570
41612
  return this.alignmentTrack.popupData(clickState)
@@ -41579,7 +41621,7 @@ class BAMTrack extends TrackBase {
41579
41621
  clickedFeatures(clickState) {
41580
41622
 
41581
41623
  let clickedObject;
41582
- if (true === this.showCoverage && clickState.y >= this.coverageTrack.top && clickState.y < this.coverageTrack.height) {
41624
+ if (true === this.showCoverage && clickState.y >= this.coverageTrack.top && clickState.y < this.coverageTrackHeight) {
41583
41625
  clickedObject = this.coverageTrack.getClickedObject(clickState);
41584
41626
  } else {
41585
41627
  clickedObject = this.alignmentTrack.getClickedObject(clickState);
@@ -41588,7 +41630,7 @@ class BAMTrack extends TrackBase {
41588
41630
  }
41589
41631
 
41590
41632
  hoverText(clickState) {
41591
- if (true === this.showCoverage && clickState.y >= this.coverageTrack.top && clickState.y < this.coverageTrack.height) {
41633
+ if (true === this.showCoverage && clickState.y >= this.coverageTrack.top && clickState.y < this.coverageTrackHeight) {
41592
41634
  const clickedObject = this.coverageTrack.getClickedObject(clickState);
41593
41635
  if (clickedObject) {
41594
41636
  return clickedObject.hoverText()
@@ -41628,8 +41670,8 @@ class BAMTrack extends TrackBase {
41628
41670
  // Show coverage / alignment options
41629
41671
  const adjustTrackHeight = () => {
41630
41672
  if (!this.autoHeight) {
41631
- const h = 15 +
41632
- (this.showCoverage ? this.coverageTrack.height : 0) +
41673
+ const h =
41674
+ (this.showCoverage ? this.coverageTrackHeight : 0) +
41633
41675
  (this.showAlignments ? this.alignmentTrack.height : 0);
41634
41676
  this.trackView.setTrackHeight(h);
41635
41677
  }
@@ -41943,7 +41985,6 @@ class CoverageTrack {
41943
41985
  constructor(config, parent) {
41944
41986
  this.parent = parent;
41945
41987
  this.featureSource = parent.featureSource;
41946
- this.height = config.coverageTrackHeight !== undefined ? config.coverageTrackHeight : DEFAULT_COVERAGE_TRACK_HEIGHT;
41947
41988
 
41948
41989
  this.paintAxis = paintAxis;
41949
41990
  this.top = 0;
@@ -41958,6 +41999,10 @@ class CoverageTrack {
41958
41999
 
41959
42000
  }
41960
42001
 
42002
+ get height() {
42003
+ return this.parent.coverageTrackHeight
42004
+ }
42005
+
41961
42006
  draw(options) {
41962
42007
 
41963
42008
  const pixelTop = options.pixelTop;
@@ -42705,7 +42750,7 @@ class AlignmentTrack {
42705
42750
  const seqstring = clickedAlignment.seq;
42706
42751
  if (seqstring && "*" != seqstring) {
42707
42752
 
42708
- if(seqstring.length < maxSequenceSize) {
42753
+ if (seqstring.length < maxSequenceSize) {
42709
42754
  list.push({
42710
42755
  label: 'BLAT read sequence',
42711
42756
  click: () => {
@@ -44652,25 +44697,34 @@ function renderSVGAxis(context, track, axisCanvas, deltaX, deltaY) {
44652
44697
  * THE SOFTWARE.
44653
44698
  */
44654
44699
 
44655
- const DEFAULT_COLOR = "rgb(150,150,150)";
44656
-
44657
44700
  class WigTrack extends TrackBase {
44658
44701
 
44702
+ static defaults = {
44703
+ height: 50,
44704
+ color: 'rgb(150, 150, 150)',
44705
+ altColor: 'rgb(150, 150, 150)',
44706
+ flipAxis: false,
44707
+ logScale: false,
44708
+ windowFunction: 'mean',
44709
+ graphType: 'bar',
44710
+ autoscale: true,
44711
+ normalize: undefined,
44712
+ scaleFactor: undefined
44713
+ }
44714
+
44659
44715
  constructor(config, browser) {
44660
44716
  super(config, browser);
44661
44717
  }
44662
44718
 
44663
44719
  init(config) {
44720
+
44664
44721
  super.init(config);
44665
44722
 
44666
44723
  this.type = "wig";
44667
- this.height = config.height || 50;
44668
44724
  this.featureType = 'numeric';
44669
44725
  this.paintAxis = paintAxis;
44670
44726
 
44671
44727
  const format = config.format ? config.format.toLowerCase() : config.format;
44672
- this.flipAxis = config.flipAxis ? config.flipAxis : false;
44673
- this.logScale = config.logScale ? config.logScale : false;
44674
44728
  if (config.featureSource) {
44675
44729
  this.featureSource = config.featureSource;
44676
44730
  delete config.featureSource;
@@ -44682,18 +44736,16 @@ class WigTrack extends TrackBase {
44682
44736
  this.featureSource = FeatureSource(config, this.browser.genome);
44683
44737
  }
44684
44738
 
44685
- this.autoscale = config.autoscale || config.max === undefined;
44686
- if (!this.autoscale) {
44739
+
44740
+ // Override autoscale default
44741
+ if(config.max === undefined || config.autoscale === true) {
44742
+ this.autoscale = true;
44743
+ } else {
44687
44744
  this.dataRange = {
44688
44745
  min: config.min || 0,
44689
44746
  max: config.max
44690
44747
  };
44691
44748
  }
44692
-
44693
- this.windowFunction = config.windowFunction || "mean";
44694
- this.graphType = config.graphType || "bar";
44695
- this.normalize = config.normalize; // boolean, for use with "TDF" files
44696
- this.scaleFactor = config.scaleFactor; // optional scale factor, ignored if normalize === true;
44697
44749
  }
44698
44750
 
44699
44751
  async postInit() {
@@ -44783,7 +44835,7 @@ class WigTrack extends TrackBase {
44783
44835
  const pixelWidth = options.pixelWidth;
44784
44836
  options.pixelHeight;
44785
44837
  const bpEnd = bpStart + pixelWidth * bpPerPixel + 1;
44786
- const posColor = this.color || DEFAULT_COLOR;
44838
+ const posColor = this.color || WigTrack.defaults.color;
44787
44839
 
44788
44840
  let baselineColor;
44789
44841
  if (typeof posColor === "string" && posColor.startsWith("rgb(")) {
@@ -44927,7 +44979,7 @@ class WigTrack extends TrackBase {
44927
44979
  */
44928
44980
 
44929
44981
  getColorForFeature(f) {
44930
- let c = (f.value < 0 && this.altColor) ? this.altColor : this.color || DEFAULT_COLOR;
44982
+ let c = (f.value < 0 && this.altColor) ? this.altColor : this.color || WigTrack.defaults.color;
44931
44983
  return (typeof c === "function") ? c(f.value) : c
44932
44984
  }
44933
44985
 
@@ -44938,20 +44990,6 @@ class WigTrack extends TrackBase {
44938
44990
  this.trackView = undefined;
44939
44991
  }
44940
44992
 
44941
- /**
44942
- * Return the current state of the track. Used to create sessions and bookmarks.
44943
- *
44944
- * @returns {*|{}}
44945
- */
44946
- getState() {
44947
-
44948
- const config = super.getState();
44949
-
44950
- if (this.flipAxis !== undefined) config.flipAxis = this.flipAxis;
44951
- if (this.logScale !== undefined) config.logScale = this.logScale;
44952
-
44953
- return config
44954
- }
44955
44993
  }
44956
44994
 
44957
44995
  /**
@@ -45839,6 +45877,17 @@ const DEFAULT_ARC_COLOR = "rgb(180,25,137)";
45839
45877
 
45840
45878
  class InteractionTrack extends TrackBase {
45841
45879
 
45880
+ static defaults = {
45881
+ height: 250,
45882
+ theta: Math.PI / 4,
45883
+ arcOrientation: true,
45884
+ showBlocks: true,
45885
+ blockHeight: 3,
45886
+ thickness: 1,
45887
+ alpha: 0.02,
45888
+ logScale: true,
45889
+ }
45890
+
45842
45891
  constructor(config, browser) {
45843
45892
  super(config, browser);
45844
45893
  }
@@ -45846,16 +45895,10 @@ class InteractionTrack extends TrackBase {
45846
45895
  init(config) {
45847
45896
 
45848
45897
  super.init(config);
45849
- this.theta = config.theta || Math.PI / 4;
45898
+
45850
45899
  this.sinTheta = Math.sin(this.theta);
45851
45900
  this.cosTheta = Math.cos(this.theta);
45852
- this.height = config.height || 250;
45853
45901
  this.arcType = getArcType(config); // nested | proportional | inView | partialInView
45854
- this.arcOrientation = (config.arcOrientation === undefined ? true : config.arcOrientation); // true for up, false for down
45855
- this.showBlocks = config.showBlocks === undefined ? true : config.showBlocks;
45856
- this.blockHeight = config.blockHeight || 3;
45857
- this.thickness = config.thickness || 1;
45858
- this.color = config.color;
45859
45902
  this.alpha = config.alpha || 0.02; // was: 0.15
45860
45903
  this.painter = {flipAxis: !this.arcOrientation, dataRange: this.dataRange, paintAxis: paintAxis};
45861
45904
 
@@ -45867,7 +45910,6 @@ class InteractionTrack extends TrackBase {
45867
45910
  this.valueColumn = "score";
45868
45911
  }
45869
45912
 
45870
- this.logScale = config.logScale !== false; // i.e. defaul to true (undefined => true)
45871
45913
  if (config.max) {
45872
45914
  this.dataRange = {
45873
45915
  min: config.min || 0,
@@ -45892,7 +45934,7 @@ class InteractionTrack extends TrackBase {
45892
45934
 
45893
45935
  if (typeof this.featureSource.getHeader === "function") {
45894
45936
  this.header = await this.featureSource.getHeader();
45895
- if(this.disposed) return; // This track was removed during async load
45937
+ if (this.disposed) return; // This track was removed during async load
45896
45938
  }
45897
45939
 
45898
45940
  // Set properties from track line
@@ -45965,7 +46007,7 @@ class InteractionTrack extends TrackBase {
45965
46007
  feature.drawState = undefined;
45966
46008
 
45967
46009
  let color;
45968
- if(typeof this.color === 'function') {
46010
+ if (typeof this.color === 'function') {
45969
46011
  color = this.color(feature);
45970
46012
  } else {
45971
46013
  color = this.color || feature.color || DEFAULT_ARC_COLOR;
@@ -46310,7 +46352,7 @@ class InteractionTrack extends TrackBase {
46310
46352
  contextMenuItemList(clickState) {
46311
46353
 
46312
46354
  // Experimental JBrowse feature
46313
- if (this.browser.circularView ) {
46355
+ if (this.browser.circularView) {
46314
46356
  const viewport = clickState.viewport;
46315
46357
  const list = [];
46316
46358
 
@@ -46339,7 +46381,7 @@ class InteractionTrack extends TrackBase {
46339
46381
 
46340
46382
  // inView features are simply features that have been drawn, i.e. have a drawState
46341
46383
  const inView = cachedFeatures.filter(f => f.drawState);
46342
- if(inView.length === 0) return;
46384
+ if (inView.length === 0) return;
46343
46385
 
46344
46386
  const chords = makeBedPEChords(inView);
46345
46387
  sendChords(chords, this, refFrame, 0.5);
@@ -46375,7 +46417,7 @@ class InteractionTrack extends TrackBase {
46375
46417
 
46376
46418
  popupData(clickState, features) {
46377
46419
 
46378
- if(features === undefined) features = this.clickedFeatures(clickState);
46420
+ if (features === undefined) features = this.clickedFeatures(clickState);
46379
46421
 
46380
46422
  const data = [];
46381
46423
  for (let feature of features) {
@@ -46399,7 +46441,7 @@ class InteractionTrack extends TrackBase {
46399
46441
  const columnNames = this.header.columnNames;
46400
46442
  const stdColumns = this.header.hiccups ? 6 : 10;
46401
46443
  for (let i = stdColumns; i < columnNames.length; i++) {
46402
- if(this.header.colorColumn === i) continue;
46444
+ if (this.header.colorColumn === i) continue;
46403
46445
  if (columnNames[i] === 'info') {
46404
46446
  extractInfoColumn(data, f.extras[i - stdColumns]);
46405
46447
  } else {
@@ -46421,7 +46463,7 @@ class InteractionTrack extends TrackBase {
46421
46463
 
46422
46464
  // We use the cached features rather than method to avoid async load. If the
46423
46465
  // feature is not already loaded this won't work, but the user wouldn't be mousing over it either.
46424
- const featureList = clickState.viewport.cachedFeatures;
46466
+ const featureList = clickState.viewport.cachedFeatures;
46425
46467
  const candidates = [];
46426
46468
  if (featureList) {
46427
46469
  const proportional = (this.arcType === "proportional" || this.arcType === "inView" || this.arcType === "partialInView");
@@ -46467,26 +46509,6 @@ class InteractionTrack extends TrackBase {
46467
46509
  }
46468
46510
  return candidates.map((c) => c.feature)
46469
46511
  }
46470
-
46471
- /**
46472
- * Return the current state of the track. Used to create sessions and bookmarks.
46473
- *
46474
- * @returns {*|{}}
46475
- */
46476
- getState() {
46477
-
46478
- const config = super.getState();
46479
-
46480
- // if (this.height !== undefined) config.height = this.height;
46481
- if (this.arcType !== undefined) config.arcType = this.arcType;
46482
- if (this.arcOrientation !== undefined) config.arcOrientation = this.arcOrientation;
46483
- if (this.showBlocks !== undefined) config.showBlocks = this.showBlocks;
46484
- if (this.blockHeight !== undefined) config.blockHeight = this.blockHeight;
46485
- if (this.thickness !== undefined) config.thickness = this.thickness;
46486
- if (this.alpha !== undefined) config.alpha = this.alpha;
46487
-
46488
- return config
46489
- }
46490
46512
  }
46491
46513
 
46492
46514
  function getMidpoints(feature, genome) {
@@ -46693,6 +46715,31 @@ const STANDARD_FIELDS = new Map([["REF", "referenceBases"], ["ALT", "alternateBa
46693
46715
 
46694
46716
  class VariantTrack extends TrackBase {
46695
46717
 
46718
+ static defaults = {
46719
+ displayMode: "EXPANDED",
46720
+ sortDirection: "ASC",
46721
+ showGenotypes: true,
46722
+ squishedVariantHeight: 2,
46723
+ squishedCallHeight: 1,
46724
+ expandedCallHeight: 10,
46725
+ expandedVGap: 2,
46726
+ squishedVGap: 1,
46727
+ expandedGroupGap: 10,
46728
+ squishedGroupGap: 5,
46729
+ featureHeight: 14,
46730
+ noGenotypeColor: "rgb(200,180,180)",
46731
+ noCallColor: "rgb(225, 225, 225)",
46732
+ nonRefColor: "rgb(200, 200, 215)",
46733
+ mixedColor: "rgb(200, 220, 200)",
46734
+ homrefColor: "rgb(200, 200, 200)",
46735
+ homvarColor: "rgb(17,248,254)",
46736
+ hetvarColor: "rgb(34,12,253)",
46737
+ colorBy: undefined,
46738
+ visibilityWindow: undefined,
46739
+ labelDisplayMode: undefined,
46740
+ type: "variant"
46741
+ }
46742
+
46696
46743
  constructor(config, browser) {
46697
46744
  super(config, browser);
46698
46745
  }
@@ -46701,41 +46748,18 @@ class VariantTrack extends TrackBase {
46701
46748
 
46702
46749
  super.init(config);
46703
46750
 
46704
- this.visibilityWindow = config.visibilityWindow;
46705
- this.displayMode = config.displayMode || "EXPANDED"; // COLLAPSED | EXPANDED | SQUISHED
46706
- this.labelDisplayMode = config.labelDisplayMode;
46707
46751
  this.expandedVariantHeight = config.expandedVariantHeight || config.variantHeight || 10;
46708
- this.squishedVariantHeight = config.squishedVariantHeight || 2;
46709
- this.squishedCallHeight = config.squishedCallHeight || 1;
46710
- this.expandedCallHeight = config.expandedCallHeight || 10;
46711
- this.expandedVGap = config.expandedVGap !== undefined ? config.expandedVGap : 2;
46712
- this.squishedVGap = config.squishedVGap !== undefined ? config.squishedVGap : 1;
46713
- this.expandedGroupGap = config.expandedGroupGap || 10;
46714
- this.squishedGroupGap = config.squishedGroupGap || 5;
46715
- this.featureHeight = config.featureHeight || 14;
46716
- this.visibilityWindow = config.visibilityWindow;
46752
+
46717
46753
  this.featureSource = FeatureSource(config, this.browser.genome);
46718
- this.noGenotypeColor = config.noGenotypeColor || "rgb(200,180,180)";
46719
- this.noCallColor = config.noCallColor || "rgb(225, 225, 225)";
46720
- this.nonRefColor = config.nonRefColor || "rgb(200, 200, 215)";
46721
- this.mixedColor = config.mixedColor || "rgb(200, 220, 200)";
46722
- this.homrefColor = config.homrefColor || "rgb(200, 200, 200)";
46723
- this.homvarColor = config.homvarColor || "rgb(17,248,254)";
46724
- this.hetvarColor = config.hetvarColor || "rgb(34,12,253)";
46725
- this.sortDirection = "ASC";
46726
- this.type = config.type || "variant";
46727
-
46728
- this.colorBy = config.colorBy; // Can be undefined => default
46754
+
46729
46755
  this._initColorBy = config.colorBy;
46730
46756
  if (config.colorTable) {
46731
46757
  this.colorTables = new Map();
46732
46758
  this.colorTables.set(config.colorBy, new ColorTable(config.colorTable));
46733
46759
  }
46734
-
46735
46760
  this._strokecolor = config.strokecolor;
46736
46761
  this._context_hook = config.context_hook;
46737
46762
 
46738
- this.showGenotypes = config.showGenotypes === undefined ? true : config.showGenotypes;
46739
46763
 
46740
46764
  // The number of variant rows are computed dynamically, but start with "1" by default
46741
46765
  this.variantRowCount(1);
@@ -46745,7 +46769,7 @@ class VariantTrack extends TrackBase {
46745
46769
  async postInit() {
46746
46770
 
46747
46771
  this.header = await this.getHeader(); // cricital, don't remove'
46748
- if(this.disposed) return; // This track was removed during async load
46772
+ if (this.disposed) return // This track was removed during async load
46749
46773
  if (undefined === this.visibilityWindow && this.config.indexed !== false) {
46750
46774
  const fn = isFile(this.config.url) ? this.config.url.name : this.config.url;
46751
46775
  if (isString(fn) && fn.toLowerCase().includes("gnomad")) {
@@ -46848,7 +46872,7 @@ class VariantTrack extends TrackBase {
46848
46872
  this.variantBandHeight = TOP_MARGIN + rowCount * (variantHeight + vGap);
46849
46873
 
46850
46874
  let callSets = this.callSets;
46851
- if(!callSets && this._f) {
46875
+ if (!callSets && this._f) {
46852
46876
  callSets = this._f.callSets; // "Complementary" variant for structural variants
46853
46877
  }
46854
46878
  const nCalls = this.getCallsetsLength();
@@ -46888,9 +46912,9 @@ class VariantTrack extends TrackBase {
46888
46912
 
46889
46913
  //only paint stroke if a color is defined
46890
46914
  let strokecolor = this.getVariantStrokecolor(variant);
46891
- if (strokecolor){
46892
- context.strokeStyle = strokecolor;
46893
- context.strokeRect(x, y, w, h);
46915
+ if (strokecolor) {
46916
+ context.strokeStyle = strokecolor;
46917
+ context.strokeRect(x, y, w, h);
46894
46918
  }
46895
46919
 
46896
46920
  // call hook if _context_hook fn is defined
@@ -46906,7 +46930,7 @@ class VariantTrack extends TrackBase {
46906
46930
  this.sampleHeight = nVariantRows * (callHeight + vGap); // For each sample, there is a call for each variant at this position
46907
46931
 
46908
46932
  let sampleNumber = 0;
46909
- if(callSets && variant.calls) {
46933
+ if (callSets && variant.calls) {
46910
46934
  for (let callSet of callSets) {
46911
46935
  const call = variant.calls[callSet.id];
46912
46936
  if (call) {
@@ -46982,13 +47006,12 @@ class VariantTrack extends TrackBase {
46982
47006
  } else if ("MIXED" === v.type) {
46983
47007
  variantColor = this.mixedColor;
46984
47008
  } else {
46985
- variantColor = this.defaultColor;
47009
+ variantColor = this.color;
46986
47010
  }
46987
47011
  return variantColor
46988
47012
  }
46989
47013
 
46990
47014
 
46991
-
46992
47015
  getVariantStrokecolor(variant) {
46993
47016
 
46994
47017
  const v = variant._f || variant;
@@ -47004,13 +47027,13 @@ class VariantTrack extends TrackBase {
47004
47027
 
47005
47028
  callContextHook(variant, context, x, y, w, h) {
47006
47029
  if (this._context_hook) {
47007
- if (typeof this._context_hook === "function") {
47008
- const v = variant._f || variant;
47030
+ if (typeof this._context_hook === "function") {
47031
+ const v = variant._f || variant;
47009
47032
 
47010
- context.save();
47011
- this._context_hook(v, context, x, y, w, h);
47012
- context.restore();
47013
- }
47033
+ context.save();
47034
+ this._context_hook(v, context, x, y, w, h);
47035
+ context.restore();
47036
+ }
47014
47037
  }
47015
47038
  }
47016
47039
 
@@ -47054,7 +47077,7 @@ class VariantTrack extends TrackBase {
47054
47077
  */
47055
47078
  popupData(clickState, featureList) {
47056
47079
 
47057
- if(featureList === undefined) featureList = this.clickedFeatures(clickState);
47080
+ if (featureList === undefined) featureList = this.clickedFeatures(clickState);
47058
47081
  const genomicLocation = clickState.genomicLocation;
47059
47082
  const genomeID = this.browser.genome.id;
47060
47083
  const sampleInformation = this.browser.sampleInformation;
@@ -47282,12 +47305,12 @@ class VariantTrack extends TrackBase {
47282
47305
  sendChordsForViewport(viewport) {
47283
47306
  const refFrame = viewport.referenceFrame;
47284
47307
  let inView;
47285
- if("all" === refFrame.chr) {
47308
+ if ("all" === refFrame.chr) {
47286
47309
  const all = this.featureSource.getAllFeatures();
47287
47310
  const arrays = Object.keys(all).map(k => all[k]);
47288
47311
  inView = [].concat(...arrays);
47289
47312
  } else {
47290
- inView = this.featureSource.featureCache.queryFeatures(refFrame.chr, refFrame.start, refFrame.end);
47313
+ inView = this.featureSource.featureCache.queryFeatures(refFrame.chr, refFrame.start, refFrame.end);
47291
47314
 
47292
47315
  }
47293
47316
 
@@ -57525,7 +57548,7 @@ async function search(browser, string) {
57525
57548
  let locusObject = parseLocusString(browser, locus);
57526
57549
 
57527
57550
  if (!locusObject) {
57528
- const feature = browser.genome.featureDB[locus.toUpperCase()];
57551
+ const feature = browser.genome.featureDB.get(locus.toUpperCase());
57529
57552
  if (feature) {
57530
57553
  locusObject = {
57531
57554
  chr: feature.chr,
@@ -59378,7 +59401,7 @@ class ROITable extends RegionTableBase {
59378
59401
 
59379
59402
  renderTable(records) {
59380
59403
 
59381
- Array.from(this.rowContainerDOM.querySelectorAll('.igv-roi-table-row')).forEach(el => el.remove());
59404
+ Array.from(this.tableRowContainer.querySelectorAll('.igv-roi-table-row')).forEach(el => el.remove());
59382
59405
 
59383
59406
  if (records.length > 0) {
59384
59407
 
@@ -59386,7 +59409,7 @@ class ROITable extends RegionTableBase {
59386
59409
 
59387
59410
  for (let record of sortedRecords) {
59388
59411
  const row = this.tableRowDOM(record);
59389
- this.rowContainerDOM.appendChild(row);
59412
+ this.tableRowContainer.appendChild(row);
59390
59413
  }
59391
59414
 
59392
59415
  }
@@ -59426,14 +59449,14 @@ class ROITable extends RegionTableBase {
59426
59449
 
59427
59450
  event.stopPropagation();
59428
59451
 
59429
- const selected = this.container.querySelectorAll('.igv-roi-table-row-selected');
59452
+ const selected = this.tableDOM.querySelectorAll('.igv-roi-table-row-selected');
59430
59453
  const loci = [];
59431
59454
  for (let el of selected) {
59432
59455
  const { locus } = parseRegionKey(el.dataset.region);
59433
59456
  loci.push(locus);
59434
59457
  }
59435
59458
 
59436
- for (let el of this.container.querySelectorAll('.igv-roi-table-row')) {
59459
+ for (let el of this.tableDOM.querySelectorAll('.igv-roi-table-row')) {
59437
59460
  el.classList.remove('igv-roi-table-row-selected');
59438
59461
  }
59439
59462
 
@@ -62066,7 +62089,7 @@ async function createTrack(config, browser) {
62066
62089
 
62067
62090
  function embedCSS() {
62068
62091
 
62069
- 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';
62092
+ 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';
62070
62093
 
62071
62094
  var style = document.createElement('style');
62072
62095
  style.setAttribute('type', 'text/css');