this.highlightLocation(result.location, runningTests, result.filename)}
>
-
✘ ${result.value}
+
+ ✘ ${result.value}
+ ${debugBtn}
+
Error Message:
"${result.errMsg}"
Assertion:
@@ -499,7 +507,7 @@ module.exports = class TestTab extends ViewPlugin {
usingWorker: canUseWorker(currentVersion),
runs
}
- this.testRunner.runTestSources(runningTest, compilerConfig, () => {}, () => {}, (error, result) => {
+ this.testRunner.runTestSources(runningTest, compilerConfig, () => {}, () => {}, null, (error, result) => {
if (error) return reject(error)
resolve(result)
}, (url, cb) => {
@@ -527,17 +535,22 @@ module.exports = class TestTab extends ViewPlugin {
usingWorker: canUseWorker(currentVersion),
runs
}
+ const deployCb = async (file, contractAddress) => {
+ const compilerData = await this.call('compilerArtefacts', 'getCompilerAbstract', file)
+ await this.call('compilerArtefacts', 'addResolvedContract', contractAddress, compilerData)
+ }
this.testRunner.runTestSources(
runningTests,
compilerConfig,
(result) => this.testCallback(result, runningTests),
(_err, result, cb) => this.resultsCallback(_err, result, cb),
+ deployCb,
(error, result) => {
this.updateFinalResult(error, result, testFilePath)
callback(error)
}, (url, cb) => {
return this.contentImport.resolveAndSave(url).then((result) => cb(null, result)).catch((error) => cb(error.message))
- }
+ }, { testFilePath }
)
}).catch((error) => {
if (error) return // eslint-disable-line
@@ -632,7 +645,6 @@ module.exports = class TestTab extends ViewPlugin {
el.setAttribute('title', 'No solidity file selected')
} else {
el.setAttribute('title', 'The "Solidity Plugin" should be activated')
- // @todo(#2747) we can activate the plugin here
}
}
if (!this.runActionElement) {
diff --git a/apps/remix-ide/src/app/tabs/theme-module.js b/apps/remix-ide/src/app/tabs/theme-module.js
index 7906a4121c..b3f62cd905 100644
--- a/apps/remix-ide/src/app/tabs/theme-module.js
+++ b/apps/remix-ide/src/app/tabs/theme-module.js
@@ -21,7 +21,7 @@ const themes = [
const profile = {
name: 'theme',
events: ['themeChanged'],
- methods: ['switchTheme', 'getThemes', 'currentTheme'],
+ methods: ['switchTheme', 'getThemes', 'currentTheme', 'fixInvert'],
version: packageJson.version,
kind: 'theme'
}
diff --git a/apps/remix-ide/src/assets/css/intro.js/2.7.0/introjs.min.css b/apps/remix-ide/src/assets/css/intro.js/2.7.0/introjs.min.css
new file mode 100644
index 0000000000..4f508ed90c
--- /dev/null
+++ b/apps/remix-ide/src/assets/css/intro.js/2.7.0/introjs.min.css
@@ -0,0 +1 @@
+.introjs-overlay{position:absolute;box-sizing:content-box;z-index:999999;background-color:#000;opacity:0;background:-moz-radial-gradient(center,ellipse cover,rgba(0,0,0,0.4) 0,rgba(0,0,0,0.9) 100%);background:-webkit-gradient(radial,center center,0px,center center,100%,color-stop(0%,rgba(0,0,0,0.4)),color-stop(100%,rgba(0,0,0,0.9)));background:-webkit-radial-gradient(center,ellipse cover,rgba(0,0,0,0.4) 0,rgba(0,0,0,0.9) 100%);background:-o-radial-gradient(center,ellipse cover,rgba(0,0,0,0.4) 0,rgba(0,0,0,0.9) 100%);background:-ms-radial-gradient(center,ellipse cover,rgba(0,0,0,0.4) 0,rgba(0,0,0,0.9) 100%);background:radial-gradient(center,ellipse cover,rgba(0,0,0,0.4) 0,rgba(0,0,0,0.9) 100%);filter:"progid:DXImageTransform.Microsoft.gradient(startColorstr='#66000000',endColorstr='#e6000000',GradientType=1)";-ms-filter:"alpha(opacity=50)";filter:alpha(opacity=50);-webkit-transition:all .3s ease-out;-moz-transition:all .3s ease-out;-ms-transition:all .3s ease-out;-o-transition:all .3s ease-out;transition:all .3s ease-out}.introjs-fixParent{z-index:auto!important;opacity:1.0!important;-webkit-transform:none!important;-moz-transform:none!important;-ms-transform:none!important;-o-transform:none!important;transform:none!important}.introjs-showElement,tr.introjs-showElement>td,tr.introjs-showElement>th{z-index:9999999!important}.introjs-disableInteraction{z-index:99999999!important;position:absolute;background-color:white;opacity:0;filter:alpha(opacity=0)}.introjs-relativePosition,tr.introjs-showElement>td,tr.introjs-showElement>th{position:relative}.introjs-helperLayer{box-sizing:content-box;position:absolute;z-index:9999998;background-color:#FFF;background-color:rgba(255,255,255,.9);border:1px solid #777;border:1px solid rgba(0,0,0,.5);border-radius:4px;box-shadow:0 2px 15px rgba(0,0,0,.4);-webkit-transition:all .3s ease-out;-moz-transition:all .3s ease-out;-ms-transition:all .3s ease-out;-o-transition:all .3s ease-out;transition:all .3s ease-out}.introjs-tooltipReferenceLayer{box-sizing:content-box;position:absolute;visibility:hidden;z-index:10000000;background-color:transparent;-webkit-transition:all .3s ease-out;-moz-transition:all .3s ease-out;-ms-transition:all .3s ease-out;-o-transition:all .3s ease-out;transition:all .3s ease-out}.introjs-helperLayer *,.introjs-helperLayer *:before,.introjs-helperLayer *:after{-webkit-box-sizing:content-box;-moz-box-sizing:content-box;-ms-box-sizing:content-box;-o-box-sizing:content-box;box-sizing:content-box}.introjs-helperNumberLayer{box-sizing:content-box;position:absolute;visibility:visible;top:-16px;left:-16px;z-index:9999999999!important;padding:2px;font-family:Arial,verdana,tahoma;font-size:13px;font-weight:bold;color:white;text-align:center;text-shadow:1px 1px 1px rgba(0,0,0,.3);background:#ff3019;background:-webkit-linear-gradient(top,#ff3019 0,#cf0404 100%);background:-webkit-gradient(linear,left top,left bottom,color-stop(0%,#ff3019),color-stop(100%,#cf0404));background:-moz-linear-gradient(top,#ff3019 0,#cf0404 100%);background:-ms-linear-gradient(top,#ff3019 0,#cf0404 100%);background:-o-linear-gradient(top,#ff3019 0,#cf0404 100%);background:linear-gradient(to bottom,#ff3019 0,#cf0404 100%);width:20px;height:20px;line-height:20px;border:3px solid white;border-radius:50%;filter:"progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff3019', endColorstr='#cf0404', GradientType=0)";filter:"progid:DXImageTransform.Microsoft.Shadow(direction=135, strength=2, color=ff0000)";box-shadow:0 2px 5px rgba(0,0,0,.4)}.introjs-arrow{border:5px solid white;content:'';position:absolute}.introjs-arrow.top{top:-10px;border-top-color:transparent;border-right-color:transparent;border-bottom-color:white;border-left-color:transparent}.introjs-arrow.top-right{top:-10px;right:10px;border-top-color:transparent;border-right-color:transparent;border-bottom-color:white;border-left-color:transparent}.introjs-arrow.top-middle{top:-10px;left:50%;margin-left:-5px;border-top-color:transparent;border-right-color:transparent;border-bottom-color:white;border-left-color:transparent}.introjs-arrow.right{right:-10px;top:10px;border-top-color:transparent;border-right-color:transparent;border-bottom-color:transparent;border-left-color:white}.introjs-arrow.right-bottom{bottom:10px;right:-10px;border-top-color:transparent;border-right-color:transparent;border-bottom-color:transparent;border-left-color:white}.introjs-arrow.bottom{bottom:-10px;border-top-color:white;border-right-color:transparent;border-bottom-color:transparent;border-left-color:transparent}.introjs-arrow.left{left:-10px;top:10px;border-top-color:transparent;border-right-color:white;border-bottom-color:transparent;border-left-color:transparent}.introjs-arrow.left-bottom{left:-10px;bottom:10px;border-top-color:transparent;border-right-color:white;border-bottom-color:transparent;border-left-color:transparent}.introjs-tooltip{box-sizing:content-box;position:absolute;visibility:visible;padding:10px;background-color:white;min-width:200px;max-width:300px;border-radius:3px;box-shadow:0 1px 10px rgba(0,0,0,.4);-webkit-transition:opacity .1s ease-out;-moz-transition:opacity .1s ease-out;-ms-transition:opacity .1s ease-out;-o-transition:opacity .1s ease-out;transition:opacity .1s ease-out}.introjs-tooltipbuttons{text-align:right;white-space:nowrap}.introjs-button{box-sizing:content-box;position:relative;overflow:visible;display:inline-block;padding:.3em .8em;border:1px solid #d4d4d4;margin:0;text-decoration:none;text-shadow:1px 1px 0 #fff;font:11px/normal sans-serif;color:#333;white-space:nowrap;cursor:pointer;outline:0;background-color:#ececec;background-image:-webkit-gradient(linear,0 0,0 100%,from(#f4f4f4),to(#ececec));background-image:-moz-linear-gradient(#f4f4f4,#ececec);background-image:-o-linear-gradient(#f4f4f4,#ececec);background-image:linear-gradient(#f4f4f4,#ececec);-webkit-background-clip:padding;-moz-background-clip:padding;-o-background-clip:padding-box;-webkit-border-radius:.2em;-moz-border-radius:.2em;border-radius:.2em;zoom:1;*display:inline;margin-top:10px}.introjs-button:hover{border-color:#bcbcbc;text-decoration:none;box-shadow:0 1px 1px #e3e3e3}.introjs-button:focus,.introjs-button:active{background-image:-webkit-gradient(linear,0 0,0 100%,from(#ececec),to(#f4f4f4));background-image:-moz-linear-gradient(#ececec,#f4f4f4);background-image:-o-linear-gradient(#ececec,#f4f4f4);background-image:linear-gradient(#ececec,#f4f4f4)}.introjs-button::-moz-focus-inner{padding:0;border:0}.introjs-skipbutton{box-sizing:content-box;margin-right:5px;color:#7a7a7a}.introjs-prevbutton{-webkit-border-radius:.2em 0 0 .2em;-moz-border-radius:.2em 0 0 .2em;border-radius:.2em 0 0 .2em;border-right:0}.introjs-prevbutton.introjs-fullbutton{border:1px solid #d4d4d4;-webkit-border-radius:.2em;-moz-border-radius:.2em;border-radius:.2em}.introjs-nextbutton{-webkit-border-radius:0 .2em .2em 0;-moz-border-radius:0 .2em .2em 0;border-radius:0 .2em .2em 0}.introjs-nextbutton.introjs-fullbutton{-webkit-border-radius:.2em;-moz-border-radius:.2em;border-radius:.2em}.introjs-disabled,.introjs-disabled:hover,.introjs-disabled:focus{color:#9a9a9a;border-color:#d4d4d4;box-shadow:none;cursor:default;background-color:#f4f4f4;background-image:none;text-decoration:none}.introjs-hidden{display:none}.introjs-bullets{text-align:center}.introjs-bullets ul{box-sizing:content-box;clear:both;margin:15px auto 0;padding:0;display:inline-block}.introjs-bullets ul li{box-sizing:content-box;list-style:none;float:left;margin:0 2px}.introjs-bullets ul li a{box-sizing:content-box;display:block;width:6px;height:6px;background:#ccc;border-radius:10px;-moz-border-radius:10px;-webkit-border-radius:10px;text-decoration:none;cursor:pointer}.introjs-bullets ul li a:hover{background:#999}.introjs-bullets ul li a.active{background:#999}.introjs-progress{box-sizing:content-box;overflow:hidden;height:10px;margin:10px 0 5px 0;border-radius:4px;background-color:#ecf0f1}.introjs-progressbar{box-sizing:content-box;float:left;width:0;height:100%;font-size:10px;line-height:10px;text-align:center;background-color:#08c}.introjsFloatingElement{position:absolute;height:0;width:0;left:50%;top:50%}.introjs-fixedTooltip{position:fixed}.introjs-hint{box-sizing:content-box;position:absolute;background:transparent;width:20px;height:15px;cursor:pointer}.introjs-hint:focus{border:0;outline:0}.introjs-hidehint{display:none}.introjs-fixedhint{position:fixed}.introjs-hint:hover>.introjs-hint-pulse{border:5px solid rgba(60,60,60,0.57)}.introjs-hint-pulse{box-sizing:content-box;width:10px;height:10px;border:5px solid rgba(60,60,60,0.27);-webkit-border-radius:30px;-moz-border-radius:30px;border-radius:30px;background-color:rgba(136,136,136,0.24);z-index:10;position:absolute;-webkit-transition:all .2s ease-out;-moz-transition:all .2s ease-out;-ms-transition:all .2s ease-out;-o-transition:all .2s ease-out;transition:all .2s ease-out}.introjs-hint-no-anim .introjs-hint-dot{-webkit-animation:none;-moz-animation:none;animation:none}.introjs-hint-dot{box-sizing:content-box;border:10px solid rgba(146,146,146,0.36);background:transparent;-webkit-border-radius:60px;-moz-border-radius:60px;border-radius:60px;height:50px;width:50px;-webkit-animation:introjspulse 3s ease-out;-moz-animation:introjspulse 3s ease-out;animation:introjspulse 3s ease-out;-webkit-animation-iteration-count:infinite;-moz-animation-iteration-count:infinite;animation-iteration-count:infinite;position:absolute;top:-25px;left:-25px;z-index:1;opacity:0}@-webkit-keyframes introjspulse{0%{-webkit-transform:scale(0);opacity:.0}25%{-webkit-transform:scale(0);opacity:.1}50%{-webkit-transform:scale(0.1);opacity:.3}75%{-webkit-transform:scale(0.5);opacity:.5}100%{-webkit-transform:scale(1);opacity:.0}}@-moz-keyframes introjspulse{0%{-moz-transform:scale(0);opacity:.0}25%{-moz-transform:scale(0);opacity:.1}50%{-moz-transform:scale(0.1);opacity:.3}75%{-moz-transform:scale(0.5);opacity:.5}100%{-moz-transform:scale(1);opacity:.0}}@keyframes introjspulse{0%{transform:scale(0);opacity:.0}25%{transform:scale(0);opacity:.1}50%{transform:scale(0.1);opacity:.3}75%{transform:scale(0.5);opacity:.5}100%{transform:scale(1);opacity:.0}}
\ No newline at end of file
diff --git a/apps/remix-ide/src/assets/css/intro.js/4.1.0/introjs.min.css b/apps/remix-ide/src/assets/css/intro.js/4.1.0/introjs.min.css
new file mode 100644
index 0000000000..d8b1714797
--- /dev/null
+++ b/apps/remix-ide/src/assets/css/intro.js/4.1.0/introjs.min.css
@@ -0,0 +1,2 @@
+@-webkit-keyframes introjspulse{0%{-webkit-transform:scale(0);transform:scale(0);opacity:0}25%{-webkit-transform:scale(0);transform:scale(0);opacity:.1}50%{-webkit-transform:scale(.1);transform:scale(.1);opacity:.3}75%{-webkit-transform:scale(.5);transform:scale(.5);opacity:.5}100%{-webkit-transform:scale(1);transform:scale(1);opacity:0}}@keyframes introjspulse{0%{-webkit-transform:scale(0);transform:scale(0);opacity:0}25%{-webkit-transform:scale(0);transform:scale(0);opacity:.1}50%{-webkit-transform:scale(.1);transform:scale(.1);opacity:.3}75%{-webkit-transform:scale(.5);transform:scale(.5);opacity:.5}100%{-webkit-transform:scale(1);transform:scale(1);opacity:0}}.introjs-overlay{position:absolute;-webkit-box-sizing:content-box;box-sizing:content-box;z-index:999999;opacity:0;-webkit-transition:all .3s ease-out;-o-transition:all .3s ease-out;transition:all .3s ease-out}.introjs-showElement{z-index:9999999!important}tr.introjs-showElement>td{z-index:9999999!important;position:relative}tr.introjs-showElement>th{z-index:9999999!important;position:relative}.introjs-disableInteraction{z-index:99999999!important;position:absolute;background-color:#fff;opacity:0}.introjs-relativePosition{position:relative}.introjs-helperLayer{-webkit-box-sizing:content-box;box-sizing:content-box;position:absolute;z-index:9999998;border-radius:4px;-webkit-transition:all .3s ease-out;-o-transition:all .3s ease-out;transition:all .3s ease-out}.introjs-helperLayer *{-webkit-box-sizing:content-box;box-sizing:content-box}.introjs-helperLayer :before{-webkit-box-sizing:content-box;box-sizing:content-box}.introjs-helperLayer :after{-webkit-box-sizing:content-box;box-sizing:content-box}.introjs-tooltipReferenceLayer{font-family:"Helvetica Neue",Inter,ui-sans-serif,"Apple Color Emoji",Helvetica,Arial,sans-serif;-webkit-box-sizing:content-box;box-sizing:content-box;position:absolute;visibility:hidden;z-index:100000000;background-color:transparent;-webkit-transition:all .3s ease-out;-o-transition:all .3s ease-out;transition:all .3s ease-out}.introjs-tooltipReferenceLayer *{font-family:"Helvetica Neue",Inter,ui-sans-serif,"Apple Color Emoji",Helvetica,Arial,sans-serif}.introjs-helperNumberLayer{font-family:"Helvetica Neue",Inter,ui-sans-serif,"Apple Color Emoji",Helvetica,Arial,sans-serif;color:#9e9e9e;text-align:center;padding-top:10px;padding-bottom:10px}.introjs-arrow{border:5px solid transparent;content:"";position:absolute}.introjs-arrow.top{top:-10px;left:10px;border-bottom-color:#fff}.introjs-arrow.top-right{top:-10px;right:10px;border-bottom-color:#fff}.introjs-arrow.top-middle{top:-10px;left:50%;margin-left:-5px;border-bottom-color:#fff}.introjs-arrow.right{right:-10px;top:10px;border-left-color:#fff}.introjs-arrow.right-bottom{bottom:10px;right:-10px;border-left-color:#fff}.introjs-arrow.bottom{bottom:-10px;left:10px;border-top-color:#fff}.introjs-arrow.bottom-right{bottom:-10px;right:10px;border-top-color:#fff}.introjs-arrow.bottom-middle{bottom:-10px;left:50%;margin-left:-5px;border-top-color:#fff}.introjs-arrow.left{left:-10px;top:10px;border-right-color:#fff}.introjs-arrow.left-bottom{left:-10px;bottom:10px;border-right-color:#fff}.introjs-tooltip{-webkit-box-sizing:content-box;box-sizing:content-box;position:absolute;visibility:visible;background-color:#fff;min-width:250px;max-width:300px;border-radius:5px;-webkit-box-shadow:0 3px 30px rgba(33,33,33,.3);box-shadow:0 3px 30px rgba(33,33,33,.3);-webkit-transition:opacity .1s ease-out;-o-transition:opacity .1s ease-out;transition:opacity .1s ease-out}.introjs-tooltiptext{padding:20px}.introjs-tooltip-title{font-size:18px;margin:0;padding:0;font-weight:700;float:left;line-height:32px}.introjs-tooltip-header{padding-left:20px;padding-right:20px;padding-top:10px}.introjs-tooltip-header:after{content:".";visibility:hidden;display:block;height:0;clear:both}.introjs-tooltipbuttons{border-top:1px solid #e0e0e0;padding:10px;text-align:right;white-space:nowrap}.introjs-tooltipbuttons:after{content:"";visibility:hidden;display:block;height:0;clear:both}.introjs-button{-webkit-box-sizing:content-box;box-sizing:content-box;position:relative;overflow:visible;display:inline-block;padding:.5rem 1rem;border:1px solid #bdbdbd;text-decoration:none;text-shadow:1px 1px 0 #fff;font-size:14px;color:#424242;white-space:nowrap;cursor:pointer;outline:0;background-color:#f4f4f4;border-radius:.2em;zoom:1}.introjs-button:hover{outline:0;text-decoration:none;border-color:#9e9e9e;background-color:#e0e0e0;color:#212121}.introjs-button:focus{outline:0;text-decoration:none;background-color:#eee;-webkit-box-shadow:0 0 0 .2rem rgba(158,158,158,.5);box-shadow:0 0 0 .2rem rgba(158,158,158,.5);border:1px solid #616161;color:#212121}.introjs-button:active{outline:0;text-decoration:none;background-color:#e0e0e0;border-color:#9e9e9e;color:#212121}.introjs-button::-moz-focus-inner{padding:0;border:0}.introjs-skipbutton{-webkit-box-sizing:content-box;box-sizing:content-box;color:#616161;float:right;font-size:20px;cursor:pointer;font-weight:700;line-height:1;text-align:center;padding:7px 10px}.introjs-skipbutton:focus,.introjs-skipbutton:hover{color:#212121;outline:0;text-decoration:none}.introjs-prevbutton{float:left}.introjs-nextbutton{float:right}.introjs-disabled{color:#9e9e9e;border-color:#bdbdbd;-webkit-box-shadow:none;box-shadow:none;cursor:default;background-color:#f4f4f4;background-image:none;text-decoration:none}.introjs-disabled:focus,.introjs-disabled:hover{color:#9e9e9e;border-color:#bdbdbd;-webkit-box-shadow:none;box-shadow:none;cursor:default;background-color:#f4f4f4;background-image:none;text-decoration:none}.introjs-hidden{display:none}.introjs-bullets{text-align:center;padding-top:10px;padding-bottom:10px}.introjs-bullets ul{-webkit-box-sizing:content-box;box-sizing:content-box;clear:both;margin:0 auto 0;padding:0;display:inline-block}.introjs-bullets ul li{-webkit-box-sizing:content-box;box-sizing:content-box;list-style:none;float:left;margin:0 2px}.introjs-bullets ul li a{-webkit-transition:width .1s ease-in;-o-transition:width .1s ease-in;transition:width .1s ease-in;-webkit-box-sizing:content-box;box-sizing:content-box;display:block;width:6px;height:6px;background:#ccc;border-radius:10px;text-decoration:none;cursor:pointer}.introjs-bullets ul li a:focus,.introjs-bullets ul li a:hover{width:15px;background:#999;text-decoration:none;outline:0}.introjs-bullets ul li a.active{width:15px;background:#999}.introjs-progress{-webkit-box-sizing:content-box;box-sizing:content-box;overflow:hidden;height:10px;margin:10px;border-radius:4px;background-color:#e0e0e0}.introjs-progressbar{-webkit-box-sizing:content-box;box-sizing:content-box;float:left;width:0%;height:100%;font-size:10px;line-height:10px;text-align:center;background-color:#08c}.introjsFloatingElement{position:absolute;height:0;width:0;left:50%;top:50%}.introjs-fixedTooltip{position:fixed}.introjs-hint{-webkit-box-sizing:content-box;box-sizing:content-box;position:absolute;background:0 0;width:20px;height:15px;cursor:pointer}.introjs-hint:focus{border:0;outline:0}.introjs-hint:hover>.introjs-hint-pulse{border:5px solid rgba(60,60,60,.57)}.introjs-hidehint{display:none}.introjs-fixedhint{position:fixed}.introjs-hint-pulse{-webkit-box-sizing:content-box;box-sizing:content-box;width:10px;height:10px;border:5px solid rgba(60,60,60,.27);border-radius:30px;background-color:rgba(136,136,136,.24);z-index:10;position:absolute;-webkit-transition:all .2s ease-out;-o-transition:all .2s ease-out;transition:all .2s ease-out}.introjs-hint-no-anim .introjs-hint-dot{-webkit-animation:none;animation:none}.introjs-hint-dot{-webkit-box-sizing:content-box;box-sizing:content-box;border:10px solid rgba(146,146,146,.36);background:0 0;border-radius:60px;height:50px;width:50px;-webkit-animation:introjspulse 3s ease-out;animation:introjspulse 3s ease-out;-webkit-animation-iteration-count:infinite;animation-iteration-count:infinite;position:absolute;top:-25px;left:-25px;z-index:1;opacity:0}
+/*# sourceMappingURL=introjs.min.css.map */
\ No newline at end of file
diff --git a/apps/remix-ide/src/assets/css/themes/remix-night_owl.css b/apps/remix-ide/src/assets/css/themes/remix-night_owl.css
new file mode 100644
index 0000000000..7cd9945ded
--- /dev/null
+++ b/apps/remix-ide/src/assets/css/themes/remix-night_owl.css
@@ -0,0 +1,8816 @@
+@import url('https://fonts.googleapis.com/css2?family=Inter:wght@400;600&family=JetBrains+Mono:ital@0;1&display=swap');
+
+:root {
+ --blue: #28282D;
+ --indigo: #6610f2;
+ --purple: #6f42c1;
+ --pink: #e83e8c;
+ --red: #823a3a;
+ --orange: #8a5026;
+ --yellow: #ffc107;
+ --green: #366a57;
+ --teal: #20c997;
+ --cyan: #053c64;
+ --white: #d5d5d5;
+ --gray: #868e96;
+ --gray-dark: #343a40;
+ --primary: #b5b4bc;
+ --secondary: #3d3e44;
+ --success: #366a57;
+ --info: #086CB5;
+ --warning: #8a5026;
+ --danger: #823a3a;
+ --light: #1f2020;
+ --dark: #1a1a1a;
+ --breakpoint-xs: 0;
+ --breakpoint-sm: 576px;
+ --breakpoint-md: 768px;
+ --breakpoint-lg: 992px;
+ --breakpoint-xl: 1200px;
+ --font-family-sans-serif: "Inter", -apple-system, BlinkMacSystemFont,
+ "Segoe UI", Roboto, "Helvetica Neue", Arial, "Noto Sans", sans-serif,
+ "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol", "Noto Color Emoji";
+ --font-family-monospace: "JetBrains Mono", Menlo, Monaco, Consolas, "Liberation Mono",
+ "Courier New", monospace;
+}
+*,
+::after,
+::before {
+ box-sizing: border-box;
+}
+html {
+ font-family: sans-serif;
+ line-height: 1.15;
+ -webkit-text-size-adjust: 100%;
+ -webkit-tap-highlight-color: transparent;
+}
+article,
+aside,
+figcaption,
+figure,
+footer,
+header,
+hgroup,
+main,
+nav,
+section {
+ display: block;
+}
+body {
+ margin: 0;
+ font-family: "Inter", -apple-system, BlinkMacSystemFont, "Segoe UI",
+ Roboto, "Helvetica Neue", Arial, "Noto Sans", sans-serif,
+ "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol", "Noto Color Emoji";
+ font-size: 1rem;
+ font-weight: 400;
+ line-height: 1.5;
+ color: #b3b3b3;
+ text-align: left;
+ background-color: #1a1a1a;
+}
+*::-webkit-scrollbar {
+ width: 8px;
+}
+*::-webkit-scrollbar-thumb {
+ background-color: #37373b;
+ opacity: 0.3;
+ border-radius: 30px;
+}
+[tabindex="-1"]:focus {
+ outline: 0 !important;
+}
+hr {
+ box-sizing: content-box;
+ height: 0;
+ overflow: visible;
+}
+h1,
+h2,
+h3,
+h4,
+h5,
+h6 {
+ margin-top: 0;
+ margin-bottom: 0.5rem;
+}
+p {
+ margin-top: 0;
+ margin-bottom: 1rem;
+}
+abbr[data-original-title],
+abbr[title] {
+ text-decoration: underline;
+ text-decoration: underline dotted;
+ cursor: help;
+ border-bottom: 0;
+ text-decoration-skip-ink: none;
+}
+address {
+ margin-bottom: 1rem;
+ font-style: normal;
+ line-height: inherit;
+}
+dl,
+ol,
+ul {
+ margin-top: 0;
+ margin-bottom: 1rem;
+}
+ol ol,
+ol ul,
+ul ol,
+ul ul {
+ margin-bottom: 0;
+}
+dt {
+ font-weight: 700;
+}
+dd {
+ margin-bottom: 0.5rem;
+ margin-left: 0;
+}
+blockquote {
+ margin: 0 0 1rem;
+}
+b,
+strong {
+ font-weight: bolder;
+}
+small {
+ font-size: 80%;
+}
+sub,
+sup {
+ position: relative;
+ font-size: 75%;
+ line-height: 0;
+ vertical-align: baseline;
+}
+sub {
+ bottom: -0.25em;
+}
+sup {
+ top: -0.5em;
+}
+a {
+ color: #b3b3b3;
+ text-decoration: underline;
+ background-color: transparent;
+}
+a:hover {
+ color: #9e9fa8;
+ text-decoration: underline;
+}
+a:not([href]):not([tabindex]) {
+ color: inherit;
+ text-decoration: none;
+}
+a:not([href]):not([tabindex]):focus,
+a:not([href]):not([tabindex]):hover {
+ color: inherit;
+ text-decoration: none;
+}
+a:not([href]):not([tabindex]):focus {
+ outline: 0;
+}
+code,
+kbd,
+pre,
+samp {
+ font-family: "JetBrains Mono", Menlo, Monaco, Consolas, "Liberation Mono", "Courier New",
+ monospace;
+ font-size: 1em;
+}
+pre {
+ margin-top: 0;
+ margin-bottom: 1rem;
+ overflow: auto;
+}
+figure {
+ margin: 0 0 1rem;
+}
+img {
+ vertical-align: middle;
+ border-style: none;
+}
+svg {
+ overflow: hidden;
+ vertical-align: middle;
+}
+table {
+ border-collapse: collapse;
+}
+caption {
+ padding-top: 0.75rem;
+ padding-bottom: 0.75rem;
+ color: #868e96;
+ text-align: left;
+ caption-side: bottom;
+}
+th {
+ text-align: inherit;
+}
+label {
+ display: inline-block;
+ margin-bottom: 0.5rem;
+ display: inline-block;
+ margin-bottom: 0.5rem;
+ color: #959BAD;
+ font-size: 11px;
+ line-height: 12px;
+}
+button {
+ border-radius: 0;
+}
+button:focus {
+ outline: 1px dotted;
+ outline: 5px auto -webkit-focus-ring-color;
+}
+button,
+input,
+optgroup,
+select,
+textarea {
+ margin: 0;
+ font-family: inherit;
+ font-size: inherit;
+ line-height: inherit;
+ background-color: #2b2b2b;
+ color: #d5d5d5d5d5d5;
+ box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 0 2px rgba(79, 86, 89, 0.25);
+}
+button,
+input {
+ overflow: visible;
+}
+button,
+select {
+ text-transform: none;
+}
+select {
+ word-wrap: normal;
+}
+[type="button"],
+[type="reset"],
+[type="submit"],
+button {
+ -webkit-appearance: button;
+}
+[type="button"]:not(:disabled),
+[type="reset"]:not(:disabled),
+[type="submit"]:not(:disabled),
+button:not(:disabled) {
+ cursor: pointer;
+}
+[type="button"]::-moz-focus-inner,
+[type="reset"]::-moz-focus-inner,
+[type="submit"]::-moz-focus-inner,
+button::-moz-focus-inner {
+ padding: 0;
+ border-style: none;
+}
+input[type="checkbox"],
+input[type="radio"] {
+ box-sizing: border-box;
+ padding: 0;
+}
+input[type="date"],
+input[type="datetime-local"],
+input[type="month"],
+input[type="time"] {
+ -webkit-appearance: listbox;
+}
+textarea {
+ overflow: auto;
+ resize: vertical;
+}
+fieldset {
+ min-width: 0;
+ padding: 0;
+ margin: 0;
+ border: 0;
+}
+legend {
+ display: block;
+ width: 100%;
+ max-width: 100%;
+ padding: 0;
+ margin-bottom: 0.5rem;
+ font-size: 1.5rem;
+ line-height: inherit;
+ color: inherit;
+ white-space: normal;
+}
+progress {
+ vertical-align: baseline;
+}
+[type="number"]::-webkit-inner-spin-button,
+[type="number"]::-webkit-outer-spin-button {
+ height: auto;
+}
+[type="search"] {
+ outline-offset: -2px;
+ -webkit-appearance: none;
+}
+[type="search"]::-webkit-search-decoration {
+ -webkit-appearance: none;
+}
+::-webkit-file-upload-button {
+ font: inherit;
+ -webkit-appearance: button;
+}
+output {
+ display: inline-block;
+}
+summary {
+ display: list-item;
+ cursor: pointer;
+}
+template {
+ display: none;
+}
+[hidden] {
+ display: none !important;
+}
+.h1,
+.h2,
+.h3,
+.h4,
+.h5,
+.h6,
+h1,
+h2,
+h3,
+h4,
+h5,
+h6 {
+ margin-bottom: 0.5rem;
+ font-family: inherit;
+ font-weight: 400;
+ line-height: 1.1;
+ color: #d8d7e2;
+}
+.h1,
+h1 {
+ font-size: 1.75rem;
+}
+.h2,
+h2 {
+ font-size: 1.5rem;
+}
+.h3,
+h3 {
+ font-size: 1.3rem;
+}
+.h4,
+h4 {
+ font-size: 1.2rem;
+}
+.h5,
+h5 {
+ font-size: 1.1rem;
+}
+.h6,
+h6 {
+ font-size: 1rem;
+}
+.lead {
+ font-size: 1.25rem;
+ font-weight: 300;
+}
+.display-1 {
+ font-size: 6rem;
+ font-weight: 300;
+ line-height: 1.1;
+}
+.display-2 {
+ font-size: 5.5rem;
+ font-weight: 300;
+ line-height: 1.1;
+}
+.display-3 {
+ font-size: 4.5rem;
+ font-weight: 300;
+ line-height: 1.1;
+}
+.display-4 {
+ font-size: 3.5rem;
+ font-weight: 300;
+ line-height: 1.1;
+}
+hr {
+ margin-top: 1rem;
+ margin-bottom: 1rem;
+ border: 0;
+ border-top: 1px solid rgba(0, 0, 0, 0.1);
+}
+.small,
+small {
+ font-size: 80%;
+ font-weight: 400;
+}
+.mark,
+mark {
+ padding: 0.2em;
+ background-color: #fcf8e3;
+}
+.list-unstyled {
+ padding-left: 0;
+ list-style: none;
+}
+.list-inline {
+ padding-left: 0;
+ list-style: none;
+}
+.list-inline-item {
+ display: inline-block;
+}
+.list-inline-item:not(:last-child) {
+ margin-right: 5px;
+}
+.initialism {
+ font-size: 90%;
+ text-transform: uppercase;
+}
+.blockquote {
+ margin-bottom: 1rem;
+ font-size: 1.25rem;
+}
+.blockquote-footer {
+ display: block;
+ font-size: 80%;
+ color: #868e96;
+}
+.blockquote-footer::before {
+ content: "\2014\00A0";
+}
+.img-fluid {
+ max-width: 100%;
+ height: auto;
+}
+.img-thumbnail {
+ padding: 0.25rem;
+ background-color: #100e0e;
+ border: 1px solid #ddd;
+ border-radius: 2px;
+ max-width: 100%;
+ height: auto;
+}
+.figure {
+ display: inline-block;
+}
+.figure-img {
+ margin-bottom: 0.5rem;
+ line-height: 1;
+}
+.figure-caption {
+ font-size: 90%;
+ color: #868e96;
+}
+code {
+ font-size: 90%;
+ color: #bd4147;
+ word-break: break-word;
+}
+a > code {
+ color: inherit;
+}
+kbd {
+ padding: 0.2rem 0.4rem;
+ font-size: 90%;
+ color: #d5d5d5;
+ background-color: #212529;
+ border-radius: 2px;
+}
+kbd kbd {
+ padding: 0;
+ font-size: 100%;
+ font-weight: 700;
+}
+pre {
+ display: block;
+ font-size: 90%;
+ color: inherit;
+}
+pre code {
+ font-size: inherit;
+ color: inherit;
+ word-break: normal;
+}
+.pre-scrollable {
+ max-height: 340px;
+ overflow-y: scroll;
+}
+.container {
+ width: 100%;
+ padding-right: 15px;
+ padding-left: 15px;
+ margin-right: auto;
+ margin-left: auto;
+}
+@media (min-width: 576px) {
+ .container {
+ max-width: 540px;
+ }
+}
+@media (min-width: 768px) {
+ .container {
+ max-width: 720px;
+ }
+}
+@media (min-width: 992px) {
+ .container {
+ max-width: 960px;
+ }
+}
+@media (min-width: 1200px) {
+ .container {
+ max-width: 1140px;
+ }
+}
+.container-fluid {
+ width: 100%;
+ padding-right: 15px;
+ padding-left: 15px;
+ margin-right: auto;
+ margin-left: auto;
+}
+.row {
+ display: flex;
+ flex-wrap: wrap;
+ margin-right: -15px;
+ margin-left: -15px;
+}
+.no-gutters {
+ margin-right: 0;
+ margin-left: 0;
+}
+.no-gutters > .col,
+.no-gutters > [class*="col-"] {
+ padding-right: 0;
+ padding-left: 0;
+}
+.col,
+.col-1,
+.col-10,
+.col-11,
+.col-12,
+.col-2,
+.col-3,
+.col-4,
+.col-5,
+.col-6,
+.col-7,
+.col-8,
+.col-9,
+.col-auto,
+.col-lg,
+.col-lg-1,
+.col-lg-10,
+.col-lg-11,
+.col-lg-12,
+.col-lg-2,
+.col-lg-3,
+.col-lg-4,
+.col-lg-5,
+.col-lg-6,
+.col-lg-7,
+.col-lg-8,
+.col-lg-9,
+.col-lg-auto,
+.col-md,
+.col-md-1,
+.col-md-10,
+.col-md-11,
+.col-md-12,
+.col-md-2,
+.col-md-3,
+.col-md-4,
+.col-md-5,
+.col-md-6,
+.col-md-7,
+.col-md-8,
+.col-md-9,
+.col-md-auto,
+.col-sm,
+.col-sm-1,
+.col-sm-10,
+.col-sm-11,
+.col-sm-12,
+.col-sm-2,
+.col-sm-3,
+.col-sm-4,
+.col-sm-5,
+.col-sm-6,
+.col-sm-7,
+.col-sm-8,
+.col-sm-9,
+.col-sm-auto,
+.col-xl,
+.col-xl-1,
+.col-xl-10,
+.col-xl-11,
+.col-xl-12,
+.col-xl-2,
+.col-xl-3,
+.col-xl-4,
+.col-xl-5,
+.col-xl-6,
+.col-xl-7,
+.col-xl-8,
+.col-xl-9,
+.col-xl-auto {
+ position: relative;
+ width: 100%;
+ padding-right: 15px;
+ padding-left: 15px;
+}
+.col {
+ flex-basis: 0;
+ flex-grow: 1;
+ max-width: 100%;
+}
+.col-auto {
+ flex: 0 0 auto;
+ width: auto;
+ max-width: 100%;
+}
+.col-1 {
+ flex: 0 0 8.33333%;
+ max-width: 8.33333%;
+}
+.col-2 {
+ flex: 0 0 16.66667%;
+ max-width: 16.66667%;
+}
+.col-3 {
+ flex: 0 0 25%;
+ max-width: 25%;
+}
+.col-4 {
+ flex: 0 0 33.33333%;
+ max-width: 33.33333%;
+}
+.col-5 {
+ flex: 0 0 41.66667%;
+ max-width: 41.66667%;
+}
+.col-6 {
+ flex: 0 0 50%;
+ max-width: 50%;
+}
+.col-7 {
+ flex: 0 0 58.33333%;
+ max-width: 58.33333%;
+}
+.col-8 {
+ flex: 0 0 66.66667%;
+ max-width: 66.66667%;
+}
+.col-9 {
+ flex: 0 0 75%;
+ max-width: 75%;
+}
+.col-10 {
+ flex: 0 0 83.33333%;
+ max-width: 83.33333%;
+}
+.col-11 {
+ flex: 0 0 91.66667%;
+ max-width: 91.66667%;
+}
+.col-12 {
+ flex: 0 0 100%;
+ max-width: 100%;
+}
+.order-first {
+ order: -1;
+}
+.order-last {
+ order: 13;
+}
+.order-0 {
+ order: 0;
+}
+.order-1 {
+ order: 1;
+}
+.order-2 {
+ order: 2;
+}
+.order-3 {
+ order: 3;
+}
+.order-4 {
+ order: 4;
+}
+.order-5 {
+ order: 5;
+}
+.order-6 {
+ order: 6;
+}
+.order-7 {
+ order: 7;
+}
+.order-8 {
+ order: 8;
+}
+.order-9 {
+ order: 9;
+}
+.order-10 {
+ order: 10;
+}
+.order-11 {
+ order: 11;
+}
+.order-12 {
+ order: 12;
+}
+.offset-1 {
+ margin-left: 8.33333%;
+}
+.offset-2 {
+ margin-left: 16.66667%;
+}
+.offset-3 {
+ margin-left: 25%;
+}
+.offset-4 {
+ margin-left: 33.33333%;
+}
+.offset-5 {
+ margin-left: 41.66667%;
+}
+.offset-6 {
+ margin-left: 50%;
+}
+.offset-7 {
+ margin-left: 58.33333%;
+}
+.offset-8 {
+ margin-left: 66.66667%;
+}
+.offset-9 {
+ margin-left: 75%;
+}
+.offset-10 {
+ margin-left: 83.33333%;
+}
+.offset-11 {
+ margin-left: 91.66667%;
+}
+@media (min-width: 576px) {
+ .col-sm {
+ flex-basis: 0;
+ flex-grow: 1;
+ max-width: 100%;
+ }
+ .col-sm-auto {
+ flex: 0 0 auto;
+ width: auto;
+ max-width: 100%;
+ }
+ .col-sm-1 {
+ flex: 0 0 8.33333%;
+ max-width: 8.33333%;
+ }
+ .col-sm-2 {
+ flex: 0 0 16.66667%;
+ max-width: 16.66667%;
+ }
+ .col-sm-3 {
+ flex: 0 0 25%;
+ max-width: 25%;
+ }
+ .col-sm-4 {
+ flex: 0 0 33.33333%;
+ max-width: 33.33333%;
+ }
+ .col-sm-5 {
+ flex: 0 0 41.66667%;
+ max-width: 41.66667%;
+ }
+ .col-sm-6 {
+ flex: 0 0 50%;
+ max-width: 50%;
+ }
+ .col-sm-7 {
+ flex: 0 0 58.33333%;
+ max-width: 58.33333%;
+ }
+ .col-sm-8 {
+ flex: 0 0 66.66667%;
+ max-width: 66.66667%;
+ }
+ .col-sm-9 {
+ flex: 0 0 75%;
+ max-width: 75%;
+ }
+ .col-sm-10 {
+ flex: 0 0 83.33333%;
+ max-width: 83.33333%;
+ }
+ .col-sm-11 {
+ flex: 0 0 91.66667%;
+ max-width: 91.66667%;
+ }
+ .col-sm-12 {
+ flex: 0 0 100%;
+ max-width: 100%;
+ }
+ .order-sm-first {
+ order: -1;
+ }
+ .order-sm-last {
+ order: 13;
+ }
+ .order-sm-0 {
+ order: 0;
+ }
+ .order-sm-1 {
+ order: 1;
+ }
+ .order-sm-2 {
+ order: 2;
+ }
+ .order-sm-3 {
+ order: 3;
+ }
+ .order-sm-4 {
+ order: 4;
+ }
+ .order-sm-5 {
+ order: 5;
+ }
+ .order-sm-6 {
+ order: 6;
+ }
+ .order-sm-7 {
+ order: 7;
+ }
+ .order-sm-8 {
+ order: 8;
+ }
+ .order-sm-9 {
+ order: 9;
+ }
+ .order-sm-10 {
+ order: 10;
+ }
+ .order-sm-11 {
+ order: 11;
+ }
+ .order-sm-12 {
+ order: 12;
+ }
+ .offset-sm-0 {
+ margin-left: 0;
+ }
+ .offset-sm-1 {
+ margin-left: 8.33333%;
+ }
+ .offset-sm-2 {
+ margin-left: 16.66667%;
+ }
+ .offset-sm-3 {
+ margin-left: 25%;
+ }
+ .offset-sm-4 {
+ margin-left: 33.33333%;
+ }
+ .offset-sm-5 {
+ margin-left: 41.66667%;
+ }
+ .offset-sm-6 {
+ margin-left: 50%;
+ }
+ .offset-sm-7 {
+ margin-left: 58.33333%;
+ }
+ .offset-sm-8 {
+ margin-left: 66.66667%;
+ }
+ .offset-sm-9 {
+ margin-left: 75%;
+ }
+ .offset-sm-10 {
+ margin-left: 83.33333%;
+ }
+ .offset-sm-11 {
+ margin-left: 91.66667%;
+ }
+}
+@media (min-width: 768px) {
+ .col-md {
+ flex-basis: 0;
+ flex-grow: 1;
+ max-width: 100%;
+ }
+ .col-md-auto {
+ flex: 0 0 auto;
+ width: auto;
+ max-width: 100%;
+ }
+ .col-md-1 {
+ flex: 0 0 8.33333%;
+ max-width: 8.33333%;
+ }
+ .col-md-2 {
+ flex: 0 0 16.66667%;
+ max-width: 16.66667%;
+ }
+ .col-md-3 {
+ flex: 0 0 25%;
+ max-width: 25%;
+ }
+ .col-md-4 {
+ flex: 0 0 33.33333%;
+ max-width: 33.33333%;
+ }
+ .col-md-5 {
+ flex: 0 0 41.66667%;
+ max-width: 41.66667%;
+ }
+ .col-md-6 {
+ flex: 0 0 50%;
+ max-width: 50%;
+ }
+ .col-md-7 {
+ flex: 0 0 58.33333%;
+ max-width: 58.33333%;
+ }
+ .col-md-8 {
+ flex: 0 0 66.66667%;
+ max-width: 66.66667%;
+ }
+ .col-md-9 {
+ flex: 0 0 75%;
+ max-width: 75%;
+ }
+ .col-md-10 {
+ flex: 0 0 83.33333%;
+ max-width: 83.33333%;
+ }
+ .col-md-11 {
+ flex: 0 0 91.66667%;
+ max-width: 91.66667%;
+ }
+ .col-md-12 {
+ flex: 0 0 100%;
+ max-width: 100%;
+ }
+ .order-md-first {
+ order: -1;
+ }
+ .order-md-last {
+ order: 13;
+ }
+ .order-md-0 {
+ order: 0;
+ }
+ .order-md-1 {
+ order: 1;
+ }
+ .order-md-2 {
+ order: 2;
+ }
+ .order-md-3 {
+ order: 3;
+ }
+ .order-md-4 {
+ order: 4;
+ }
+ .order-md-5 {
+ order: 5;
+ }
+ .order-md-6 {
+ order: 6;
+ }
+ .order-md-7 {
+ order: 7;
+ }
+ .order-md-8 {
+ order: 8;
+ }
+ .order-md-9 {
+ order: 9;
+ }
+ .order-md-10 {
+ order: 10;
+ }
+ .order-md-11 {
+ order: 11;
+ }
+ .order-md-12 {
+ order: 12;
+ }
+ .offset-md-0 {
+ margin-left: 0;
+ }
+ .offset-md-1 {
+ margin-left: 8.33333%;
+ }
+ .offset-md-2 {
+ margin-left: 16.66667%;
+ }
+ .offset-md-3 {
+ margin-left: 25%;
+ }
+ .offset-md-4 {
+ margin-left: 33.33333%;
+ }
+ .offset-md-5 {
+ margin-left: 41.66667%;
+ }
+ .offset-md-6 {
+ margin-left: 50%;
+ }
+ .offset-md-7 {
+ margin-left: 58.33333%;
+ }
+ .offset-md-8 {
+ margin-left: 66.66667%;
+ }
+ .offset-md-9 {
+ margin-left: 75%;
+ }
+ .offset-md-10 {
+ margin-left: 83.33333%;
+ }
+ .offset-md-11 {
+ margin-left: 91.66667%;
+ }
+}
+@media (min-width: 992px) {
+ .col-lg {
+ flex-basis: 0;
+ flex-grow: 1;
+ max-width: 100%;
+ }
+ .col-lg-auto {
+ flex: 0 0 auto;
+ width: auto;
+ max-width: 100%;
+ }
+ .col-lg-1 {
+ flex: 0 0 8.33333%;
+ max-width: 8.33333%;
+ }
+ .col-lg-2 {
+ flex: 0 0 16.66667%;
+ max-width: 16.66667%;
+ }
+ .col-lg-3 {
+ flex: 0 0 25%;
+ max-width: 25%;
+ }
+ .col-lg-4 {
+ flex: 0 0 33.33333%;
+ max-width: 33.33333%;
+ }
+ .col-lg-5 {
+ flex: 0 0 41.66667%;
+ max-width: 41.66667%;
+ }
+ .col-lg-6 {
+ flex: 0 0 50%;
+ max-width: 50%;
+ }
+ .col-lg-7 {
+ flex: 0 0 58.33333%;
+ max-width: 58.33333%;
+ }
+ .col-lg-8 {
+ flex: 0 0 66.66667%;
+ max-width: 66.66667%;
+ }
+ .col-lg-9 {
+ flex: 0 0 75%;
+ max-width: 75%;
+ }
+ .col-lg-10 {
+ flex: 0 0 83.33333%;
+ max-width: 83.33333%;
+ }
+ .col-lg-11 {
+ flex: 0 0 91.66667%;
+ max-width: 91.66667%;
+ }
+ .col-lg-12 {
+ flex: 0 0 100%;
+ max-width: 100%;
+ }
+ .order-lg-first {
+ order: -1;
+ }
+ .order-lg-last {
+ order: 13;
+ }
+ .order-lg-0 {
+ order: 0;
+ }
+ .order-lg-1 {
+ order: 1;
+ }
+ .order-lg-2 {
+ order: 2;
+ }
+ .order-lg-3 {
+ order: 3;
+ }
+ .order-lg-4 {
+ order: 4;
+ }
+ .order-lg-5 {
+ order: 5;
+ }
+ .order-lg-6 {
+ order: 6;
+ }
+ .order-lg-7 {
+ order: 7;
+ }
+ .order-lg-8 {
+ order: 8;
+ }
+ .order-lg-9 {
+ order: 9;
+ }
+ .order-lg-10 {
+ order: 10;
+ }
+ .order-lg-11 {
+ order: 11;
+ }
+ .order-lg-12 {
+ order: 12;
+ }
+ .offset-lg-0 {
+ margin-left: 0;
+ }
+ .offset-lg-1 {
+ margin-left: 8.33333%;
+ }
+ .offset-lg-2 {
+ margin-left: 16.66667%;
+ }
+ .offset-lg-3 {
+ margin-left: 25%;
+ }
+ .offset-lg-4 {
+ margin-left: 33.33333%;
+ }
+ .offset-lg-5 {
+ margin-left: 41.66667%;
+ }
+ .offset-lg-6 {
+ margin-left: 50%;
+ }
+ .offset-lg-7 {
+ margin-left: 58.33333%;
+ }
+ .offset-lg-8 {
+ margin-left: 66.66667%;
+ }
+ .offset-lg-9 {
+ margin-left: 75%;
+ }
+ .offset-lg-10 {
+ margin-left: 83.33333%;
+ }
+ .offset-lg-11 {
+ margin-left: 91.66667%;
+ }
+}
+@media (min-width: 1200px) {
+ .col-xl {
+ flex-basis: 0;
+ flex-grow: 1;
+ max-width: 100%;
+ }
+ .col-xl-auto {
+ flex: 0 0 auto;
+ width: auto;
+ max-width: 100%;
+ }
+ .col-xl-1 {
+ flex: 0 0 8.33333%;
+ max-width: 8.33333%;
+ }
+ .col-xl-2 {
+ flex: 0 0 16.66667%;
+ max-width: 16.66667%;
+ }
+ .col-xl-3 {
+ flex: 0 0 25%;
+ max-width: 25%;
+ }
+ .col-xl-4 {
+ flex: 0 0 33.33333%;
+ max-width: 33.33333%;
+ }
+ .col-xl-5 {
+ flex: 0 0 41.66667%;
+ max-width: 41.66667%;
+ }
+ .col-xl-6 {
+ flex: 0 0 50%;
+ max-width: 50%;
+ }
+ .col-xl-7 {
+ flex: 0 0 58.33333%;
+ max-width: 58.33333%;
+ }
+ .col-xl-8 {
+ flex: 0 0 66.66667%;
+ max-width: 66.66667%;
+ }
+ .col-xl-9 {
+ flex: 0 0 75%;
+ max-width: 75%;
+ }
+ .col-xl-10 {
+ flex: 0 0 83.33333%;
+ max-width: 83.33333%;
+ }
+ .col-xl-11 {
+ flex: 0 0 91.66667%;
+ max-width: 91.66667%;
+ }
+ .col-xl-12 {
+ flex: 0 0 100%;
+ max-width: 100%;
+ }
+ .order-xl-first {
+ order: -1;
+ }
+ .order-xl-last {
+ order: 13;
+ }
+ .order-xl-0 {
+ order: 0;
+ }
+ .order-xl-1 {
+ order: 1;
+ }
+ .order-xl-2 {
+ order: 2;
+ }
+ .order-xl-3 {
+ order: 3;
+ }
+ .order-xl-4 {
+ order: 4;
+ }
+ .order-xl-5 {
+ order: 5;
+ }
+ .order-xl-6 {
+ order: 6;
+ }
+ .order-xl-7 {
+ order: 7;
+ }
+ .order-xl-8 {
+ order: 8;
+ }
+ .order-xl-9 {
+ order: 9;
+ }
+ .order-xl-10 {
+ order: 10;
+ }
+ .order-xl-11 {
+ order: 11;
+ }
+ .order-xl-12 {
+ order: 12;
+ }
+ .offset-xl-0 {
+ margin-left: 0;
+ }
+ .offset-xl-1 {
+ margin-left: 8.33333%;
+ }
+ .offset-xl-2 {
+ margin-left: 16.66667%;
+ }
+ .offset-xl-3 {
+ margin-left: 25%;
+ }
+ .offset-xl-4 {
+ margin-left: 33.33333%;
+ }
+ .offset-xl-5 {
+ margin-left: 41.66667%;
+ }
+ .offset-xl-6 {
+ margin-left: 50%;
+ }
+ .offset-xl-7 {
+ margin-left: 58.33333%;
+ }
+ .offset-xl-8 {
+ margin-left: 66.66667%;
+ }
+ .offset-xl-9 {
+ margin-left: 75%;
+ }
+ .offset-xl-10 {
+ margin-left: 83.33333%;
+ }
+ .offset-xl-11 {
+ margin-left: 91.66667%;
+ }
+}
+.table {
+ width: 100%;
+ margin-bottom: 1rem;
+ color: #d5d5d5;
+ background-color: transparent;
+}
+.table td,
+.table th {
+ padding: 0.75rem;
+ vertical-align: top;
+ border-top: 1px solid #51536b;
+}
+.table thead th {
+ vertical-align: bottom;
+ border-bottom: 2px solid #51536b;
+}
+.table tbody + tbody {
+ border-top: 2px solid #51536b;
+}
+.table-sm td,
+.table-sm th {
+ padding: 0.3rem;
+}
+.table-bordered {
+ border: 1px solid #51536b;
+}
+.table-bordered td,
+.table-bordered th {
+ border: 1px solid #51536b;
+}
+.table-bordered thead td,
+.table-bordered thead th {
+ border-bottom-width: 2px;
+}
+.table-borderless tbody + tbody,
+.table-borderless td,
+.table-borderless th,
+.table-borderless thead th {
+ border: 0;
+}
+.table-striped tbody tr:nth-of-type(odd) {
+ background-color: #100e0e;
+}
+.table-hover tbody tr:hover {
+ color: #d5d5d5;
+ background-color: rgba(0, 0, 0, 0.075);
+}
+.table-primary,
+.table-primary > td,
+.table-primary > th {
+ background-color: #414c50;
+}
+.table-primary tbody + tbody,
+.table-primary td,
+.table-primary th,
+.table-primary thead th {
+ border-color: #2c3436;
+}
+.table-hover .table-primary:hover {
+ background-color: #2c3436;
+}
+.table-hover .table-primary:hover > td,
+.table-hover .table-primary:hover > th {
+ background-color: #a5d0df;
+}
+.table-secondary,
+.table-secondary > td,
+.table-secondary > th {
+ background-color: #323435;
+}
+.table-secondary tbody + tbody,
+.table-secondary td,
+.table-secondary th,
+.table-secondary thead th {
+ border-color: #323435;
+}
+.table-hover .table-secondary:hover {
+ background-color: #414242;
+}
+.table-hover .table-secondary:hover > td,
+.table-hover .table-secondary:hover > th {
+ background-color: #272c29;
+}
+.table-success,
+.table-success > td,
+.table-success > th {
+ background-color: #29302d;
+}
+.table-success tbody + tbody,
+.table-success td,
+.table-success th,
+.table-success thead th {
+ border-color: #343a38;
+}
+.table-hover .table-success:hover {
+ background-color: #29302d;
+}
+.table-hover .table-success:hover > td,
+.table-hover .table-success:hover > th {
+ background-color: #29302d;
+}
+.table-info,
+.table-info > td,
+.table-info > th {
+ background-color: #191d20;
+}
+.table-info tbody + tbody,
+.table-info td,
+.table-info th,
+.table-info thead th {
+ border-color: #191d20;
+}
+.table-hover .table-info:hover {
+ background-color: rgb(30, 32, 34);
+}
+.table-hover .table-info:hover > td,
+.table-hover .table-info:hover > th {
+ background-color: #191d20;
+}
+.table-warning,
+.table-warning > td,
+.table-warning > th {
+ background-color: #493a31;
+}
+.table-warning tbody + tbody,
+.table-warning td,
+.table-warning th,
+.table-warning thead th {
+ border-color: #493a31;
+}
+.table-hover .table-warning:hover {
+ background-color: rgb(56, 51, 47);
+}
+.table-hover .table-warning:hover > td,
+.table-hover .table-warning:hover > th {
+ background-color: #493a31;
+}
+.table-danger,
+.table-danger > td,
+.table-danger > th {
+ background-color: #463030;
+}
+.table-danger tbody + tbody,
+.table-danger td,
+.table-danger th,
+.table-danger thead th {
+ border-color: #463030;
+}
+.table-hover .table-danger:hover {
+ background-color: #463030;
+}
+.table-hover .table-danger:hover > td,
+.table-hover .table-danger:hover > th {
+ background-color: #463030;
+}
+.table-light,
+.table-light > td,
+.table-light > th {
+ background-color: #c3c4c9;
+}
+.table-light tbody + tbody,
+.table-light td,
+.table-light th,
+.table-light thead th {
+ border-color: #90919b;
+}
+.table-hover .table-light:hover {
+ background-color: #b6b7bd;
+}
+.table-hover .table-light:hover > td,
+.table-hover .table-light:hover > th {
+ background-color: #b6b7bd;
+}
+.table-dark,
+.table-dark > td,
+.table-dark > th {
+ background-color: #c1c1c7;
+}
+.table-dark tbody + tbody,
+.table-dark td,
+.table-dark th,
+.table-dark thead th {
+ border-color: #8c8d96;
+}
+.table-hover .table-dark:hover {
+ background-color: #b4b4bb;
+}
+.table-hover .table-dark:hover > td,
+.table-hover .table-dark:hover > th {
+ background-color: #b4b4bb;
+}
+.table-active,
+.table-active > td,
+.table-active > th {
+ background-color: rgba(0, 0, 0, 0.075);
+}
+.table-hover .table-active:hover {
+ background-color: rgba(0, 0, 0, 0.075);
+}
+.table-hover .table-active:hover > td,
+.table-hover .table-active:hover > th {
+ background-color: rgba(0, 0, 0, 0.075);
+}
+.table .thead-dark th {
+ color: #d5d5d5;
+ background-color: #343a40;
+ border-color: #454d55;
+}
+.table .thead-light th {
+ color: #d5d5d5;
+ background-color: #100e0e;
+ border-color: #51536b;
+}
+.table-dark {
+ color: #d5d5d5;
+ background-color: #343a40;
+}
+.table-dark td,
+.table-dark th,
+.table-dark thead th {
+ border-color: #454d55;
+}
+.table-dark.table-bordered {
+ border: 0;
+}
+.table-dark.table-striped tbody tr:nth-of-type(odd) {
+ background-color: rgba(255, 255, 255, 0.05);
+}
+.table-dark.table-hover tbody tr:hover {
+ color: #d5d5d5;
+ background-color: rgba(255, 255, 255, 0.075);
+}
+@media (max-width: 575.98px) {
+ .table-responsive-sm {
+ display: block;
+ width: 100%;
+ overflow-x: auto;
+ -webkit-overflow-scrolling: touch;
+ }
+ .table-responsive-sm > .table-bordered {
+ border: 0;
+ }
+}
+@media (max-width: 767.98px) {
+ .table-responsive-md {
+ display: block;
+ width: 100%;
+ overflow-x: auto;
+ -webkit-overflow-scrolling: touch;
+ }
+ .table-responsive-md > .table-bordered {
+ border: 0;
+ }
+}
+@media (max-width: 991.98px) {
+ .table-responsive-lg {
+ display: block;
+ width: 100%;
+ overflow-x: auto;
+ -webkit-overflow-scrolling: touch;
+ }
+ .table-responsive-lg > .table-bordered {
+ border: 0;
+ }
+}
+@media (max-width: 1199.98px) {
+ .table-responsive-xl {
+ display: block;
+ width: 100%;
+ overflow-x: auto;
+ -webkit-overflow-scrolling: touch;
+ }
+ .table-responsive-xl > .table-bordered {
+ border: 0;
+ }
+}
+.table-responsive {
+ display: block;
+ width: 100%;
+ overflow-x: auto;
+ -webkit-overflow-scrolling: touch;
+}
+.table-responsive > .table-bordered {
+ border: 0;
+}
+.form-control {
+ display: block;
+ width: 100%;
+ height: calc(1.25em + 1rem + 2px);
+ padding: 0.5rem 0.75rem !important;
+ font-size: 0.875rem !important;
+ font-weight: 400;
+ line-height: 1.25;
+ color: #aaaaaa !important;
+ background-color: #252525 !important;
+ background-clip: padding-box;
+ border: none !important;
+ border-radius: 2px !important;
+ transition: border-color 0.15s ease-in-out, box-shadow 0.15s ease-in-out;
+ -webkit-appearance: none !important;
+ -moz-appearance: none !important;
+}
+@media (prefers-reduced-motion: reduce) {
+ .form-control {
+ transition: none;
+ }
+}
+.form-control::-ms-expand {
+ background-color: transparent;
+ border: 0;
+}
+.form-control:focus {
+ color: #aaaaaa;
+ background-color: #1a1a1a;
+ border-color: #6d7172;
+ outline: 0;
+ box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075),
+ 0 0 0 3px rgba(0, 122, 166, 0.25);
+}
+.form-control::placeholder {
+ color: #868e96;
+ opacity: 1;
+}
+.form-control:disabled,
+.form-control[readonly] {
+ background-color: ##222225;
+ opacity: 1;
+}
+select.form-control:focus::-ms-value {
+ color: #aaaaaa;
+ background-color: #1a1a1a;
+}
+.form-control-file,
+.form-control-range {
+ display: block;
+ width: 100%;
+}
+.col-form-label {
+ padding-top: calc(0.5rem + 1px);
+ padding-bottom: calc(0.5rem + 1px);
+ margin-bottom: 0;
+ font-size: inherit;
+ line-height: 1.25;
+}
+.col-form-label-lg {
+ padding-top: calc(0.5rem + 1px);
+ padding-bottom: calc(0.5rem + 1px);
+ font-size: 1.25rem;
+ line-height: 1.5;
+}
+.col-form-label-sm {
+ padding-top: calc(0.25rem + 1px);
+ padding-bottom: calc(0.25rem + 1px);
+ font-size: 0.875rem;
+ line-height: 1.5;
+}
+.form-control-plaintext {
+ display: block;
+ width: 100%;
+ padding-top: 0.5rem;
+ padding-bottom: 0.5rem;
+ margin-bottom: 0;
+ line-height: 1.25;
+ color: #d5d5d5;
+ background-color: transparent;
+ border: solid transparent;
+ border-width: 1px 0;
+}
+.form-control-plaintext.form-control-lg,
+.form-control-plaintext.form-control-sm {
+ padding-right: 0;
+ padding-left: 0;
+}
+.form-control-sm {
+ height: calc(1.5em + 0.5rem + 2px);
+ padding: 0.25rem 0.5rem;
+ font-size: 0.875rem;
+ line-height: 1.5;
+ border-radius: 2px;
+}
+.form-control-lg {
+ height: calc(1.5em + 1rem + 2px);
+ padding: 0.5rem 1rem;
+ font-size: 1.25rem;
+ line-height: 1.5;
+ border-radius: 2px;
+}
+select.form-control[multiple],
+select.form-control[size] {
+ height: auto;
+}
+textarea.form-control {
+ height: auto;
+}
+.form-group {
+ margin-bottom: 1rem;
+}
+.form-text {
+ display: block;
+ margin-top: 0.25rem;
+}
+.form-row {
+ display: flex;
+ flex-wrap: wrap;
+ margin-right: -5px;
+ margin-left: -5px;
+}
+.form-row > .col,
+.form-row > [class*="col-"] {
+ padding-right: 5px;
+ padding-left: 5px;
+}
+.form-check {
+ position: relative;
+ display: block;
+ padding-left: 1.25rem;
+}
+.form-check-input {
+ position: absolute;
+ margin-top: 0.25rem;
+ margin-left: -1.25rem;
+}
+.form-check-input:disabled ~ .form-check-label {
+ color: #868e96;
+}
+.form-check-label {
+ margin-bottom: 0;
+ font-size: 13px;
+ line-height: 18px;
+ color: #9e9eab;
+ text-transform: initial;
+ display: initial;
+}
+.form-check-inline {
+ display: inline-flex;
+ align-items: center;
+ padding-left: 0;
+ margin-right: 0.75rem;
+}
+.form-check-inline .form-check-input {
+ position: static;
+ margin-top: 0;
+ margin-right: 0.3125rem;
+ margin-left: 0;
+}
+.valid-feedback {
+ display: none;
+ width: 100%;
+ margin-top: 0.25rem;
+ font-size: 80%;
+ color: #366a57;
+}
+.valid-tooltip {
+ position: absolute;
+ top: 100%;
+ z-index: 5;
+ display: none;
+ max-width: 100%;
+ padding: 3px 8px;
+ margin-top: 0.1rem;
+ font-size: 0.875rem;
+ line-height: 1.5;
+ color: #d5d5d5;
+ background-color: rgba(50, 186, 137, 0.9);
+ border-radius: 2px;
+}
+.form-control.is-valid,
+.was-validated .form-control:valid {
+ border-color: #366a57;
+ padding-right: calc(1.25em + 1rem);
+ background-image: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 8 8'%3e%3cpath fill='%2332BA89' d='M2.3 6.73L.6 4.53c-.4-1.04.46-1.4 1.1-.8l1.1 1.4 3.4-3.8c.6-.63 1.6-.27 1.2.7l-4 4.6c-.43.5-.8.4-1.1.1z'/%3e%3c/svg%3e");
+ background-repeat: no-repeat;
+ background-position: center right calc(0.3125em + 0.25rem);
+ background-size: calc(0.625em + 0.5rem) calc(0.625em + 0.5rem);
+}
+.form-control.is-valid:focus,
+.was-validated .form-control:valid:focus {
+ border-color: #366a57;
+ box-shadow: 0 0 0 0.2rem rgba(50, 186, 137, 0.25);
+}
+.form-control.is-valid ~ .valid-feedback,
+.form-control.is-valid ~ .valid-tooltip,
+.was-validated .form-control:valid ~ .valid-feedback,
+.was-validated .form-control:valid ~ .valid-tooltip {
+ display: block;
+}
+.was-validated textarea.form-control:valid,
+textarea.form-control.is-valid {
+ padding-right: calc(1.25em + 1rem);
+ background-position: top calc(0.3125em + 0.25rem) right
+ calc(0.3125em + 0.25rem);
+}
+.custom-select.is-valid,
+.was-validated .custom-select:valid {
+ border-color: #366a57;
+ padding-right: calc((1em + 0.75rem) * 3 / 4 + 1.75rem);
+ background: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 4 5'%3e%3cpath fill='%23333' d='M2 0L0 2h4zm0 5L0 3h4z'/%3e%3c/svg%3e")
+ no-repeat right 0.75rem center/8px 10px,
+ url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 8 8'%3e%3cpath fill='%2332BA89' d='M2.3 6.73L.6 4.53c-.4-1.04.46-1.4 1.1-.8l1.1 1.4 3.4-3.8c.6-.63 1.6-.27 1.2.7l-4 4.6c-.43.5-.8.4-1.1.1z'/%3e%3c/svg%3e")
+ #28282D no-repeat center right 1.75rem / calc(0.625em + 0.5rem)
+ calc(0.625em + 0.5rem);
+}
+.custom-select.is-valid:focus,
+.was-validated .custom-select:valid:focus {
+ border-color: #366a57;
+ box-shadow: 0 0 0 0.2rem rgba(50, 186, 137, 0.25);
+}
+.custom-select.is-valid ~ .valid-feedback,
+.custom-select.is-valid ~ .valid-tooltip,
+.was-validated .custom-select:valid ~ .valid-feedback,
+.was-validated .custom-select:valid ~ .valid-tooltip {
+ display: block;
+}
+.form-control-file.is-valid ~ .valid-feedback,
+.form-control-file.is-valid ~ .valid-tooltip,
+.was-validated .form-control-file:valid ~ .valid-feedback,
+.was-validated .form-control-file:valid ~ .valid-tooltip {
+ display: block;
+}
+.form-check-input.is-valid ~ .form-check-label,
+.was-validated .form-check-input:valid ~ .form-check-label {
+ color: #366a57;
+}
+.form-check-input.is-valid ~ .valid-feedback,
+.form-check-input.is-valid ~ .valid-tooltip,
+.was-validated .form-check-input:valid ~ .valid-feedback,
+.was-validated .form-check-input:valid ~ .valid-tooltip {
+ display: block;
+}
+.custom-control-input.is-valid ~ .custom-control-label,
+.was-validated .custom-control-input:valid ~ .custom-control-label {
+ color: #366a57;
+}
+.custom-control-input.is-valid ~ .custom-control-label::before,
+.was-validated .custom-control-input:valid ~ .custom-control-label::before {
+ border-color: #366a57;
+}
+.custom-control-input.is-valid ~ .valid-feedback,
+.custom-control-input.is-valid ~ .valid-tooltip,
+.was-validated .custom-control-input:valid ~ .valid-feedback,
+.was-validated .custom-control-input:valid ~ .valid-tooltip {
+ display: block;
+}
+.custom-control-input.is-valid:checked ~ .custom-control-label::before,
+.was-validated
+ .custom-control-input:valid:checked
+ ~ .custom-control-label::before {
+ border-color: #4fd0a1;
+ background-color: #4fd0a1;
+}
+.custom-control-input.is-valid:focus ~ .custom-control-label::before,
+.was-validated
+ .custom-control-input:valid:focus
+ ~ .custom-control-label::before {
+ box-shadow: 0 0 0 0.2rem rgba(50, 186, 137, 0.25);
+}
+.custom-control-input.is-valid:focus:not(:checked)
+ ~ .custom-control-label::before,
+.was-validated
+ .custom-control-input:valid:focus:not(:checked)
+ ~ .custom-control-label::before {
+ border-color: #366a57;
+}
+.custom-file-input.is-valid ~ .custom-file-label,
+.was-validated .custom-file-input:valid ~ .custom-file-label {
+ border-color: #366a57;
+}
+.custom-file-input.is-valid ~ .valid-feedback,
+.custom-file-input.is-valid ~ .valid-tooltip,
+.was-validated .custom-file-input:valid ~ .valid-feedback,
+.was-validated .custom-file-input:valid ~ .valid-tooltip {
+ display: block;
+}
+.custom-file-input.is-valid:focus ~ .custom-file-label,
+.was-validated .custom-file-input:valid:focus ~ .custom-file-label {
+ border-color: #366a57;
+ box-shadow: 0 0 0 0.2rem rgba(50, 186, 137, 0.25);
+}
+.invalid-feedback {
+ display: none;
+ width: 100%;
+ margin-top: 0.25rem;
+ font-size: 80%;
+ color: #823a3a;
+}
+.invalid-tooltip {
+ position: absolute;
+ top: 100%;
+ z-index: 5;
+ display: none;
+ max-width: 100%;
+ padding: 3px 8px;
+ margin-top: 0.1rem;
+ font-size: 0.875rem;
+ line-height: 1.5;
+ color: #d5d5d5;
+ background-color: rgba(184, 64, 64, 0.9);
+ border-radius: 2px;
+}
+.form-control.is-invalid,
+.was-validated .form-control:invalid {
+ border-color: #823a3a;
+ padding-right: calc(1.25em + 1rem);
+ background-image: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' fill='%23B84040' viewBox='-2 -2 7 7'%3e%3cpath stroke='%23B84040' d='M0 0l3 3m0-3L0 3'/%3e%3ccircle r='.5'/%3e%3ccircle cx='3' r='.5'/%3e%3ccircle cy='3' r='.5'/%3e%3ccircle cx='3' cy='3' r='.5'/%3e%3c/svg%3E");
+ background-repeat: no-repeat;
+ background-position: center right calc(0.3125em + 0.25rem);
+ background-size: calc(0.625em + 0.5rem) calc(0.625em + 0.5rem);
+}
+.form-control.is-invalid:focus,
+.was-validated .form-control:invalid:focus {
+ border-color: #823a3a;
+ box-shadow: 0 0 0 0.2rem rgba(184, 64, 64, 0.25);
+}
+.form-control.is-invalid ~ .invalid-feedback,
+.form-control.is-invalid ~ .invalid-tooltip,
+.was-validated .form-control:invalid ~ .invalid-feedback,
+.was-validated .form-control:invalid ~ .invalid-tooltip {
+ display: block;
+}
+.was-validated textarea.form-control:invalid,
+textarea.form-control.is-invalid {
+ padding-right: calc(1.25em + 1rem);
+ background-position: top calc(0.3125em + 0.25rem) right
+ calc(0.3125em + 0.25rem);
+}
+.custom-select.is-invalid,
+.was-validated .custom-select:invalid {
+ border-color: #823a3a;
+ padding-right: calc((1em + 0.75rem) * 3 / 4 + 1.75rem);
+ background: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 4 5'%3e%3cpath fill='%23333' d='M2 0L0 2h4zm0 5L0 3h4z'/%3e%3c/svg%3e")
+ no-repeat right 0.75rem center/8px 10px,
+ url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' fill='%23B84040' viewBox='-2 -2 7 7'%3e%3cpath stroke='%23B84040' d='M0 0l3 3m0-3L0 3'/%3e%3ccircle r='.5'/%3e%3ccircle cx='3' r='.5'/%3e%3ccircle cy='3' r='.5'/%3e%3ccircle cx='3' cy='3' r='.5'/%3e%3c/svg%3E")
+ #28282D no-repeat center right 1.75rem / calc(0.625em + 0.5rem)
+ calc(0.625em + 0.5rem);
+}
+.custom-select.is-invalid:focus,
+.was-validated .custom-select:invalid:focus {
+ border-color: #823a3a;
+ box-shadow: 0 0 0 0.2rem rgba(184, 64, 64, 0.25);
+}
+.custom-select.is-invalid ~ .invalid-feedback,
+.custom-select.is-invalid ~ .invalid-tooltip,
+.was-validated .custom-select:invalid ~ .invalid-feedback,
+.was-validated .custom-select:invalid ~ .invalid-tooltip {
+ display: block;
+}
+.form-control-file.is-invalid ~ .invalid-feedback,
+.form-control-file.is-invalid ~ .invalid-tooltip,
+.was-validated .form-control-file:invalid ~ .invalid-feedback,
+.was-validated .form-control-file:invalid ~ .invalid-tooltip {
+ display: block;
+}
+.form-check-input.is-invalid ~ .form-check-label,
+.was-validated .form-check-input:invalid ~ .form-check-label {
+ color: #823a3a;
+}
+.form-check-input.is-invalid ~ .invalid-feedback,
+.form-check-input.is-invalid ~ .invalid-tooltip,
+.was-validated .form-check-input:invalid ~ .invalid-feedback,
+.was-validated .form-check-input:invalid ~ .invalid-tooltip {
+ display: block;
+}
+.custom-control-input.is-invalid ~ .custom-control-label,
+.was-validated .custom-control-input:invalid ~ .custom-control-label {
+ color: #823a3a;
+}
+.custom-control-input.is-invalid ~ .custom-control-label::before,
+.was-validated .custom-control-input:invalid ~ .custom-control-label::before {
+ border-color: #823a3a;
+}
+.custom-control-input.is-invalid ~ .invalid-feedback,
+.custom-control-input.is-invalid ~ .invalid-tooltip,
+.was-validated .custom-control-input:invalid ~ .invalid-feedback,
+.was-validated .custom-control-input:invalid ~ .invalid-tooltip {
+ display: block;
+}
+.custom-control-input.is-invalid:checked ~ .custom-control-label::before,
+.was-validated
+ .custom-control-input:invalid:checked
+ ~ .custom-control-label::before {
+ border-color: #c96262;
+ background-color: #c96262;
+}
+.custom-control-input.is-invalid:focus ~ .custom-control-label::before,
+.was-validated
+ .custom-control-input:invalid:focus
+ ~ .custom-control-label::before {
+ box-shadow: 0 0 0 0.2rem rgba(184, 64, 64, 0.25);
+}
+.custom-control-input.is-invalid:focus:not(:checked)
+ ~ .custom-control-label::before,
+.was-validated
+ .custom-control-input:invalid:focus:not(:checked)
+ ~ .custom-control-label::before {
+ border-color: #823a3a;
+}
+.custom-file-input.is-invalid ~ .custom-file-label,
+.was-validated .custom-file-input:invalid ~ .custom-file-label {
+ border-color: #823a3a;
+}
+.custom-file-input.is-invalid ~ .invalid-feedback,
+.custom-file-input.is-invalid ~ .invalid-tooltip,
+.was-validated .custom-file-input:invalid ~ .invalid-feedback,
+.was-validated .custom-file-input:invalid ~ .invalid-tooltip {
+ display: block;
+}
+.custom-file-input.is-invalid:focus ~ .custom-file-label,
+.was-validated .custom-file-input:invalid:focus ~ .custom-file-label {
+ border-color: #823a3a;
+ box-shadow: 0 0 0 0.2rem rgba(184, 64, 64, 0.25);
+}
+.form-inline {
+ display: flex;
+ flex-flow: row wrap;
+ align-items: center;
+}
+.form-inline .form-check {
+ width: 100%;
+}
+@media (min-width: 576px) {
+ .form-inline label {
+ display: flex;
+ align-items: center;
+ justify-content: center;
+ margin-bottom: 0;
+ }
+ .form-inline .form-group {
+ display: flex;
+ flex: 0 0 auto;
+ flex-flow: row wrap;
+ align-items: center;
+ margin-bottom: 0;
+ }
+ .form-inline .form-control {
+ display: inline-block;
+ width: auto;
+ vertical-align: middle;
+ }
+ .form-inline .form-control-plaintext {
+ display: inline-block;
+ }
+ .form-inline .custom-select,
+ .form-inline .input-group {
+ width: auto;
+ }
+ .form-inline .form-check {
+ display: flex;
+ align-items: center;
+ justify-content: center;
+ width: auto;
+ padding-left: 0;
+ }
+ .form-inline .form-check-input {
+ position: relative;
+ flex-shrink: 0;
+ margin-top: 0;
+ margin-right: 0.25rem;
+ margin-left: 0;
+ }
+ .form-inline .custom-control {
+ align-items: center;
+ justify-content: center;
+ }
+ .form-inline .custom-control-label {
+ margin-bottom: 0;
+ }
+}
+.btn {
+ display: inline-block;
+ font-weight: 400;
+ color: #d5d5d5;
+ text-align: center;
+ vertical-align: middle;
+ user-select: none;
+ background-color: transparent;
+ border: 1px solid transparent;
+ padding: 0.5rem 0.75rem;
+ font-size: 1rem;
+ line-height: 1.25;
+ border-radius: 2px;
+ transition: all 0.15s ease-in-out;
+}
+@media (prefers-reduced-motion: reduce) {
+ .btn {
+ transition: none;
+ }
+}
+.btn:hover {
+ color: #d5d5d5;
+ text-decoration: none;
+}
+.btn.focus,
+.btn:focus {
+ outline: 0;
+ box-shadow: 0 0 0 3px rgba(0, 122, 166, 0.25);
+}
+.btn.disabled,
+.btn:disabled {
+ opacity: 0.65;
+}
+a.btn.disabled,
+fieldset:disabled a.btn {
+ pointer-events: none;
+}
+.btn-primary {
+ color: #d5d5d5;
+ background-color: #2f5360;
+ border-color: #007aa6;
+}
+.btn-primary:hover {
+ color: #d5d5d5;
+ background-color: #005e80;
+ border-color: #005573;
+}
+.btn-primary.focus,
+.btn-primary:focus {
+ box-shadow: 0 0 0 0.2rem rgba(38, 142, 179, 0.5);
+}
+.btn-primary.disabled,
+.btn-primary:disabled {
+ color: #d5d5d5;
+ background-color: #153844;
+ border-color: #007aa6;
+}
+.btn-primary:not(:disabled):not(.disabled).active,
+.btn-primary:not(:disabled):not(.disabled):active,
+.show > .btn-primary.dropdown-toggle {
+ color: #d5d5d5;
+ background-color: #005573;
+ border-color: #004b66;
+}
+.btn-primary:not(:disabled):not(.disabled).active:focus,
+.btn-primary:not(:disabled):not(.disabled):active:focus,
+.show > .btn-primary.dropdown-toggle:focus {
+ box-shadow: 0 0 0 0.2rem rgba(38, 142, 179, 0.5);
+}
+.btn-secondary {
+ color: #d5d5d5;
+ background-color: #38383c;
+ border-color: #66666a;
+}
+.btn-secondary:hover {
+ color: #d5d5d5;
+ background-color: #606061;
+ border-color: #434559;
+}
+.btn-secondary.focus,
+.btn-secondary:focus {
+ box-shadow: 0 0 0 0.2rem rgba(114, 116, 139, 0.5);
+}
+.btn-secondary.disabled,
+.btn-secondary:disabled {
+ color: #aca9a9;
+ background-color: #38383c;
+ border-color: #66666a;
+}
+.btn-secondary.disabled:hover,
+.btn-secondary:disabled:hover {
+ color: #aca9a9;
+ background-color: #606061;
+ border-color: #66666a;
+}
+.btn-secondary:not(:disabled):not(.disabled).active,
+.btn-secondary:not(:disabled):not(.disabled):active,
+.show > .btn-secondary.dropdown-toggle {
+ color: #d5d5d5;
+ background-color: #434559;
+ border-color: #3e4052;
+}
+.btn-secondary:not(:disabled):not(.disabled).active:focus,
+.btn-secondary:not(:disabled):not(.disabled):active:focus,
+.show > .btn-secondary.dropdown-toggle:focus {
+ box-shadow: 0 0 0 0.2rem rgba(114, 116, 139, 0.5);
+}
+.btn-success {
+ color: #d5d5d5;
+ background-color: #366a57;
+ border-color: #32ba89;
+}
+.btn-success:hover {
+ color: #d5d5d5;
+ background-color: #2a9c73;
+ border-color: #27926b;
+}
+.btn-success.focus,
+.btn-success:focus {
+ box-shadow: 0 0 0 0.2rem rgba(81, 196, 155, 0.5);
+}
+.btn-success.disabled,
+.btn-success:disabled {
+ color: #d5d5d5;
+ background-color: #637a72;
+ border-color: #32ba89;
+}
+.btn-success:not(:disabled):not(.disabled).active,
+.btn-success:not(:disabled):not(.disabled):active,
+.show > .btn-success.dropdown-toggle {
+ color: #d5d5d5;
+ background-color: #27926b;
+ border-color: #248864;
+}
+.btn-success:not(:disabled):not(.disabled).active:focus,
+.btn-success:not(:disabled):not(.disabled):active:focus,
+.show > .btn-success.dropdown-toggle:focus {
+ box-shadow: 0 0 0 0.2rem rgba(81, 196, 155, 0.5);
+}
+.btn-info {
+ color: #d5d5d5;
+ background-color: #053c64;
+ border-color: #355f7d;
+}
+.btn-info:hover {
+ color: #d5d5d5;
+ background-color: #2a4b62;
+ border-color: #264459;
+}
+.btn-info.focus,
+.btn-info:focus {
+ box-shadow: 0 0 0 0.2rem rgba(83, 119, 145, 0.5);
+}
+.btn-info.disabled,
+.btn-info:disabled {
+ color: #d5d5d5;
+ background-color: #053c64;
+ border-color: #355f7d;
+}
+.btn-info:not(:disabled):not(.disabled).active,
+.btn-info:not(:disabled):not(.disabled):active,
+.show > .btn-info.dropdown-toggle {
+ color: #d5d5d5;
+ background-color: #264459;
+ border-color: #223d50;
+}
+.btn-info:not(:disabled):not(.disabled).active:focus,
+.btn-info:not(:disabled):not(.disabled):active:focus,
+.show > .btn-info.dropdown-toggle:focus {
+ box-shadow: 0 0 0 0.2rem rgba(83, 119, 145, 0.5);
+}
+.btn-warning {
+ color: #d5d5d5;
+ background-color: #8a5026;
+ border-color: #c97539;
+}
+.btn-warning:hover {
+ color: #d5d5d5;
+ background-color: #ad632f;
+ border-color: #a35e2c;
+}
+.btn-warning.focus,
+.btn-warning:focus {
+ box-shadow: 0 0 0 0.2rem rgba(209, 138, 87, 0.5);
+}
+.btn-warning.disabled,
+.btn-warning:disabled {
+ color: #d5d5d5;
+ background-color: #8a5026;
+ border-color: #c97539;
+}
+.btn-warning:not(:disabled):not(.disabled).active,
+.btn-warning:not(:disabled):not(.disabled):active,
+.show > .btn-warning.dropdown-toggle {
+ color: #d5d5d5;
+ background-color: #a35e2c;
+ border-color: #99582a;
+}
+.btn-warning:not(:disabled):not(.disabled).active:focus,
+.btn-warning:not(:disabled):not(.disabled):active:focus,
+.show > .btn-warning.dropdown-toggle:focus {
+ box-shadow: 0 0 0 0.2rem rgba(209, 138, 87, 0.5);
+}
+.btn-danger {
+ color: #d5d5d5;
+ background-color: #823a3a;
+ border-color: #b84040;
+}
+.btn-danger:hover {
+ color: #d5d5d5;
+ background-color: #9c3636;
+ border-color: #923333;
+}
+.btn-danger.focus,
+.btn-danger:focus {
+ box-shadow: 0 0 0 0.2rem rgba(195, 93, 93, 0.5);
+}
+.btn-danger.disabled,
+.btn-danger:disabled {
+ color: #d5d5d5;
+ background-color: #823a3a;
+ border-color: #b84040;
+}
+.btn-danger:not(:disabled):not(.disabled).active,
+.btn-danger:not(:disabled):not(.disabled):active,
+.show > .btn-danger.dropdown-toggle {
+ color: #d5d5d5;
+ background-color: #923333;
+ border-color: #893030;
+}
+.btn-danger:not(:disabled):not(.disabled).active:focus,
+.btn-danger:not(:disabled):not(.disabled):active:focus,
+.show > .btn-danger.dropdown-toggle:focus {
+ box-shadow: 0 0 0 0.2rem rgba(195, 93, 93, 0.5);
+}
+.btn-light {
+ color: #d5d5d5;
+ background-color: #1f2020;
+ border-color: #1f2020;
+}
+.btn-light:hover {
+ color: #d5d5d5;
+ background-color: #1b1c28;
+ border-color: #161720;
+}
+.btn-light.focus,
+.btn-light:focus {
+ box-shadow: 0 0 0 0.2rem rgba(74, 76, 92, 0.5);
+}
+.btn-light.disabled,
+.btn-light:disabled {
+ color: #d5d5d5;
+ background-color: #1f2020;
+ border-color: #1f2020;
+}
+.btn-light:not(:disabled):not(.disabled).active,
+.btn-light:not(:disabled):not(.disabled):active,
+.show > .btn-light.dropdown-toggle {
+ color: #d5d5d5;
+ background-color: #161720;
+ border-color: #111119;
+}
+.btn-light:not(:disabled):not(.disabled).active:focus,
+.btn-light:not(:disabled):not(.disabled):active:focus,
+.show > .btn-light.dropdown-toggle:focus {
+ box-shadow: 0 0 0 0.2rem rgba(74, 76, 92, 0.5);
+}
+.btn-dark {
+ color: #d5d5d5;
+ background-color: #1a1a1a;
+ border-color: #1a1a1a;
+}
+.btn-dark:hover {
+ color: #d5d5d5;
+ background-color: #13141f;
+ border-color: #0e0f17;
+}
+.btn-dark.focus,
+.btn-dark:focus {
+ box-shadow: 0 0 0 0.2rem rgba(67, 68, 84, 0.5);
+}
+.btn-dark.disabled,
+.btn-dark:disabled {
+ color: #d5d5d5;
+ background-color: #1a1a1a;
+ border-color: #1a1a1a;
+}
+.btn-dark:not(:disabled):not(.disabled).active,
+.btn-dark:not(:disabled):not(.disabled):active,
+.show > .btn-dark.dropdown-toggle {
+ color: #d5d5d5;
+ background-color: #0e0f17;
+ border-color: #090a0f;
+}
+.btn-dark:not(:disabled):not(.disabled).active:focus,
+.btn-dark:not(:disabled):not(.disabled):active:focus,
+.show > .btn-dark.dropdown-toggle:focus {
+ box-shadow: 0 0 0 0.2rem rgba(67, 68, 84, 0.5);
+}
+.btn-outline-primary {
+ color: #28282D;
+ border-color: #007aa6;
+}
+.btn-outline-primary:hover {
+ color: #d5d5d5;
+ background-color: #28282D;
+ border-color: #007aa6;
+}
+.btn-outline-primary.focus,
+.btn-outline-primary:focus {
+ box-shadow: 0 0 0 0.2rem rgba(0, 122, 166, 0.5);
+}
+.btn-outline-primary.disabled,
+.btn-outline-primary:disabled {
+ color: #28282D;
+ background-color: transparent;
+}
+.btn-outline-primary:not(:disabled):not(.disabled).active,
+.btn-outline-primary:not(:disabled):not(.disabled):active,
+.show > .btn-outline-primary.dropdown-toggle {
+ color: #d5d5d5;
+ background-color: #007aa6;
+ border-color: #28282D;
+}
+.btn-outline-primary:not(:disabled):not(.disabled).active:focus,
+.btn-outline-primary:not(:disabled):not(.disabled):active:focus,
+.show > .btn-outline-primary.dropdown-toggle:focus {
+ box-shadow: 0 0 0 0.2rem rgba(0, 122, 166, 0.5);
+}
+.btn-outline-secondary {
+ color: #59595d;
+ border-color: #66666a;
+}
+.btn-outline-secondary:hover {
+ color: #d5d5d5;
+ background-color: #59595d;
+ border-color: #66666a;
+}
+.btn-outline-secondary.focus,
+.btn-outline-secondary:focus {
+ box-shadow: 0 0 0 0.2rem rgba(89, 92, 118, 0.5);
+}
+.btn-outline-secondary.disabled,
+.btn-outline-secondary:disabled {
+ color: #59595d;
+ background-color: transparent;
+}
+.btn-outline-secondary:not(:disabled):not(.disabled).active,
+.btn-outline-secondary:not(:disabled):not(.disabled):active,
+.show > .btn-outline-secondary.dropdown-toggle {
+ color: #d5d5d5;
+ background-color: #59595d;
+ border-color: #66666a;
+}
+.btn-outline-secondary:not(:disabled):not(.disabled).active:focus,
+.btn-outline-secondary:not(:disabled):not(.disabled):active:focus,
+.show > .btn-outline-secondary.dropdown-toggle:focus {
+ box-shadow: 0 0 0 0.2rem rgba(89, 92, 118, 0.5);
+}
+.btn-outline-success {
+ color: #366a57;
+ border-color: #32ba89;
+}
+.btn-outline-success:hover {
+ color: #d5d5d5;
+ background-color: #366a57;
+ border-color: #32ba89;
+}
+.btn-outline-success.focus,
+.btn-outline-success:focus {
+ box-shadow: 0 0 0 0.2rem rgba(50, 186, 137, 0.5);
+}
+.btn-outline-success.disabled,
+.btn-outline-success:disabled {
+ color: #637a72;
+ background-color: transparent;
+}
+.btn-outline-success:not(:disabled):not(.disabled).active,
+.btn-outline-success:not(:disabled):not(.disabled):active,
+.show > .btn-outline-success.dropdown-toggle {
+ color: #d5d5d5;
+ background-color: #366a57;
+ border-color: #32ba89;
+}
+.btn-outline-success:not(:disabled):not(.disabled).active:focus,
+.btn-outline-success:not(:disabled):not(.disabled):active:focus,
+.show > .btn-outline-success.dropdown-toggle:focus {
+ box-shadow: 0 0 0 0.2rem rgba(50, 186, 137, 0.5);
+}
+.btn-outline-info {
+ color: #053c64;
+ border-color: #355f7d;
+}
+.btn-outline-info:hover {
+ color: #d5d5d5;
+ background-color: #053c64;
+ border-color: #355f7d;
+}
+.btn-outline-info.focus,
+.btn-outline-info:focus {
+ box-shadow: 0 0 0 0.2rem rgba(53, 95, 125, 0.5);
+}
+.btn-outline-info.disabled,
+.btn-outline-info:disabled {
+ color: #053c64;
+ background-color: transparent;
+}
+.btn-outline-info:not(:disabled):not(.disabled).active,
+.btn-outline-info:not(:disabled):not(.disabled):active,
+.show > .btn-outline-info.dropdown-toggle {
+ color: #d5d5d5;
+ background-color: #355f7d;
+ border-color: #053c64;
+}
+.btn-outline-info:not(:disabled):not(.disabled).active:focus,
+.btn-outline-info:not(:disabled):not(.disabled):active:focus,
+.show > .btn-outline-info.dropdown-toggle:focus {
+ box-shadow: 0 0 0 0.2rem rgba(53, 95, 125, 0.5);
+}
+.btn-outline-warning {
+ color: #8a5026;
+ border-color: #c97539;
+}
+.btn-outline-warning:hover {
+ color: #d5d5d5;
+ background-color: #8a5026;
+ border-color: #c97539;
+}
+.btn-outline-warning.focus,
+.btn-outline-warning:focus {
+ box-shadow: 0 0 0 0.2rem rgba(201, 117, 57, 0.5);
+}
+.btn-outline-warning.disabled,
+.btn-outline-warning:disabled {
+ color: #8a5026;
+ background-color: transparent;
+}
+.btn-outline-warning:not(:disabled):not(.disabled).active,
+.btn-outline-warning:not(:disabled):not(.disabled):active,
+.show > .btn-outline-warning.dropdown-toggle {
+ color: #d5d5d5;
+ background-color: #8a5026;
+ border-color: #c97539;
+}
+.btn-outline-warning:not(:disabled):not(.disabled).active:focus,
+.btn-outline-warning:not(:disabled):not(.disabled):active:focus,
+.show > .btn-outline-warning.dropdown-toggle:focus {
+ box-shadow: 0 0 0 0.2rem rgba(201, 117, 57, 0.5);
+}
+.btn-outline-danger {
+ color: #823a3a;
+ border-color: #b84040;
+}
+.btn-outline-danger:hover {
+ color: #d5d5d5;
+ background-color: #823a3a;
+ border-color: #b84040;
+}
+.btn-outline-danger.focus,
+.btn-outline-danger:focus {
+ box-shadow: 0 0 0 0.2rem rgba(184, 64, 64, 0.5);
+}
+.btn-outline-danger.disabled,
+.btn-outline-danger:disabled {
+ color: #b84040;
+ background-color: transparent;
+}
+.btn-outline-danger:not(:disabled):not(.disabled).active,
+.btn-outline-danger:not(:disabled):not(.disabled):active,
+.show > .btn-outline-danger.dropdown-toggle {
+ color: #d5d5d5;
+ background-color: #823a3a;
+ border-color: #b84040;
+}
+.btn-outline-danger:not(:disabled):not(.disabled).active:focus,
+.btn-outline-danger:not(:disabled):not(.disabled):active:focus,
+.show > .btn-outline-danger.dropdown-toggle:focus {
+ box-shadow: 0 0 0 0.2rem rgba(184, 64, 64, 0.5);
+}
+.btn-outline-light {
+ color: #1f2020;
+ border-color: #1f2020;
+}
+.btn-outline-light:hover {
+ color: #d5d5d5;
+ background-color: #1f2020;
+ border-color: #1f2020;
+}
+.btn-outline-light.focus,
+.btn-outline-light:focus {
+ box-shadow: 0 0 0 0.2rem rgba(42, 44, 63, 0.5);
+}
+.btn-outline-light.disabled,
+.btn-outline-light:disabled {
+ color: #1f2020;
+ background-color: transparent;
+}
+.btn-outline-light:not(:disabled):not(.disabled).active,
+.btn-outline-light:not(:disabled):not(.disabled):active,
+.show > .btn-outline-light.dropdown-toggle {
+ color: #d5d5d5;
+ background-color: #1f2020;
+ border-color: #1f2020;
+}
+.btn-outline-light:not(:disabled):not(.disabled).active:focus,
+.btn-outline-light:not(:disabled):not(.disabled):active:focus,
+.show > .btn-outline-light.dropdown-toggle:focus {
+ box-shadow: 0 0 0 0.2rem rgba(42, 44, 63, 0.5);
+}
+.btn-outline-dark {
+ color: #1a1a1a;
+ border-color: #1a1a1a;
+}
+.btn-outline-dark:hover {
+ color: #d5d5d5;
+ background-color: #1a1a1a;
+ border-color: #1a1a1a;
+}
+.btn-outline-dark.focus,
+.btn-outline-dark:focus {
+ box-shadow: 0 0 0 0.2rem rgba(34, 35, 54, 0.5);
+}
+.btn-outline-dark.disabled,
+.btn-outline-dark:disabled {
+ color: #1a1a1a;
+ background-color: transparent;
+}
+.btn-outline-dark:not(:disabled):not(.disabled).active,
+.btn-outline-dark:not(:disabled):not(.disabled):active,
+.show > .btn-outline-dark.dropdown-toggle {
+ color: #d5d5d5;
+ background-color: #1a1a1a;
+ border-color: #1a1a1a;
+}
+.btn-outline-dark:not(:disabled):not(.disabled).active:focus,
+.btn-outline-dark:not(:disabled):not(.disabled):active:focus,
+.show > .btn-outline-dark.dropdown-toggle:focus {
+ box-shadow: 0 0 0 0.2rem rgba(34, 35, 54, 0.5);
+}
+.btn-link {
+ font-weight: 400;
+ color: #9e9eab;
+ text-decoration: underline;
+}
+.btn-link:hover {
+ color: #9092ae;
+ text-decoration: underline;
+}
+.btn-link.focus,
+.btn-link:focus {
+ text-decoration: underline;
+ box-shadow: none;
+}
+.btn-link.disabled,
+.btn-link:disabled {
+ color: #868e96;
+ pointer-events: none;
+}
+.btn-group-lg > .btn,
+.btn-lg {
+ padding: 0.5rem 1rem;
+ font-size: 1.25rem;
+ line-height: 1.5;
+ border-radius: 2px;
+}
+.btn-group-sm > .btn,
+.btn-sm {
+ font-weight: 700;
+ font-size: 12px;
+ padding: 0.25rem 0.5rem;
+ line-height: 1.5;
+ border-radius: 2px;
+}
+.btn-block {
+ display: block;
+ width: 100%;
+}
+.btn-block + .btn-block {
+ margin-top: 0.5rem;
+}
+input[type="button"].btn-block,
+input[type="reset"].btn-block,
+input[type="submit"].btn-block {
+ width: 100%;
+}
+.fade {
+ transition: opacity 0.15s linear;
+}
+@media (prefers-reduced-motion: reduce) {
+ .fade {
+ transition: none;
+ }
+}
+.fade:not(.show) {
+ opacity: 0;
+}
+.collapse:not(.show) {
+ display: none;
+}
+.collapsing {
+ position: relative;
+ height: 0;
+ overflow: hidden;
+ transition: height 0.35s ease;
+}
+@media (prefers-reduced-motion: reduce) {
+ .collapsing {
+ transition: none;
+ }
+}
+.dropdown,
+.dropleft,
+.dropright,
+.dropup {
+ position: relative;
+}
+.dropdown-toggle {
+ white-space: nowrap;
+}
+.dropdown-toggle::after {
+ display: inline-block;
+ margin-left: 0.255em;
+ vertical-align: 0.255em;
+ content: "";
+ border-top: 0.3em solid;
+ border-right: 0.3em solid transparent;
+ border-bottom: 0;
+ border-left: 0.3em solid transparent;
+}
+.dropdown-toggle:empty::after {
+ margin-left: 0;
+}
+.dropdown-menu {
+ position: absolute;
+ top: 100%;
+ left: 0;
+ z-index: 1000;
+ display: none;
+ float: left;
+ min-width: 10rem;
+ padding: 0.5rem 0;
+ margin: 0.125rem 0 0;
+ font-size: 1rem;
+ color: #d5d5d5;
+ text-align: left;
+ list-style: none;
+ background-color: #d5d5d5;
+ background-clip: padding-box;
+ border: 1px solid rgba(0, 0, 0, 0.15);
+ border-radius: 2px;
+}
+.dropdown-menu-left {
+ right: auto;
+ left: 0;
+}
+.dropdown-menu-right {
+ right: 0;
+ left: auto;
+}
+@media (min-width: 576px) {
+ .dropdown-menu-sm-left {
+ right: auto;
+ left: 0;
+ }
+ .dropdown-menu-sm-right {
+ right: 0;
+ left: auto;
+ }
+}
+@media (min-width: 768px) {
+ .dropdown-menu-md-left {
+ right: auto;
+ left: 0;
+ }
+ .dropdown-menu-md-right {
+ right: 0;
+ left: auto;
+ }
+}
+@media (min-width: 992px) {
+ .dropdown-menu-lg-left {
+ right: auto;
+ left: 0;
+ }
+ .dropdown-menu-lg-right {
+ right: 0;
+ left: auto;
+ }
+}
+@media (min-width: 1200px) {
+ .dropdown-menu-xl-left {
+ right: auto;
+ left: 0;
+ }
+ .dropdown-menu-xl-right {
+ right: 0;
+ left: auto;
+ }
+}
+.dropup .dropdown-menu {
+ top: auto;
+ bottom: 100%;
+ margin-top: 0;
+ margin-bottom: 0.125rem;
+}
+.dropup .dropdown-toggle::after {
+ display: inline-block;
+ margin-left: 0.255em;
+ vertical-align: 0.255em;
+ content: "";
+ border-top: 0;
+ border-right: 0.3em solid transparent;
+ border-bottom: 0.3em solid;
+ border-left: 0.3em solid transparent;
+}
+.dropup .dropdown-toggle:empty::after {
+ margin-left: 0;
+}
+.dropright .dropdown-menu {
+ top: 0;
+ right: auto;
+ left: 100%;
+ margin-top: 0;
+ margin-left: 0.125rem;
+}
+.dropright .dropdown-toggle::after {
+ display: inline-block;
+ margin-left: 0.255em;
+ vertical-align: 0.255em;
+ content: "";
+ border-top: 0.3em solid transparent;
+ border-right: 0;
+ border-bottom: 0.3em solid transparent;
+ border-left: 0.3em solid;
+}
+.dropright .dropdown-toggle:empty::after {
+ margin-left: 0;
+}
+.dropright .dropdown-toggle::after {
+ vertical-align: 0;
+}
+.dropleft .dropdown-menu {
+ top: 0;
+ right: 100%;
+ left: auto;
+ margin-top: 0;
+ margin-right: 0.125rem;
+}
+.dropleft .dropdown-toggle::after {
+ display: inline-block;
+ margin-left: 0.255em;
+ vertical-align: 0.255em;
+ content: "";
+}
+.dropleft .dropdown-toggle::after {
+ display: none;
+}
+.dropleft .dropdown-toggle::before {
+ display: inline-block;
+ margin-right: 0.255em;
+ vertical-align: 0.255em;
+ content: "";
+ border-top: 0.3em solid transparent;
+ border-right: 0.3em solid;
+ border-bottom: 0.3em solid transparent;
+}
+.dropleft .dropdown-toggle:empty::after {
+ margin-left: 0;
+}
+.dropleft .dropdown-toggle::before {
+ vertical-align: 0;
+}
+.dropdown-menu[x-placement^="bottom"],
+.dropdown-menu[x-placement^="left"],
+.dropdown-menu[x-placement^="right"],
+.dropdown-menu[x-placement^="top"] {
+ right: auto;
+ bottom: auto;
+}
+.dropdown-divider {
+ height: 0;
+ margin: 0.5rem 0;
+ overflow: hidden;
+ border-top: 1px solid #e9ecef;
+}
+.dropdown-item {
+ display: block;
+ width: 100%;
+ padding: 0.25rem 1.5rem;
+ clear: both;
+ font-weight: 400;
+ color: #212529;
+ text-align: inherit;
+ white-space: nowrap;
+ background-color: transparent;
+ border: 0;
+}
+.dropdown-item:focus,
+.dropdown-item:hover {
+ color: #16181b;
+ text-decoration: none;
+ background-color: #f8f9fa;
+}
+.dropdown-item.active,
+.dropdown-item:active {
+ color: #d5d5d5;
+ text-decoration: none;
+ background-color: #007aa6;
+}
+.dropdown-item.disabled,
+.dropdown-item:disabled {
+ color: #868e96;
+ pointer-events: none;
+ background-color: transparent;
+}
+.dropdown-menu.show {
+ display: block;
+}
+.dropdown-header {
+ display: block;
+ padding: 0.5rem 1.5rem;
+ margin-bottom: 0;
+ font-size: 0.875rem;
+ color: #868e96;
+ white-space: nowrap;
+}
+.dropdown-item-text {
+ display: block;
+ padding: 0.25rem 1.5rem;
+ color: #212529;
+}
+.btn-group,
+.btn-group-vertical {
+ position: relative;
+ display: inline-flex;
+ vertical-align: middle;
+}
+.btn-group-vertical > .btn,
+.btn-group > .btn {
+ position: relative;
+ flex: 1 1 auto;
+}
+.btn-group-vertical > .btn:hover,
+.btn-group > .btn:hover {
+ z-index: 1;
+}
+.btn-group-vertical > .btn.active,
+.btn-group-vertical > .btn:active,
+.btn-group-vertical > .btn:focus,
+.btn-group > .btn.active,
+.btn-group > .btn:active,
+.btn-group > .btn:focus {
+ z-index: 1;
+}
+.btn-toolbar {
+ display: flex;
+ flex-wrap: wrap;
+ justify-content: flex-start;
+}
+.btn-toolbar .input-group {
+ width: auto;
+}
+.btn-group > .btn-group:not(:first-child),
+.btn-group > .btn:not(:first-child) {
+ margin-left: -1px;
+}
+.btn-group > .btn-group:not(:last-child) > .btn,
+.btn-group > .btn:not(:last-child):not(.dropdown-toggle) {
+ border-top-right-radius: 0;
+ border-bottom-right-radius: 0;
+}
+.btn-group > .btn-group:not(:first-child) > .btn,
+.btn-group > .btn:not(:first-child) {
+ border-top-left-radius: 0;
+ border-bottom-left-radius: 0;
+}
+.dropdown-toggle-split {
+ padding-right: 0.5625rem;
+ padding-left: 0.5625rem;
+}
+.dropdown-toggle-split::after,
+.dropright .dropdown-toggle-split::after,
+.dropup .dropdown-toggle-split::after {
+ margin-left: 0;
+}
+.dropleft .dropdown-toggle-split::before {
+ margin-right: 0;
+}
+.btn-group-sm > .btn + .dropdown-toggle-split,
+.btn-sm + .dropdown-toggle-split {
+ padding-right: 0.375rem;
+ padding-left: 0.375rem;
+}
+.btn-group-lg > .btn + .dropdown-toggle-split,
+.btn-lg + .dropdown-toggle-split {
+ padding-right: 0.75rem;
+ padding-left: 0.75rem;
+}
+.btn-group-vertical {
+ flex-direction: column;
+ align-items: flex-start;
+ justify-content: center;
+}
+.btn-group-vertical > .btn,
+.btn-group-vertical > .btn-group {
+ width: 100%;
+}
+.btn-group-vertical > .btn-group:not(:first-child),
+.btn-group-vertical > .btn:not(:first-child) {
+ margin-top: -1px;
+}
+.btn-group-vertical > .btn-group:not(:last-child) > .btn,
+.btn-group-vertical > .btn:not(:last-child):not(.dropdown-toggle) {
+ border-bottom-right-radius: 0;
+ border-bottom-left-radius: 0;
+}
+.btn-group-vertical > .btn-group:not(:first-child) > .btn,
+.btn-group-vertical > .btn:not(:first-child) {
+ border-top-left-radius: 0;
+ border-top-right-radius: 0;
+}
+.btn-group-toggle > .btn,
+.btn-group-toggle > .btn-group > .btn {
+ margin-bottom: 0;
+}
+.btn-group-toggle > .btn input[type="checkbox"],
+.btn-group-toggle > .btn input[type="radio"],
+.btn-group-toggle > .btn-group > .btn input[type="checkbox"],
+.btn-group-toggle > .btn-group > .btn input[type="radio"] {
+ position: absolute;
+ clip: rect(0, 0, 0, 0);
+ pointer-events: none;
+}
+.input-group {
+ position: relative;
+ display: flex;
+ flex-wrap: wrap;
+ align-items: stretch;
+ width: 100%;
+}
+.input-group > .custom-file,
+.input-group > .custom-select,
+.input-group > .form-control,
+.input-group > .form-control-plaintext {
+ position: relative;
+ flex: 1 1 auto;
+ width: 1%;
+ margin-bottom: 0;
+}
+.input-group > .custom-file + .custom-file,
+.input-group > .custom-file + .custom-select,
+.input-group > .custom-file + .form-control,
+.input-group > .custom-select + .custom-file,
+.input-group > .custom-select + .custom-select,
+.input-group > .custom-select + .form-control,
+.input-group > .form-control + .custom-file,
+.input-group > .form-control + .custom-select,
+.input-group > .form-control + .form-control,
+.input-group > .form-control-plaintext + .custom-file,
+.input-group > .form-control-plaintext + .custom-select,
+.input-group > .form-control-plaintext + .form-control {
+ margin-left: -1px;
+}
+.input-group > .custom-file .custom-file-input:focus ~ .custom-file-label,
+.input-group > .custom-select:focus,
+.input-group > .form-control:focus {
+ z-index: 3;
+}
+.input-group > .custom-file .custom-file-input:focus {
+ z-index: 4;
+}
+.input-group > .custom-select:not(:last-child),
+.input-group > .form-control:not(:last-child) {
+ border-top-right-radius: 0;
+ border-bottom-right-radius: 0;
+}
+.input-group > .custom-select:not(:first-child),
+.input-group > .form-control:not(:first-child) {
+ border-top-left-radius: 0;
+ border-bottom-left-radius: 0;
+}
+.input-group > .custom-file {
+ display: flex;
+ align-items: center;
+}
+.input-group > .custom-file:not(:last-child) .custom-file-label,
+.input-group > .custom-file:not(:last-child) .custom-file-label::after {
+ border-top-right-radius: 0;
+ border-bottom-right-radius: 0;
+}
+.input-group > .custom-file:not(:first-child) .custom-file-label {
+ border-top-left-radius: 0;
+ border-bottom-left-radius: 0;
+}
+.input-group-append,
+.input-group-prepend {
+ display: flex;
+}
+.input-group-append .btn,
+.input-group-prepend .btn {
+ position: relative;
+ z-index: 2;
+}
+.input-group-append .btn:focus,
+.input-group-prepend .btn:focus {
+ z-index: 3;
+}
+.input-group-append .btn + .btn,
+.input-group-append .btn + .input-group-text,
+.input-group-append .input-group-text + .btn,
+.input-group-append .input-group-text + .input-group-text,
+.input-group-prepend .btn + .btn,
+.input-group-prepend .btn + .input-group-text,
+.input-group-prepend .input-group-text + .btn,
+.input-group-prepend .input-group-text + .input-group-text {
+ margin-left: -1px;
+}
+.input-group-prepend {
+ margin-right: -1px;
+}
+.input-group-append {
+ margin-left: -1px;
+}
+.input-group-text {
+ display: flex;
+ align-items: center;
+ padding: 0.5rem 0.75rem;
+ margin-bottom: 0;
+ font-size: 0.875rem;
+ font-weight: 400;
+ line-height: 1.25;
+ color: #aaaaaa;
+ text-align: center;
+ white-space: nowrap;
+ background-color: #66666a;
+ border: 1px solid transparent;
+ border-radius: 2px;
+}
+.input-group-text input[type="checkbox"],
+.input-group-text input[type="radio"] {
+ margin-top: 0;
+}
+.input-group-lg > .custom-select,
+.input-group-lg > .form-control:not(textarea) {
+ height: calc(1.5em + 1rem + 2px);
+}
+.input-group-lg > .custom-select,
+.input-group-lg > .form-control,
+.input-group-lg > .input-group-append > .btn,
+.input-group-lg > .input-group-append > .input-group-text,
+.input-group-lg > .input-group-prepend > .btn,
+.input-group-lg > .input-group-prepend > .input-group-text {
+ padding: 0.5rem 1rem;
+ font-size: 1.25rem;
+ line-height: 1.5;
+ border-radius: 2px;
+}
+.input-group-sm > .custom-select,
+.input-group-sm > .form-control:not(textarea) {
+ height: calc(1.5em + 0.5rem + 2px);
+}
+.input-group-sm > .custom-select,
+.input-group-sm > .form-control,
+.input-group-sm > .input-group-append > .btn,
+.input-group-sm > .input-group-append > .input-group-text,
+.input-group-sm > .input-group-prepend > .btn,
+.input-group-sm > .input-group-prepend > .input-group-text {
+ padding: 0.25rem 0.5rem;
+ font-size: 0.875rem;
+ line-height: 1.5;
+ border-radius: 2px;
+}
+.input-group-lg > .custom-select,
+.input-group-sm > .custom-select {
+ padding-right: 1.75rem;
+}
+.input-group
+ > .input-group-append:last-child
+ > .btn:not(:last-child):not(.dropdown-toggle),
+.input-group
+ > .input-group-append:last-child
+ > .input-group-text:not(:last-child),
+.input-group > .input-group-append:not(:last-child) > .btn,
+.input-group > .input-group-append:not(:last-child) > .input-group-text,
+.input-group > .input-group-prepend > .btn,
+.input-group > .input-group-prepend > .input-group-text {
+ border-top-right-radius: 0;
+ border-bottom-right-radius: 0;
+}
+.input-group > .input-group-append > .btn,
+.input-group > .input-group-append > .input-group-text,
+.input-group > .input-group-prepend:first-child > .btn:not(:first-child),
+.input-group
+ > .input-group-prepend:first-child
+ > .input-group-text:not(:first-child),
+.input-group > .input-group-prepend:not(:first-child) > .btn,
+.input-group > .input-group-prepend:not(:first-child) > .input-group-text {
+ border-top-left-radius: 0;
+ border-bottom-left-radius: 0;
+}
+.input-group-prepend .input-group-text {
+ color: #959BAD !important;
+}
+.custom-control {
+ position: relative;
+ display: block;
+ min-height: 1.5rem;
+ padding-left: 1.5rem;
+}
+.custom-control-inline {
+ display: inline-flex;
+ margin-right: 1rem;
+}
+.custom-control-input {
+ position: absolute;
+ z-index: -1;
+ opacity: 0;
+}
+.custom-control-input:checked ~ .custom-control-label::before {
+ color: #d5d5d5;
+ border-color: #51536b;
+ background-color: #28282D;
+}
+.custom-control-input:focus ~ .custom-control-label::before {
+ box-shadow: 0 0 3px rgba(255, 255, 255, 0.6);
+}
+.custom-control-input:focus:not(:checked) ~ .custom-control-label::before {
+ border-color: #28282D;
+}
+.custom-control-input:not(:disabled):active ~ .custom-control-label::before {
+ color: #d5d5d5;
+ background-color: none;
+ border-color: none;
+}
+.custom-control-input:disabled ~ .custom-control-label {
+ color: #272626;
+}
+.custom-control-input:disabled ~ .custom-control-label::before {
+ background-color: #28282D;
+}
+.custom-control-label {
+ position: relative;
+ margin-bottom: 0;
+ vertical-align: top;
+}
+.custom-control-label::before {
+ position: absolute;
+ top: .15rem;
+ left: -1.5rem;
+ display: block;
+ width: 1rem;
+ height: 1rem;
+ pointer-events: none;
+ content: "";
+ background-color: #28282D;
+ border: #51536b solid 1px;
+}
+.custom-control-label::after {
+ position: absolute;
+ top: .15rem;
+ left: -1.5rem;
+ display: block;
+ width: 1rem;
+ height: 1rem;
+ content: "";
+ background: no-repeat 50%/50% 50%;
+}
+.custom-checkbox .custom-control-label::before {
+ border-radius: 2px;
+}
+.custom-checkbox .custom-control-input:checked ~ .custom-control-label::after {
+ background-image: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 8 8'%3e%3cpath fill='%23d5d5d5' d='M6.564.75l-3.59 3.612-1.538-1.55L0 4.26 2.974 7.25 8 2.193z'/%3e%3c/svg%3e");
+}
+.custom-checkbox
+ .custom-control-input:indeterminate
+ ~ .custom-control-label::before {
+ border-color: #28282D;
+ background-color: #28282D;
+}
+.custom-checkbox
+ .custom-control-input:indeterminate
+ ~ .custom-control-label::after {
+ background-image: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 4 4'%3e%3cpath stroke='%23d5d5d5' d='M0 2h4'/%3e%3c/svg%3e");
+}
+.custom-checkbox
+ .custom-control-input:disabled:checked
+ ~ .custom-control-label::before {
+ background-color: #28282D;
+}
+.custom-checkbox
+ .custom-control-input:disabled:indeterminate
+ ~ .custom-control-label::before {
+ background-color: #28282D;
+}
+.custom-radio .custom-control-label::before {
+ border-radius: 50%;
+}
+.custom-radio .custom-control-input:checked ~ .custom-control-label::after {
+ background-image: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='-4 -4 8 8'%3e%3ccircle r='3' fill='%23d5d5d5'/%3e%3c/svg%3e");
+}
+.custom-radio
+ .custom-control-input:disabled:checked
+ ~ .custom-control-label::before {
+ background-color: #28282D;
+}
+.custom-switch {
+ padding-left: 2.25rem;
+}
+.custom-switch .custom-control-label::before {
+ left: -2.25rem;
+ width: 1.75rem;
+ pointer-events: all;
+ border-radius: 0.5rem;
+}
+.custom-switch .custom-control-label::after {
+ top: calc(0.25rem + 2px);
+ left: calc(-2.25rem + 2px);
+ width: calc(1rem - 4px);
+ height: calc(1rem - 4px);
+ background-color: #51536b;
+ border-radius: 0.5rem;
+ transition: transform 0.15s ease-in-out, background-color 0.15s ease-in-out,
+ border-color 0.15s ease-in-out, box-shadow 0.15s ease-in-out;
+}
+@media (prefers-reduced-motion: reduce) {
+ .custom-switch .custom-control-label::after {
+ transition: none;
+ }
+}
+.custom-switch .custom-control-input:checked ~ .custom-control-label::after {
+ background-color: #28282D;
+ transform: translateX(0.75rem);
+}
+.custom-switch
+ .custom-control-input:disabled:checked
+ ~ .custom-control-label::before {
+ background-color: #28282D;
+}
+.custom-select {
+ display: inline-block;
+ width: 100%;
+ margin-top: 4px;
+ height: calc(1.25em + 1rem + 2px);
+ padding: 0.375rem 1.75rem 0.375rem 0.75rem;
+ font-size: 0.875rem;
+ font-weight: 400;
+ line-height: 1.25;
+ color: #aaaaaa;
+ vertical-align: middle;
+ padding-right: 15px;
+ background-color: #28282D;
+ background-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' fill='none' viewBox='0 0 8 13'%3E%3Cdefs/%3E%3Cpath fill='%238A93B0' fill-rule='evenodd' d='M6.987 8.781a.3.3 0 00-.227-.495H1.24a.3.3 0 00-.227.495l2.76 3.207a.3.3 0 00.454 0l2.76-3.207zM6.987 4.076a.3.3 0 01-.227.495H1.24a.3.3 0 01-.227-.495L3.773.87a.3.3 0 01.454 0l2.76 3.206z' clip-rule='evenodd'/%3E%3C/svg%3E");
+ background-repeat: no-repeat;
+ background-size: 8px;
+ background-position: right 7px center;
+ border: 1px solid transparent !important;
+ border-radius: 2px;
+ -moz-appearance: none;
+ -webkit-appearance: none;
+}
+.custom-select:focus {
+ border-color: #6d7172;
+ outline: 0;
+ box-shadow: inset 0 1px 2px rgba(0, 0, 0, 0.075),
+ 0 0 5px rgba(39, 198, 255, 0.5);
+}
+.custom-select:focus::-ms-value {
+ color: #aaaaaa;
+ background-color: #1a1a1a;
+}
+.custom-select[multiple],
+.custom-select[size]:not([size="1"]) {
+ height: auto;
+ padding-right: 0.75rem;
+ background-image: none;
+}
+.custom-select:disabled {
+ color: #272626;
+ background-color: ##222225;
+}
+.custom-select::-ms-expand {
+ display: none;
+}
+.custom-select-sm {
+ height: calc(1.5em + 0.5rem + 2px);
+ padding-top: 0.25rem;
+ padding-bottom: 0.25rem;
+ padding-left: 0.5rem;
+ font-size: 75%;
+}
+.custom-select-lg {
+ height: calc(1.5em + 1rem + 2px);
+ padding-top: 0.5rem;
+ padding-bottom: 0.5rem;
+ padding-left: 1rem;
+ font-size: 1.25rem;
+}
+.custom-file {
+ position: relative;
+ display: inline-block;
+ width: 100%;
+ height: calc(1.25em + 1rem + 2px);
+ margin-bottom: 0;
+}
+.custom-file-input {
+ position: relative;
+ z-index: 2;
+ width: 100%;
+ height: calc(1.25em + 1rem + 2px);
+ margin: 0;
+ opacity: 0;
+}
+.custom-file-input:focus ~ .custom-file-label {
+ border-color: #6d7172;
+ box-shadow: 0 0 0 0.075rem #d5d5d5, 0 0 0 0.2rem #28282D;
+}
+.custom-file-input:disabled ~ .custom-file-label {
+ background-color: ##222225;
+}
+.custom-file-input:lang(en) ~ .custom-file-label::after {
+ content: "Browse";
+}
+.custom-file-input ~ .custom-file-label[data-browse]::after {
+ content: attr(data-browse);
+}
+.custom-file-label {
+ position: absolute;
+ top: 0;
+ right: 0;
+ left: 0;
+ z-index: 1;
+ height: calc(1.25em + 1rem + 2px);
+ padding: 0.5rem 0.75rem;
+ font-weight: 400;
+ line-height: 1.25;
+ color: #aaaaaa;
+ background-color: #1a1a1a;
+ border: 1px solid transparent;
+ border-radius: 2px;
+}
+.custom-file-label::after {
+ position: absolute;
+ top: 0;
+ right: 0;
+ bottom: 0;
+ z-index: 3;
+ display: block;
+ height: calc(1.25em + 1rem);
+ padding: 0.5rem 0.75rem;
+ line-height: 1.25;
+ color: #aaaaaa;
+ content: "Browse";
+ background-color: #28282D;
+ border-left: inherit;
+ border-radius: 0 2px 2px 0;
+}
+.custom-range {
+ width: 100%;
+ height: calc(1rem + 0.4rem);
+ padding: 0;
+ background-color: transparent;
+ appearance: none;
+}
+.custom-range:focus {
+ outline: 0;
+}
+.custom-range:focus::-webkit-slider-thumb {
+ box-shadow: 0 0 0 1px #1a1a1a, inset 0 1px 1px rgba(0, 0, 0, 0.075),
+ 0 0 0 3px rgba(0, 122, 166, 0.25);
+}
+.custom-range:focus::-moz-range-thumb {
+ box-shadow: 0 0 0 1px #1a1a1a, inset 0 1px 1px rgba(0, 0, 0, 0.075),
+ 0 0 0 3px rgba(0, 122, 166, 0.25);
+}
+.custom-range:focus::-ms-thumb {
+ box-shadow: 0 0 0 1px #1a1a1a, inset 0 1px 1px rgba(0, 0, 0, 0.075),
+ 0 0 0 3px rgba(0, 122, 166, 0.25);
+}
+.custom-range::-moz-focus-outer {
+ border: 0;
+}
+.custom-range::-webkit-slider-thumb {
+ width: 1rem;
+ height: 1rem;
+ margin-top: -0.25rem;
+ background-color: #28282D;
+ border: 0;
+ border-radius: 1rem;
+ transition: background-color 0.15s ease-in-out, border-color 0.15s ease-in-out,
+ box-shadow 0.15s ease-in-out;
+ appearance: none;
+}
+@media (prefers-reduced-motion: reduce) {
+ .custom-range::-webkit-slider-thumb {
+ transition: none;
+ }
+}
+.custom-range::-webkit-slider-thumb:active {
+ background-color: #5ad3ff;
+}
+.custom-range::-webkit-slider-runnable-track {
+ width: 100%;
+ height: 0.5rem;
+ color: transparent;
+ cursor: pointer;
+ background-color: #dee2e6;
+ border-color: transparent;
+ border-radius: 1rem;
+}
+.custom-range::-moz-range-thumb {
+ width: 1rem;
+ height: 1rem;
+ background-color: #28282D;
+ border: 0;
+ border-radius: 1rem;
+ transition: background-color 0.15s ease-in-out, border-color 0.15s ease-in-out,
+ box-shadow 0.15s ease-in-out;
+ appearance: none;
+}
+@media (prefers-reduced-motion: reduce) {
+ .custom-range::-moz-range-thumb {
+ transition: none;
+ }
+}
+.custom-range::-moz-range-thumb:active {
+ background-color: #5ad3ff;
+}
+.custom-range::-moz-range-track {
+ width: 100%;
+ height: 0.5rem;
+ color: transparent;
+ cursor: pointer;
+ background-color: #dee2e6;
+ border-color: transparent;
+ border-radius: 1rem;
+}
+.custom-range::-ms-thumb {
+ width: 1rem;
+ height: 1rem;
+ margin-top: 0;
+ margin-right: 0.2rem;
+ margin-left: 0.2rem;
+ background-color: #28282D;
+ border: 0;
+ border-radius: 1rem;
+ transition: background-color 0.15s ease-in-out, border-color 0.15s ease-in-out,
+ box-shadow 0.15s ease-in-out;
+ appearance: none;
+}
+@media (prefers-reduced-motion: reduce) {
+ .custom-range::-ms-thumb {
+ transition: none;
+ }
+}
+.custom-range::-ms-thumb:active {
+ background-color: #5ad3ff;
+}
+.custom-range::-ms-track {
+ width: 100%;
+ height: 0.5rem;
+ color: transparent;
+ cursor: pointer;
+ background-color: transparent;
+ border-color: transparent;
+ border-width: 0.5rem;
+}
+.custom-range::-ms-fill-lower {
+ background-color: #dee2e6;
+ border-radius: 1rem;
+}
+.custom-range::-ms-fill-upper {
+ margin-right: 15px;
+ background-color: #dee2e6;
+ border-radius: 1rem;
+}
+.custom-range:disabled::-webkit-slider-thumb {
+ background-color: #adb5bd;
+}
+.custom-range:disabled::-webkit-slider-runnable-track {
+ cursor: default;
+}
+.custom-range:disabled::-moz-range-thumb {
+ background-color: #adb5bd;
+}
+.custom-range:disabled::-moz-range-track {
+ cursor: default;
+}
+.custom-range:disabled::-ms-thumb {
+ background-color: #adb5bd;
+}
+.custom-control-label::before,
+.custom-file-label,
+.custom-select {
+ transition: background-color 0.15s ease-in-out, border-color 0.15s ease-in-out,
+ box-shadow 0.15s ease-in-out;
+}
+@media (prefers-reduced-motion: reduce) {
+ .custom-control-label::before,
+ .custom-file-label,
+ .custom-select {
+ transition: none;
+ }
+}
+.nav {
+ display: flex;
+ flex-wrap: wrap;
+ padding-left: 0;
+ margin-bottom: 0;
+ list-style: none;
+}
+.nav-link {
+ display: block;
+ padding: 0.5rem 1rem;
+}
+.nav-link:focus,
+.nav-link:hover {
+ text-decoration: none;
+}
+.nav-link.disabled {
+ color: #868e96;
+ pointer-events: none;
+ cursor: default;
+}
+.nav-tabs {
+ border-bottom: 1px solid #37373B;
+}
+.nav-tabs .nav-item {
+ margin-bottom: -1px;
+}
+.nav-tabs .nav-link {
+ border: 1px solid transparent;
+ border-top-left-radius: 2px;
+ border-top-right-radius: 2px;
+}
+.nav-tabs .nav-link:focus,
+.nav-tabs .nav-link:hover {
+ border-color: #37373B;
+}
+.nav-tabs .nav-link.disabled {
+ color: #868e96;
+ background-color: transparent;
+ border-color: transparent;
+}
+.nav-tabs .nav-item.show .nav-link,
+.nav-tabs .nav-link.active {
+ color: #d5d5d5;
+ background-color: #252525;
+ border-color: #37373B;
+ font-weight: bolder;
+}
+.nav-tabs .dropdown-menu {
+ margin-top: -1px;
+ border-top-left-radius: 0;
+ border-top-right-radius: 0;
+}
+.nav-pills .nav-link {
+ border-radius: 2px;
+}
+.nav-pills .nav-link.active,
+.nav-pills .show > .nav-link {
+ color: #d5d5d5;
+ background-color: #28282D;
+}
+.nav-fill .nav-item {
+ flex: 1 1 auto;
+ text-align: center;
+}
+.nav-justified .nav-item {
+ flex-basis: 0;
+ flex-grow: 1;
+ text-align: center;
+}
+.tab-content > .tab-pane {
+ display: none;
+}
+.tab-content > .active {
+ display: block;
+}
+.navbar {
+ position: relative;
+ display: flex;
+ flex-wrap: wrap;
+ align-items: center;
+ justify-content: space-between;
+ padding: 0.5rem 1rem;
+}
+.navbar > .container,
+.navbar > .container-fluid {
+ display: flex;
+ flex-wrap: wrap;
+ align-items: center;
+ justify-content: space-between;
+}
+.navbar-brand {
+ display: inline-block;
+ padding-top: 0.3125rem;
+ padding-bottom: 0.3125rem;
+ margin-right: 1rem;
+ font-size: 1.25rem;
+ line-height: inherit;
+ white-space: nowrap;
+}
+.navbar-brand:focus,
+.navbar-brand:hover {
+ text-decoration: none;
+}
+.navbar-nav {
+ display: flex;
+ flex-direction: column;
+ padding-left: 0;
+ margin-bottom: 0;
+ list-style: none;
+}
+.navbar-nav .nav-link {
+ padding-right: 0;
+ padding-left: 0;
+}
+.navbar-nav .dropdown-menu {
+ position: static;
+ float: none;
+}
+.navbar-text {
+ display: inline-block;
+ padding-top: 0.5rem;
+ padding-bottom: 0.5rem;
+}
+.navbar-collapse {
+ flex-basis: 100%;
+ flex-grow: 1;
+ align-items: center;
+}
+.navbar-toggler {
+ padding: 0.25rem 0.75rem;
+ font-size: 1.25rem;
+ line-height: 1;
+ background-color: transparent;
+ border: 1px solid transparent;
+ border-radius: 2px;
+}
+.navbar-toggler:focus,
+.navbar-toggler:hover {
+ text-decoration: none;
+}
+.navbar-toggler-icon {
+ display: inline-block;
+ width: 1.5em;
+ height: 1.5em;
+ vertical-align: middle;
+ content: "";
+ background: no-repeat center center;
+ background-size: 100% 100%;
+}
+@media (max-width: 575.98px) {
+ .navbar-expand-sm > .container,
+ .navbar-expand-sm > .container-fluid {
+ padding-right: 0;
+ padding-left: 0;
+ }
+}
+@media (min-width: 576px) {
+ .navbar-expand-sm {
+ flex-flow: row nowrap;
+ justify-content: flex-start;
+ }
+ .navbar-expand-sm .navbar-nav {
+ flex-direction: row;
+ }
+ .navbar-expand-sm .navbar-nav .dropdown-menu {
+ position: absolute;
+ }
+ .navbar-expand-sm .navbar-nav .nav-link {
+ padding-right: 0.5rem;
+ padding-left: 0.5rem;
+ }
+ .navbar-expand-sm > .container,
+ .navbar-expand-sm > .container-fluid {
+ flex-wrap: nowrap;
+ }
+ .navbar-expand-sm .navbar-collapse {
+ display: flex !important;
+ flex-basis: auto;
+ }
+ .navbar-expand-sm .navbar-toggler {
+ display: none;
+ }
+}
+@media (max-width: 767.98px) {
+ .navbar-expand-md > .container,
+ .navbar-expand-md > .container-fluid {
+ padding-right: 0;
+ padding-left: 0;
+ }
+}
+@media (min-width: 768px) {
+ .navbar-expand-md {
+ flex-flow: row nowrap;
+ justify-content: flex-start;
+ }
+ .navbar-expand-md .navbar-nav {
+ flex-direction: row;
+ }
+ .navbar-expand-md .navbar-nav .dropdown-menu {
+ position: absolute;
+ }
+ .navbar-expand-md .navbar-nav .nav-link {
+ padding-right: 0.5rem;
+ padding-left: 0.5rem;
+ }
+ .navbar-expand-md > .container,
+ .navbar-expand-md > .container-fluid {
+ flex-wrap: nowrap;
+ }
+ .navbar-expand-md .navbar-collapse {
+ display: flex !important;
+ flex-basis: auto;
+ }
+ .navbar-expand-md .navbar-toggler {
+ display: none;
+ }
+}
+@media (max-width: 991.98px) {
+ .navbar-expand-lg > .container,
+ .navbar-expand-lg > .container-fluid {
+ padding-right: 0;
+ padding-left: 0;
+ }
+}
+@media (min-width: 992px) {
+ .navbar-expand-lg {
+ flex-flow: row nowrap;
+ justify-content: flex-start;
+ }
+ .navbar-expand-lg .navbar-nav {
+ flex-direction: row;
+ }
+ .navbar-expand-lg .navbar-nav .dropdown-menu {
+ position: absolute;
+ }
+ .navbar-expand-lg .navbar-nav .nav-link {
+ padding-right: 0.5rem;
+ padding-left: 0.5rem;
+ }
+ .navbar-expand-lg > .container,
+ .navbar-expand-lg > .container-fluid {
+ flex-wrap: nowrap;
+ }
+ .navbar-expand-lg .navbar-collapse {
+ display: flex !important;
+ flex-basis: auto;
+ }
+ .navbar-expand-lg .navbar-toggler {
+ display: none;
+ }
+}
+@media (max-width: 1199.98px) {
+ .navbar-expand-xl > .container,
+ .navbar-expand-xl > .container-fluid {
+ padding-right: 0;
+ padding-left: 0;
+ }
+}
+@media (min-width: 1200px) {
+ .navbar-expand-xl {
+ flex-flow: row nowrap;
+ justify-content: flex-start;
+ }
+ .navbar-expand-xl .navbar-nav {
+ flex-direction: row;
+ }
+ .navbar-expand-xl .navbar-nav .dropdown-menu {
+ position: absolute;
+ }
+ .navbar-expand-xl .navbar-nav .nav-link {
+ padding-right: 0.5rem;
+ padding-left: 0.5rem;
+ }
+ .navbar-expand-xl > .container,
+ .navbar-expand-xl > .container-fluid {
+ flex-wrap: nowrap;
+ }
+ .navbar-expand-xl .navbar-collapse {
+ display: flex !important;
+ flex-basis: auto;
+ }
+ .navbar-expand-xl .navbar-toggler {
+ display: none;
+ }
+}
+.navbar-expand {
+ flex-flow: row nowrap;
+ justify-content: flex-start;
+}
+.navbar-expand > .container,
+.navbar-expand > .container-fluid {
+ padding-right: 0;
+ padding-left: 0;
+}
+.navbar-expand .navbar-nav {
+ flex-direction: row;
+}
+.navbar-expand .navbar-nav .dropdown-menu {
+ position: absolute;
+}
+.navbar-expand .navbar-nav .nav-link {
+ padding-right: 0.5rem;
+ padding-left: 0.5rem;
+}
+.navbar-expand > .container,
+.navbar-expand > .container-fluid {
+ flex-wrap: nowrap;
+}
+.navbar-expand .navbar-collapse {
+ display: flex !important;
+ flex-basis: auto;
+}
+.navbar-expand .navbar-toggler {
+ display: none;
+}
+.navbar-light .navbar-brand {
+ color: #d5d5d5;
+}
+.navbar-light .navbar-brand:focus,
+.navbar-light .navbar-brand:hover {
+ color: #d5d5d5;
+}
+.navbar-light .navbar-nav .nav-link {
+ color: rgba(255, 255, 255, 0.7);
+}
+.navbar-light .navbar-nav .nav-link:focus,
+.navbar-light .navbar-nav .nav-link:hover {
+ color: rgba(255, 255, 255, 0.5);
+}
+.navbar-light .navbar-nav .nav-link.disabled {
+ color: rgba(255, 255, 255, 0.3);
+}
+.navbar-light .navbar-nav .active > .nav-link,
+.navbar-light .navbar-nav .nav-link.active,
+.navbar-light .navbar-nav .nav-link.show,
+.navbar-light .navbar-nav .show > .nav-link {
+ color: #d5d5d5;
+}
+.navbar-light .navbar-toggler {
+ color: rgba(255, 255, 255, 0.7);
+ border-color: rgba(0, 0, 0, 0.1);
+}
+.navbar-light .navbar-toggler-icon {
+ background-image: url("data:image/svg+xml,%3csvg viewBox='0 0 30 30' xmlns='http://www.w3.org/2000/svg'%3e%3cpath stroke='rgba(255, 255, 255, 0.7)' stroke-width='2' stroke-linecap='round' stroke-miterlimit='10' d='M4 7h22M4 15h22M4 23h22'/%3e%3c/svg%3e");
+}
+.navbar-light .navbar-text {
+ color: rgba(255, 255, 255, 0.7);
+}
+.navbar-light .navbar-text a {
+ color: #d5d5d5;
+}
+.navbar-light .navbar-text a:focus,
+.navbar-light .navbar-text a:hover {
+ color: #d5d5d5;
+}
+.navbar-dark .navbar-brand {
+ color: #d5d5d5;
+}
+.navbar-dark .navbar-brand:focus,
+.navbar-dark .navbar-brand:hover {
+ color: #d5d5d5;
+}
+.navbar-dark .navbar-nav .nav-link {
+ color: #d5d5d5;
+}
+.navbar-dark .navbar-nav .nav-link:focus,
+.navbar-dark .navbar-nav .nav-link:hover {
+ color: rgba(255, 255, 255, 0.75);
+}
+.navbar-dark .navbar-nav .nav-link.disabled {
+ color: rgba(255, 255, 255, 0.25);
+}
+.navbar-dark .navbar-nav .active > .nav-link,
+.navbar-dark .navbar-nav .nav-link.active,
+.navbar-dark .navbar-nav .nav-link.show,
+.navbar-dark .navbar-nav .show > .nav-link {
+ color: #d5d5d5;
+}
+.navbar-dark .navbar-toggler {
+ color: #d5d5d5;
+ border-color: rgba(255, 255, 255, 0.1);
+}
+.navbar-dark .navbar-toggler-icon {
+ background-image: url("data:image/svg+xml,%3csvg viewBox='0 0 30 30' xmlns='http://www.w3.org/2000/svg'%3e%3cpath stroke='%23d5d5d5' stroke-width='2' stroke-linecap='round' stroke-miterlimit='10' d='M4 7h22M4 15h22M4 23h22'/%3e%3c/svg%3e");
+}
+.navbar-dark .navbar-text {
+ color: #d5d5d5;
+}
+.navbar-dark .navbar-text a {
+ color: #d5d5d5;
+}
+.navbar-dark .navbar-text a:focus,
+.navbar-dark .navbar-text a:hover {
+ color: #d5d5d5;
+}
+.card {
+ position: relative;
+ display: flex;
+ flex-direction: column;
+ min-width: 0;
+ word-wrap: break-word;
+ background-color: #1F2020;
+ border: 1px solid #000000;
+ border-radius: 2px;
+}
+.card > hr {
+ margin-right: 0;
+ margin-left: 0;
+}
+.card > .list-group:first-child .list-group-item:first-child {
+ border-top-left-radius: 2px;
+ border-top-right-radius: 2px;
+}
+.card > .list-group:last-child .list-group-item:last-child {
+ border-bottom-right-radius: 2px;
+ border-bottom-left-radius: 2px;
+}
+.card-body {
+ flex: 1 1 auto;
+ padding: 1.25rem;
+}
+.card-title {
+ color: #aaaaaa;
+ margin-bottom: 0.5rem;
+}
+.card-subtitle {
+ margin-top: -0.375rem;
+ margin-bottom: 0;
+}
+.card-text:last-child {
+ margin-bottom: 0;
+}
+.card-link:hover {
+ text-decoration: none;
+}
+.card-link + .card-link {
+ margin-left: 1.25rem;
+}
+.card-header {
+ padding: 0.75rem 1.25rem;
+ margin-bottom: 0;
+ background-color: rgba(0, 0, 0, 0.03);
+ border-bottom: 1px solid rgba(0, 0, 0, 0.125);
+}
+.card-header:first-child {
+ border-radius: calc(2px - 1px) calc(2px - 1px) 0 0;
+}
+.card-header + .list-group .list-group-item:first-child {
+ border-top: 0;
+}
+.card-footer {
+ padding: 0.75rem 1.25rem;
+ background-color: rgba(0, 0, 0, 0.03);
+ border-top: 1px solid rgba(0, 0, 0, 0.125);
+}
+.card-footer:last-child {
+ border-radius: 0 0 calc(2px - 1px) calc(2px - 1px);
+}
+.card-header-tabs {
+ margin-right: -0.625rem;
+ margin-bottom: -0.75rem;
+ margin-left: -0.625rem;
+ border-bottom: 0;
+}
+.card-header-pills {
+ margin-right: -0.625rem;
+ margin-left: -0.625rem;
+}
+.card-img-overlay {
+ position: absolute;
+ top: 0;
+ right: 0;
+ bottom: 0;
+ left: 0;
+ padding: 1.25rem;
+}
+.card-img {
+ width: 100%;
+ border-radius: calc(2px - 1px);
+}
+.card-img-top {
+ width: 100%;
+ border-top-left-radius: calc(2px - 1px);
+ border-top-right-radius: calc(2px - 1px);
+}
+.card-img-bottom {
+ width: 100%;
+ border-bottom-right-radius: calc(2px - 1px);
+ border-bottom-left-radius: calc(2px - 1px);
+}
+.card-deck {
+ display: flex;
+ flex-direction: column;
+}
+.card-deck .card {
+ margin-bottom: 15px;
+}
+@media (min-width: 576px) {
+ .card-deck {
+ flex-flow: row wrap;
+ margin-right: -15px;
+ margin-left: -15px;
+ }
+ .card-deck .card {
+ display: flex;
+ flex: 1 0 0%;
+ flex-direction: column;
+ margin-right: 15px;
+ margin-bottom: 0;
+ margin-left: 15px;
+ }
+}
+.card-group {
+ display: flex;
+ flex-direction: column;
+}
+.card-group > .card {
+ margin-bottom: 15px;
+}
+@media (min-width: 576px) {
+ .card-group {
+ flex-flow: row wrap;
+ }
+ .card-group > .card {
+ flex: 1 0 0%;
+ margin-bottom: 0;
+ }
+ .card-group > .card + .card {
+ margin-left: 0;
+ border-left: 0;
+ }
+ .card-group > .card:not(:last-child) {
+ border-top-right-radius: 0;
+ border-bottom-right-radius: 0;
+ }
+ .card-group > .card:not(:last-child) .card-header,
+ .card-group > .card:not(:last-child) .card-img-top {
+ border-top-right-radius: 0;
+ }
+ .card-group > .card:not(:last-child) .card-footer,
+ .card-group > .card:not(:last-child) .card-img-bottom {
+ border-bottom-right-radius: 0;
+ }
+ .card-group > .card:not(:first-child) {
+ border-top-left-radius: 0;
+ border-bottom-left-radius: 0;
+ }
+ .card-group > .card:not(:first-child) .card-header,
+ .card-group > .card:not(:first-child) .card-img-top {
+ border-top-left-radius: 0;
+ }
+ .card-group > .card:not(:first-child) .card-footer,
+ .card-group > .card:not(:first-child) .card-img-bottom {
+ border-bottom-left-radius: 0;
+ }
+}
+.card-columns .card {
+ margin-bottom: 0.75rem;
+}
+@media (min-width: 576px) {
+ .card-columns {
+ column-count: 3;
+ column-gap: 1.25rem;
+ orphans: 1;
+ widows: 1;
+ }
+ .card-columns .card {
+ display: inline-block;
+ width: 100%;
+ }
+}
+.accordion > .card {
+ overflow: hidden;
+}
+.accordion > .card:not(:first-of-type) .card-header:first-child {
+ border-radius: 0;
+}
+.accordion > .card:not(:first-of-type):not(:last-of-type) {
+ border-bottom: 0;
+ border-radius: 0;
+}
+.accordion > .card:first-of-type {
+ border-bottom: 0;
+ border-bottom-right-radius: 0;
+ border-bottom-left-radius: 0;
+}
+.accordion > .card:last-of-type {
+ border-top-left-radius: 0;
+ border-top-right-radius: 0;
+}
+.accordion > .card .card-header {
+ margin-bottom: -1px;
+}
+.breadcrumb {
+ display: flex;
+ flex-wrap: wrap;
+ padding: 0.75rem 1rem;
+ margin-bottom: 1rem;
+ list-style: none;
+ background-color: #2e3445;
+ border-radius: 2px;
+}
+.breadcrumb-item + .breadcrumb-item {
+ padding-left: 0.5rem;
+}
+.breadcrumb-item + .breadcrumb-item::before {
+ display: inline-block;
+ padding-right: 0.5rem;
+ color: #868e96;
+ content: "/";
+}
+.breadcrumb-item + .breadcrumb-item:hover::before {
+ text-decoration: underline;
+}
+.breadcrumb-item + .breadcrumb-item:hover::before {
+ text-decoration: none;
+}
+.breadcrumb-item.active {
+ color: #d5d5d5;
+}
+.pagination {
+ display: flex;
+ padding-left: 0;
+ list-style: none;
+ border-radius: 2px;
+}
+.page-link {
+ position: relative;
+ display: block;
+ padding: 0.5rem 0.75rem;
+ margin-left: 0;
+ line-height: 1.25;
+ color: #d5d5d5;
+ background-color: #66666a;
+ border: 0 solid #ddd;
+}
+.page-link:hover {
+ z-index: 2;
+ color: #d5d5d5;
+ text-decoration: none;
+ background-color: #676a83;
+ border-color: #ddd;
+}
+.page-link:focus {
+ z-index: 2;
+ outline: 0;
+ box-shadow: 0 0 0 0.2rem rgba(0, 122, 166, 0.25);
+}
+.page-item:first-child .page-link {
+ margin-left: 0;
+ border-top-left-radius: 2px;
+ border-bottom-left-radius: 2px;
+}
+.page-item:last-child .page-link {
+ border-top-right-radius: 2px;
+ border-bottom-right-radius: 2px;
+}
+.page-item.active .page-link {
+ z-index: 1;
+ color: #d5d5d5;
+ background-color: #28282D;
+ border-color: #28282D;
+}
+.page-item.disabled .page-link {
+ color: #989ca4;
+ pointer-events: none;
+ cursor: auto;
+ background-color: #323949;
+ border-color: #ddd;
+}
+.pagination-lg .page-link {
+ padding: 0.75rem 1.5rem;
+ font-size: 1.25rem;
+ line-height: 1.5;
+}
+.pagination-lg .page-item:first-child .page-link {
+ border-top-left-radius: 2px;
+ border-bottom-left-radius: 2px;
+}
+.pagination-lg .page-item:last-child .page-link {
+ border-top-right-radius: 2px;
+ border-bottom-right-radius: 2px;
+}
+.pagination-sm .page-link {
+ padding: 0.25rem 0.5rem;
+ font-size: 0.875rem;
+ line-height: 1.5;
+}
+.pagination-sm .page-item:first-child .page-link {
+ border-top-left-radius: 2px;
+ border-bottom-left-radius: 2px;
+}
+.pagination-sm .page-item:last-child .page-link {
+ border-top-right-radius: 2px;
+ border-bottom-right-radius: 2px;
+}
+.badge {
+ display: inline-block;
+ padding: 0.25em 0.4em;
+ font-size: 75%;
+ font-weight: 700;
+ line-height: 1;
+ text-align: center;
+ white-space: nowrap;
+ vertical-align: baseline;
+ border-radius: 2px;
+ transition: all 0.15s ease-in-out;
+}
+@media (prefers-reduced-motion: reduce) {
+ .badge {
+ transition: none;
+ }
+}
+a.badge:focus,
+a.badge:hover {
+ text-decoration: none;
+}
+.badge:empty {
+ display: none;
+}
+.btn .badge {
+ position: relative;
+ top: -1px;
+}
+.badge-pill {
+ padding-right: 0.6em;
+ padding-left: 0.6em;
+ border-radius: 10rem;
+}
+.badge-primary {
+ color: #d5d5d5;
+ background-color: #28282D;
+}
+a.badge-primary:focus,
+a.badge-primary:hover {
+ color: #d5d5d5;
+ background-color: #005573;
+}
+a.badge-primary.focus,
+a.badge-primary:focus {
+ outline: 0;
+ box-shadow: 0 0 0 0.2rem rgba(0, 122, 166, 0.5);
+}
+.badge-secondary {
+ color: #d5d5d5;
+ background-color: #66666a;
+}
+a.badge-secondary:focus,
+a.badge-secondary:hover {
+ color: #d5d5d5;
+ background-color: #434559;
+}
+a.badge-secondary.focus,
+a.badge-secondary:focus {
+ outline: 0;
+ box-shadow: 0 0 0 0.2rem rgba(89, 92, 118, 0.5);
+}
+.badge-success {
+ color: #d5d5d5;
+ background-color: #366a57;
+}
+a.badge-success:focus,
+a.badge-success:hover {
+ color: #d5d5d5;
+ background-color: #27926b;
+}
+a.badge-success.focus,
+a.badge-success:focus {
+ outline: 0;
+ box-shadow: 0 0 0 0.2rem rgba(50, 186, 137, 0.5);
+}
+.badge-info {
+ color: #d5d5d5;
+ background-color: #053c64;
+}
+a.badge-info:focus,
+a.badge-info:hover {
+ color: #d5d5d5;
+ background-color: #264459;
+}
+a.badge-info.focus,
+a.badge-info:focus {
+ outline: 0;
+ box-shadow: 0 0 0 0.2rem rgba(53, 95, 125, 0.5);
+}
+.badge-warning {
+ color: #010101;
+ background-color: #df9b5c;
+}
+a.badge-warning:focus,
+a.badge-warning:hover {
+ color: #d5d5d5;
+ background-color: #a35e2c;
+}
+a.badge-warning.focus,
+a.badge-warning:focus {
+ outline: 0;
+ box-shadow: 0 0 0 0.2rem rgba(201, 117, 57, 0.5);
+}
+.badge-danger {
+ color: #d5d5d5;
+ background-color: #EA3636;
+}
+a.badge-danger:focus,
+a.badge-danger:hover {
+ color: #d5d5d5;
+ background-color: #923333;
+}
+a.badge-danger.focus,
+a.badge-danger:focus {
+ outline: 0;
+ box-shadow: 0 0 0 0.2rem rgba(184, 64, 64, 0.5);
+}
+.badge-light {
+ color: #d5d5d5;
+ background-color: #1f2020;
+}
+a.badge-light:focus,
+a.badge-light:hover {
+ color: #d5d5d5;
+ background-color: #161720;
+}
+a.badge-light.focus,
+a.badge-light:focus {
+ outline: 0;
+ box-shadow: 0 0 0 0.2rem rgba(42, 44, 63, 0.5);
+}
+.badge-dark {
+ color: #d5d5d5;
+ background-color: #1a1a1a;
+}
+a.badge-dark:focus,
+a.badge-dark:hover {
+ color: #d5d5d5;
+ background-color: #0e0f17;
+}
+a.badge-dark.focus,
+a.badge-dark:focus {
+ outline: 0;
+ box-shadow: 0 0 0 0.2rem rgba(34, 35, 54, 0.5);
+}
+.jumbotron {
+ padding: 2rem 1rem;
+ margin-bottom: 2rem;
+ background-color: #28282D;
+ border-radius: 2px;
+}
+@media (min-width: 576px) {
+ .jumbotron {
+ padding: 4rem 2rem;
+ }
+}
+.jumbotron-fluid {
+ padding-right: 0;
+ padding-left: 0;
+ border-radius: 0;
+}
+.alert {
+ position: relative;
+ padding: 0.75rem 1.25rem;
+ margin-bottom: 1rem;
+ border: 1px solid transparent;
+ border-radius: 2px;
+}
+.alert-heading {
+ color: inherit;
+}
+.alert-link {
+ font-weight: 700;
+}
+.alert-dismissible {
+ padding-right: 4rem;
+}
+.alert-dismissible .close {
+ position: absolute;
+ top: 0;
+ right: 0;
+ padding: 0.75rem 1.25rem;
+ color: inherit;
+}
+.alert-primary {
+ color: #5CBDEE;
+ background-color: #163545;
+ border-color: #5CBDEE;
+}
+.alert-primary hr {
+ border-top-color: #a5d0df;
+}
+.alert-primary .alert-link {
+ color: #001a23;
+}
+.alert-secondary {
+ color: #8aa6bf;
+ background-color: #293033;
+ border-color: #1f2020;
+}
+.alert-secondary hr {
+ border-top-color: #c3c3cd;
+}
+.alert-secondary .alert-link {
+ color: #181920;
+}
+.alert-success {
+ color: #A2FFB0;
+ background: #1d322e;
+ border: 1px solid #2b5f4b;
+}
+.alert-success hr {
+ border-top-color: #b3e6d3;
+}
+.alert-success .alert-link {
+ color: #0f392a;
+}
+.alert-info {
+ color: #88E2FF;
+ background: #1e2b40;
+ border: 1px solid #2b476b;
+}
+.alert-info hr {
+ border-top-color: #b6c6d1;
+}
+.alert-info .alert-link {
+ color: #0d161d;
+}
+.alert-warning {
+ color: #FFB684;
+ background: #2a2022;
+ border: 1px solid #5e4037;
+}
+.alert-warning hr {
+ border-top-color: #ebcab4;
+}
+.alert-warning .alert-link {
+ color: #412613;
+}
+.alert-danger {
+ color: #FF8A8A;
+ background: #2c1c26;
+ border: 1px solid #572c38;
+}
+.alert-danger hr {
+ border-top-color: #e4b7b7;
+}
+.alert-danger .alert-link {
+ color: #3a1414;
+}
+.alert-light {
+ color: #161721;
+ background-color: #d4d5d9;
+ border-color: #c3c4c9;
+}
+.alert-light hr {
+ border-top-color: #b6b7bd;
+}
+.alert-light .alert-link {
+ color: #020202;
+}
+.alert-dark {
+ color: #12121c;
+ background-color: #d3d3d7;
+ border-color: #c1c1c7;
+}
+.alert-dark hr {
+ border-top-color: #b4b4bb;
+}
+.alert-dark .alert-link {
+ color: #000;
+}
+@keyframes progress-bar-stripes {
+ from {
+ background-position: 1rem 0;
+ }
+ to {
+ background-position: 0 0;
+ }
+}
+.progress {
+ display: flex;
+ height: 1rem;
+ overflow: hidden;
+ font-size: 0.75rem;
+ background-color: #e9ecef;
+ border-radius: 2px;
+}
+.progress-bar {
+ display: flex;
+ flex-direction: column;
+ justify-content: center;
+ color: #d5d5d5;
+ text-align: center;
+ white-space: nowrap;
+ background-color: #28282D;
+ transition: width 0.6s ease;
+}
+@media (prefers-reduced-motion: reduce) {
+ .progress-bar {
+ transition: none;
+ }
+}
+.progress-bar-striped {
+ background-image: linear-gradient(
+ 45deg,
+ rgba(255, 255, 255, 0.15) 25%,
+ transparent 25%,
+ transparent 50%,
+ rgba(255, 255, 255, 0.15) 50%,
+ rgba(255, 255, 255, 0.15) 75%,
+ transparent 75%,
+ transparent
+ );
+ background-size: 1rem 1rem;
+}
+.progress-bar-animated {
+ animation: progress-bar-stripes 1s linear infinite;
+}
+@media (prefers-reduced-motion: reduce) {
+ .progress-bar-animated {
+ animation: none;
+ }
+}
+.media {
+ display: flex;
+ align-items: flex-start;
+}
+.media-body {
+ flex: 1;
+}
+.list-group {
+ display: flex;
+ flex-direction: column;
+ padding-left: 0;
+ margin-bottom: 0;
+}
+.list-group-item-action {
+ width: 100%;
+ color: #d5d5d5;
+ text-align: inherit;
+}
+.list-group-item-action:focus,
+.list-group-item-action:hover {
+ z-index: 1;
+ color: #d5d5d5;
+ text-decoration: none;
+ background-color: #000000;
+}
+.list-group-item-action:active {
+ color: #d5d5d5;
+ background-color: #1f2020;
+}
+.list-group-item {
+ position: relative;
+ display: block;
+ padding: 0.75rem 1.25rem;
+ margin-bottom: 0;
+ color: #d5d5d5;
+ background-color: #1f2020;
+ border: 0 solid rgba(0, 0, 0, 0.125);
+}
+.list-group-item:first-child {
+ border-top-left-radius: 2px;
+ border-top-right-radius: 2px;
+}
+.list-group-item:last-child {
+ margin-bottom: 0;
+ border-bottom-right-radius: 2px;
+ border-bottom-left-radius: 2px;
+}
+.list-group-item.disabled,
+.list-group-item:disabled {
+ color: #868e96;
+ pointer-events: none;
+ background-color: #1f2020;
+}
+.list-group-item.active {
+ z-index: 2;
+ color: #d5d5d5;
+ background-color: #28282D;
+ border-color: #28282D;
+}
+.list-group-horizontal {
+ flex-direction: row;
+}
+.list-group-horizontal .list-group-item {
+ margin-right: 0;
+ margin-bottom: 0;
+}
+.list-group-horizontal .list-group-item:first-child {
+ border-top-left-radius: 2px;
+ border-bottom-left-radius: 2px;
+ border-top-right-radius: 0;
+}
+.list-group-horizontal .list-group-item:last-child {
+ margin-right: 0;
+ border-top-right-radius: 2px;
+ border-bottom-right-radius: 2px;
+ border-bottom-left-radius: 0;
+}
+@media (min-width: 576px) {
+ .list-group-horizontal-sm {
+ flex-direction: row;
+ }
+ .list-group-horizontal-sm .list-group-item {
+ margin-right: 0;
+ margin-bottom: 0;
+ }
+ .list-group-horizontal-sm .list-group-item:first-child {
+ border-top-left-radius: 2px;
+ border-bottom-left-radius: 2px;
+ border-top-right-radius: 0;
+ }
+ .list-group-horizontal-sm .list-group-item:last-child {
+ margin-right: 0;
+ border-top-right-radius: 2px;
+ border-bottom-right-radius: 2px;
+ border-bottom-left-radius: 0;
+ }
+}
+@media (min-width: 768px) {
+ .list-group-horizontal-md {
+ flex-direction: row;
+ }
+ .list-group-horizontal-md .list-group-item {
+ margin-right: 0;
+ margin-bottom: 0;
+ }
+ .list-group-horizontal-md .list-group-item:first-child {
+ border-top-left-radius: 2px;
+ border-bottom-left-radius: 2px;
+ border-top-right-radius: 0;
+ }
+ .list-group-horizontal-md .list-group-item:last-child {
+ margin-right: 0;
+ border-top-right-radius: 2px;
+ border-bottom-right-radius: 2px;
+ border-bottom-left-radius: 0;
+ }
+}
+@media (min-width: 992px) {
+ .list-group-horizontal-lg {
+ flex-direction: row;
+ }
+ .list-group-horizontal-lg .list-group-item {
+ margin-right: 0;
+ margin-bottom: 0;
+ }
+ .list-group-horizontal-lg .list-group-item:first-child {
+ border-top-left-radius: 2px;
+ border-bottom-left-radius: 2px;
+ border-top-right-radius: 0;
+ }
+ .list-group-horizontal-lg .list-group-item:last-child {
+ margin-right: 0;
+ border-top-right-radius: 2px;
+ border-bottom-right-radius: 2px;
+ border-bottom-left-radius: 0;
+ }
+}
+@media (min-width: 1200px) {
+ .list-group-horizontal-xl {
+ flex-direction: row;
+ }
+ .list-group-horizontal-xl .list-group-item {
+ margin-right: 0;
+ margin-bottom: 0;
+ }
+ .list-group-horizontal-xl .list-group-item:first-child {
+ border-top-left-radius: 2px;
+ border-bottom-left-radius: 2px;
+ border-top-right-radius: 0;
+ }
+ .list-group-horizontal-xl .list-group-item:last-child {
+ margin-right: 0;
+ border-top-right-radius: 2px;
+ border-bottom-right-radius: 2px;
+ border-bottom-left-radius: 0;
+ }
+}
+.list-group-flush .list-group-item {
+ border-right: 0;
+ border-left: 0;
+ border-radius: 0;
+}
+.list-group-flush .list-group-item:last-child {
+ margin-bottom: 0;
+}
+.list-group-flush:first-child .list-group-item:first-child {
+ border-top: 0;
+}
+.list-group-flush:last-child .list-group-item:last-child {
+ margin-bottom: 0;
+ border-bottom: 0;
+}
+.list-group-item-primary {
+ color: #003f56;
+ background-color: #b8dae6;
+}
+.list-group-item-primary.list-group-item-action:focus,
+.list-group-item-primary.list-group-item-action:hover {
+ color: #003f56;
+ background-color: #a5d0df;
+}
+.list-group-item-primary.list-group-item-action.active {
+ color: #d5d5d5;
+ background-color: #003f56;
+ border-color: #003f56;
+}
+.list-group-item-secondary {
+ color: #2e303d;
+ background-color: #d1d1d9;
+}
+.list-group-item-secondary.list-group-item-action:focus,
+.list-group-item-secondary.list-group-item-action:hover {
+ color: #2e303d;
+ background-color: #c3c3cd;
+}
+.list-group-item-secondary.list-group-item-action.active {
+ color: #d5d5d5;
+ background-color: #2e303d;
+ border-color: #2e303d;
+}
+.list-group-item-success {
+ color: #1a6147;
+ background-color: #c6ecde;
+}
+.list-group-item-success.list-group-item-action:focus,
+.list-group-item-success.list-group-item-action:hover {
+ color: #1a6147;
+ background-color: #b3e6d3;
+}
+.list-group-item-success.list-group-item-action.active {
+ color: #d5d5d5;
+ background-color: #1a6147;
+ border-color: #1a6147;
+}
+.list-group-item-info {
+ color: #1c3141;
+ background-color: #c6d2db;
+}
+.list-group-item-info.list-group-item-action:focus,
+.list-group-item-info.list-group-item-action:hover {
+ color: #1c3141;
+ background-color: #b6c6d1;
+}
+.list-group-item-info.list-group-item-action.active {
+ color: #d5d5d5;
+ background-color: #1c3141;
+ border-color: #1c3141;
+}
+.list-group-item-warning {
+ color: #693d1e;
+ background-color: #f0d8c8;
+}
+.list-group-item-warning.list-group-item-action:focus,
+.list-group-item-warning.list-group-item-action:hover {
+ color: #693d1e;
+ background-color: #ebcab4;
+}
+.list-group-item-warning.list-group-item-action.active {
+ color: #d5d5d5;
+ background-color: #693d1e;
+ border-color: #693d1e;
+}
+.list-group-item-danger {
+ color: #602121;
+ background-color: #ebcaca;
+}
+.list-group-item-danger.list-group-item-action:focus,
+.list-group-item-danger.list-group-item-action:hover {
+ color: #602121;
+ background-color: #e4b7b7;
+}
+.list-group-item-danger.list-group-item-action.active {
+ color: #d5d5d5;
+ background-color: #602121;
+ border-color: #602121;
+}
+.list-group-item-light {
+ color: #161721;
+ background-color: #c3c4c9;
+}
+.list-group-item-light.list-group-item-action:focus,
+.list-group-item-light.list-group-item-action:hover {
+ color: #161721;
+ background-color: #b6b7bd;
+}
+.list-group-item-light.list-group-item-action.active {
+ color: #d5d5d5;
+ background-color: #161721;
+ border-color: #161721;
+}
+.list-group-item-dark {
+ color: #12121c;
+ background-color: #c1c1c7;
+}
+.list-group-item-dark.list-group-item-action:focus,
+.list-group-item-dark.list-group-item-action:hover {
+ color: #12121c;
+ background-color: #b4b4bb;
+}
+.list-group-item-dark.list-group-item-action.active {
+ color: #d5d5d5;
+ background-color: #12121c;
+ border-color: #12121c;
+}
+.close {
+ float: right;
+ font-size: 1.5rem;
+ font-weight: 700;
+ line-height: 1;
+ color: #d5d5d5;
+ text-shadow: 0;
+ opacity: 0.5;
+}
+.close:hover {
+ color: #d5d5d5;
+ text-decoration: none;
+}
+.close:not(:disabled):not(.disabled):focus,
+.close:not(:disabled):not(.disabled):hover {
+ opacity: 0.75;
+}
+button.close {
+ padding: 0;
+ background-color: transparent;
+ border: 0;
+ appearance: none;
+}
+a.close.disabled {
+ pointer-events: none;
+}
+.toast {
+ max-width: 350px;
+ overflow: hidden;
+ font-size: 0.875rem;
+ background-color: rgba(255, 255, 255, 0.85);
+ background-clip: padding-box;
+ border: 1px solid rgba(0, 0, 0, 0.1);
+ box-shadow: 0 0.25rem 0.75rem rgba(0, 0, 0, 0.1);
+ backdrop-filter: blur(10px);
+ opacity: 0;
+ border-radius: 0.25rem;
+}
+.toast:not(:last-child) {
+ margin-bottom: 0.75rem;
+}
+.toast.showing {
+ opacity: 1;
+}
+.toast.show {
+ display: block;
+ opacity: 1;
+}
+.toast.hide {
+ display: none;
+}
+.toast-header {
+ display: flex;
+ align-items: center;
+ padding: 0.25rem 0.75rem;
+ color: #868e96;
+ background-color: rgba(255, 255, 255, 0.85);
+ background-clip: padding-box;
+ border-bottom: 1px solid rgba(0, 0, 0, 0.05);
+}
+.toast-body {
+ padding: 0.75rem;
+}
+.modal-open {
+ overflow: hidden;
+}
+.modal-open .modal {
+ overflow-x: hidden;
+ overflow-y: auto;
+}
+.modal {
+ position: fixed;
+ top: 0;
+ left: 0;
+ z-index: 1050;
+ display: none;
+ width: 100%;
+ height: 100%;
+ overflow: hidden;
+ outline: 0;
+}
+.modal-dialog {
+ position: relative;
+ width: auto;
+ margin: 10px;
+ pointer-events: none;
+}
+.modal.fade .modal-dialog {
+ transition: transform 0.3s ease-out;
+ transform: translate(0, -50px);
+}
+@media (prefers-reduced-motion: reduce) {
+ .modal.fade .modal-dialog {
+ transition: none;
+ }
+}
+.modal.show .modal-dialog {
+ transform: none;
+}
+.modal-dialog-scrollable {
+ display: flex;
+ max-height: calc(100% - 20px);
+}
+.modal-dialog-scrollable .modal-content {
+ max-height: calc(100vh - 20px);
+ overflow: hidden;
+}
+.modal-dialog-scrollable .modal-footer,
+.modal-dialog-scrollable .modal-header {
+ flex-shrink: 0;
+}
+.modal-dialog-scrollable .modal-body {
+ overflow-y: auto;
+}
+.modal-dialog-centered {
+ display: flex;
+ align-items: center;
+ min-height: calc(100% - 20px);
+}
+.modal-dialog-centered::before {
+ display: block;
+ height: calc(100vh - 20px);
+ content: "";
+}
+.modal-dialog-centered.modal-dialog-scrollable {
+ flex-direction: column;
+ justify-content: center;
+ height: 100%;
+}
+.modal-dialog-centered.modal-dialog-scrollable .modal-content {
+ max-height: none;
+}
+.modal-dialog-centered.modal-dialog-scrollable::before {
+ content: none;
+}
+.modal-content {
+ position: relative;
+ display: flex;
+ flex-direction: column;
+ width: 100%;
+ color: #d5d5d5;
+ pointer-events: auto;
+ background-color: #1a1a1a;
+ background-clip: padding-box;
+ border: 1px solid #000000;
+ border-radius: 2px;
+ outline: 0;
+}
+.modal-backdrop {
+ position: fixed;
+ top: 0;
+ left: 0;
+ z-index: 1040;
+ width: 100vw;
+ height: 100vh;
+ background-color: #10111B;
+}
+.modal-backdrop.fade {
+ opacity: 0;
+}
+.modal-backdrop.show {
+ opacity: 0.4;
+}
+.modal-header {
+ display: flex;
+ align-items: flex-start;
+ justify-content: space-between;
+ padding: 15px;
+ border-bottom: 1px solid #37373B;
+ border-top-left-radius: 2px;
+ border-top-right-radius: 2px;
+}
+.modal-header .close {
+ padding: 15px;
+ margin: -1rem -1rem -1rem auto;
+}
+.modal-title {
+ margin-bottom: 0;
+ line-height: 1.5;
+}
+.modal-body {
+ position: relative;
+ flex: 1 1 auto;
+ padding: 15px;
+}
+.modal-footer {
+ display: flex;
+ align-items: center;
+ justify-content: flex-end;
+ padding: 15px;
+ border-top: 1px solid #37373B;
+ border-bottom-right-radius: 2px;
+ border-bottom-left-radius: 2px;
+}
+.modal-footer > :not(:first-child) {
+ margin-left: 0.25rem;
+}
+.modal-footer > :not(:last-child) {
+ margin-right: 0.25rem;
+}
+.modal-scrollbar-measure {
+ position: absolute;
+ top: -9999px;
+ width: 50px;
+ height: 50px;
+ overflow: scroll;
+}
+@media (min-width: 576px) {
+ .modal-dialog {
+ max-width: 500px;
+ margin: 30px auto;
+ }
+ .modal-dialog-scrollable {
+ max-height: calc(100% - 60px);
+ }
+ .modal-dialog-scrollable .modal-content {
+ max-height: calc(100vh - 60px);
+ }
+ .modal-dialog-centered {
+ min-height: calc(100% - 60px);
+ }
+ .modal-dialog-centered::before {
+ height: calc(100vh - 60px);
+ }
+ .modal-sm {
+ max-width: 300px;
+ }
+}
+@media (min-width: 992px) {
+ .modal-lg,
+ .modal-xl {
+ max-width: 800px;
+ }
+}
+@media (min-width: 1200px) {
+ .modal-xl {
+ max-width: 1140px;
+ }
+}
+.tooltip {
+ position: absolute;
+ z-index: 1070;
+ display: block;
+ margin: 0;
+ font-family: "Inter", -apple-system, BlinkMacSystemFont, "Segoe UI",
+ Roboto, "Helvetica Neue", Arial, "Noto Sans", sans-serif,
+ "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol", "Noto Color Emoji";
+ font-style: normal;
+ font-weight: 400;
+ line-height: 1.5;
+ text-align: left;
+ text-align: start;
+ text-decoration: none;
+ text-shadow: none;
+ text-transform: none;
+ letter-spacing: normal;
+ word-break: normal;
+ word-spacing: normal;
+ white-space: normal;
+ line-break: auto;
+ font-size: 0.875rem;
+ word-wrap: break-word;
+ opacity: 0;
+}
+.tooltip.show {
+ opacity: 0.9;
+}
+.tooltip .arrow {
+ position: absolute;
+ display: block;
+ width: 5px;
+ height: 5px;
+}
+.tooltip .arrow::before {
+ position: absolute;
+ content: "";
+ border-color: transparent;
+ border-style: solid;
+}
+.bs-tooltip-auto[x-placement^="top"],
+.bs-tooltip-top {
+ padding: 5px 0;
+}
+.bs-tooltip-auto[x-placement^="top"] .arrow,
+.bs-tooltip-top .arrow {
+ bottom: 0;
+}
+.bs-tooltip-auto[x-placement^="top"] .arrow::before,
+.bs-tooltip-top .arrow::before {
+ top: 0;
+ border-width: 5px 2.5px 0;
+ border-top-color: #000;
+}
+.bs-tooltip-auto[x-placement^="right"],
+.bs-tooltip-right {
+ padding: 0 5px;
+}
+.bs-tooltip-auto[x-placement^="right"] .arrow,
+.bs-tooltip-right .arrow {
+ left: 0;
+ width: 5px;
+ height: 5px;
+}
+.bs-tooltip-auto[x-placement^="right"] .arrow::before,
+.bs-tooltip-right .arrow::before {
+ right: 0;
+ border-width: 2.5px 5px 2.5px 0;
+ border-right-color: #000;
+}
+.bs-tooltip-auto[x-placement^="bottom"],
+.bs-tooltip-bottom {
+ padding: 5px 0;
+}
+.bs-tooltip-auto[x-placement^="bottom"] .arrow,
+.bs-tooltip-bottom .arrow {
+ top: 0;
+}
+.bs-tooltip-auto[x-placement^="bottom"] .arrow::before,
+.bs-tooltip-bottom .arrow::before {
+ bottom: 0;
+ border-width: 0 2.5px 5px;
+ border-bottom-color: #000;
+}
+.bs-tooltip-auto[x-placement^="left"],
+.bs-tooltip-left {
+ padding: 0 5px;
+}
+.bs-tooltip-auto[x-placement^="left"] .arrow,
+.bs-tooltip-left .arrow {
+ right: 0;
+ width: 5px;
+ height: 5px;
+}
+.bs-tooltip-auto[x-placement^="left"] .arrow::before,
+.bs-tooltip-left .arrow::before {
+ left: 0;
+ border-width: 2.5px 0 2.5px 5px;
+ border-left-color: #000;
+}
+.tooltip-inner {
+ max-width: 200px;
+ padding: 3px 8px;
+ color: #d5d5d5;
+ text-align: center;
+ background-color: #000;
+ border-radius: 2px;
+}
+.popover {
+ position: absolute;
+ top: 0;
+ left: 0;
+ z-index: 1060;
+ display: block;
+ max-width: 276px;
+ font-family: "Inter", -apple-system, BlinkMacSystemFont, "Segoe UI",
+ Roboto, "Helvetica Neue", Arial, "Noto Sans", sans-serif,
+ "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol", "Noto Color Emoji";
+ font-style: normal;
+ font-weight: 400;
+ line-height: 1.5;
+ text-align: left;
+ text-align: start;
+ text-decoration: none;
+ text-shadow: none;
+ text-transform: none;
+ letter-spacing: normal;
+ word-break: normal;
+ word-spacing: normal;
+ white-space: normal;
+ line-break: auto;
+ font-size: 0.875rem;
+ word-wrap: break-word;
+ background-color: #000;
+ background-clip: padding-box;
+ border: 1px solid rgba(0, 0, 0, 0.2);
+ border-radius: 2px;
+}
+.popover .arrow {
+ position: absolute;
+ display: block;
+ width: 10px;
+ height: 5px;
+ margin: 0 2px;
+}
+.popover .arrow::after,
+.popover .arrow::before {
+ position: absolute;
+ display: block;
+ content: "";
+ border-color: transparent;
+ border-style: solid;
+}
+.bs-popover-auto[x-placement^="top"],
+.bs-popover-top {
+ margin-bottom: 5px;
+}
+.bs-popover-auto[x-placement^="top"] > .arrow,
+.bs-popover-top > .arrow {
+ bottom: calc((5px + 1px) * -1);
+}
+.bs-popover-auto[x-placement^="top"] > .arrow::before,
+.bs-popover-top > .arrow::before {
+ bottom: 0;
+ border-width: 5px 5px 0;
+ border-top-color: rgba(0, 0, 0, 0.25);
+}
+.bs-popover-auto[x-placement^="top"] > .arrow::after,
+.bs-popover-top > .arrow::after {
+ bottom: 1px;
+ border-width: 5px 5px 0;
+ border-top-color: #000;
+}
+.bs-popover-auto[x-placement^="right"],
+.bs-popover-right {
+ margin-left: 5px;
+}
+.bs-popover-auto[x-placement^="right"] > .arrow,
+.bs-popover-right > .arrow {
+ left: calc((5px + 1px) * -1);
+ width: 5px;
+ height: 10px;
+ margin: 2px 0;
+}
+.bs-popover-auto[x-placement^="right"] > .arrow::before,
+.bs-popover-right > .arrow::before {
+ left: 0;
+ border-width: 5px 5px 5px 0;
+ border-right-color: rgba(0, 0, 0, 0.25);
+}
+.bs-popover-auto[x-placement^="right"] > .arrow::after,
+.bs-popover-right > .arrow::after {
+ left: 1px;
+ border-width: 5px 5px 5px 0;
+ border-right-color: #000;
+}
+.bs-popover-auto[x-placement^="bottom"],
+.bs-popover-bottom {
+ margin-top: 5px;
+}
+.bs-popover-auto[x-placement^="bottom"] > .arrow,
+.bs-popover-bottom > .arrow {
+ top: calc((5px + 1px) * -1);
+}
+.bs-popover-auto[x-placement^="bottom"] > .arrow::before,
+.bs-popover-bottom > .arrow::before {
+ top: 0;
+ border-width: 0 5px 5px 5px;
+ border-bottom-color: rgba(0, 0, 0, 0.25);
+}
+.bs-popover-auto[x-placement^="bottom"] > .arrow::after,
+.bs-popover-bottom > .arrow::after {
+ top: 1px;
+ border-width: 0 5px 5px 5px;
+ border-bottom-color: #000;
+}
+.bs-popover-auto[x-placement^="bottom"] .popover-header::before,
+.bs-popover-bottom .popover-header::before {
+ position: absolute;
+ top: 0;
+ left: 50%;
+ display: block;
+ width: 10px;
+ margin-left: -5px;
+ content: "";
+ border-bottom: 1px solid #000;
+}
+.bs-popover-auto[x-placement^="left"],
+.bs-popover-left {
+ margin-right: 5px;
+}
+.bs-popover-auto[x-placement^="left"] > .arrow,
+.bs-popover-left > .arrow {
+ right: calc((5px + 1px) * -1);
+ width: 5px;
+ height: 10px;
+ margin: 2px 0;
+}
+.bs-popover-auto[x-placement^="left"] > .arrow::before,
+.bs-popover-left > .arrow::before {
+ right: 0;
+ border-width: 5px 0 5px 5px;
+ border-left-color: rgba(0, 0, 0, 0.25);
+}
+.bs-popover-auto[x-placement^="left"] > .arrow::after,
+.bs-popover-left > .arrow::after {
+ right: 1px;
+ border-width: 5px 0 5px 5px;
+ border-left-color: #000;
+}
+.popover-header {
+ padding: 8px 14px;
+ margin-bottom: 0;
+ font-size: 1rem;
+ color: #d5d5d5;
+ background-color: #000;
+ border-bottom: 1px solid #000;
+ border-top-left-radius: calc(2px - 1px);
+ border-top-right-radius: calc(2px - 1px);
+}
+.popover-header:empty {
+ display: none;
+}
+.popover-body {
+ padding: 9px 14px;
+ color: #d5d5d5;
+}
+.carousel {
+ position: relative;
+}
+.carousel.pointer-event {
+ touch-action: pan-y;
+}
+.carousel-inner {
+ position: relative;
+ width: 100%;
+ overflow: hidden;
+}
+.carousel-inner::after {
+ display: block;
+ clear: both;
+ content: "";
+}
+.carousel-item {
+ position: relative;
+ display: none;
+ float: left;
+ width: 100%;
+ margin-right: -100%;
+ backface-visibility: hidden;
+ transition: transform 0.6s ease;
+}
+@media (prefers-reduced-motion: reduce) {
+ .carousel-item {
+ transition: none;
+ }
+}
+.carousel-item-next,
+.carousel-item-prev,
+.carousel-item.active {
+ display: block;
+}
+.active.carousel-item-right,
+.carousel-item-next:not(.carousel-item-left) {
+ transform: translateX(100%);
+}
+.active.carousel-item-left,
+.carousel-item-prev:not(.carousel-item-right) {
+ transform: translateX(-100%);
+}
+.carousel-fade .carousel-item {
+ opacity: 0;
+ transition-property: opacity;
+ transform: none;
+}
+.carousel-fade .carousel-item-next.carousel-item-left,
+.carousel-fade .carousel-item-prev.carousel-item-right,
+.carousel-fade .carousel-item.active {
+ z-index: 1;
+ opacity: 1;
+}
+.carousel-fade .active.carousel-item-left,
+.carousel-fade .active.carousel-item-right {
+ z-index: 0;
+ opacity: 0;
+ transition: 0s 0.6s opacity;
+}
+@media (prefers-reduced-motion: reduce) {
+ .carousel-fade .active.carousel-item-left,
+ .carousel-fade .active.carousel-item-right {
+ transition: none;
+ }
+}
+.carousel-control-next,
+.carousel-control-prev {
+ position: absolute;
+ top: 0;
+ bottom: 0;
+ z-index: 1;
+ display: flex;
+ align-items: center;
+ justify-content: center;
+ width: 15%;
+ color: #d5d5d5;
+ text-align: center;
+ opacity: 0.5;
+ transition: opacity 0.15s ease;
+}
+@media (prefers-reduced-motion: reduce) {
+ .carousel-control-next,
+ .carousel-control-prev {
+ transition: none;
+ }
+}
+.carousel-control-next:focus,
+.carousel-control-next:hover,
+.carousel-control-prev:focus,
+.carousel-control-prev:hover {
+ color: #d5d5d5;
+ text-decoration: none;
+ outline: 0;
+ opacity: 0.9;
+}
+.carousel-control-prev {
+ left: 0;
+}
+.carousel-control-next {
+ right: 0;
+}
+.carousel-control-next-icon,
+.carousel-control-prev-icon {
+ display: inline-block;
+ width: 20px;
+ height: 20px;
+ background: no-repeat 50%/100% 100%;
+}
+.carousel-control-prev-icon {
+ background-image: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' fill='%23d5d5d5' viewBox='0 0 8 8'%3e%3cpath d='M5.25 0l-4 4 4 4 1.5-1.5-2.5-2.5 2.5-2.5-1.5-1.5z'/%3e%3c/svg%3e");
+}
+.carousel-control-next-icon {
+ background-image: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' fill='%23d5d5d5' viewBox='0 0 8 8'%3e%3cpath d='M2.75 0l-1.5 1.5 2.5 2.5-2.5 2.5 1.5 1.5 4-4-4-4z'/%3e%3c/svg%3e");
+}
+.carousel-indicators {
+ position: absolute;
+ right: 0;
+ bottom: 0;
+ left: 0;
+ z-index: 15;
+ display: flex;
+ justify-content: center;
+ padding-left: 0;
+ margin-right: 15%;
+ margin-left: 15%;
+ list-style: none;
+}
+.carousel-indicators li {
+ box-sizing: content-box;
+ flex: 0 1 auto;
+ width: 30px;
+ height: 3px;
+ margin-right: 3px;
+ margin-left: 3px;
+ text-indent: -999px;
+ cursor: pointer;
+ background-color: #d5d5d5;
+ background-clip: padding-box;
+ border-top: 10px solid transparent;
+ border-bottom: 10px solid transparent;
+ opacity: 0.5;
+ transition: opacity 0.6s ease;
+}
+@media (prefers-reduced-motion: reduce) {
+ .carousel-indicators li {
+ transition: none;
+ }
+}
+.carousel-indicators .active {
+ opacity: 1;
+}
+.carousel-caption {
+ position: absolute;
+ right: 15%;
+ bottom: 20px;
+ left: 15%;
+ z-index: 10;
+ padding-top: 20px;
+ padding-bottom: 20px;
+ color: #d5d5d5;
+ text-align: center;
+}
+@keyframes spinner-border {
+ to {
+ transform: rotate(360deg);
+ }
+}
+.spinner-border {
+ display: inline-block;
+ width: 2rem;
+ height: 2rem;
+ vertical-align: text-bottom;
+ border: 0.25em solid currentColor;
+ border-right-color: transparent;
+ border-radius: 50%;
+ animation: spinner-border 0.75s linear infinite;
+}
+.spinner-border-sm {
+ width: 1rem;
+ height: 1rem;
+ border-width: 0.2em;
+}
+@keyframes spinner-grow {
+ 0% {
+ transform: scale(0);
+ }
+ 50% {
+ opacity: 1;
+ }
+}
+.spinner-grow {
+ display: inline-block;
+ width: 2rem;
+ height: 2rem;
+ vertical-align: text-bottom;
+ background-color: currentColor;
+ border-radius: 50%;
+ opacity: 0;
+ animation: spinner-grow 0.75s linear infinite;
+}
+.spinner-grow-sm {
+ width: 1rem;
+ height: 1rem;
+}
+.align-baseline {
+ vertical-align: baseline !important;
+}
+.align-top {
+ vertical-align: top !important;
+}
+.align-middle {
+ vertical-align: middle !important;
+}
+.align-bottom {
+ vertical-align: bottom !important;
+}
+.align-text-bottom {
+ vertical-align: text-bottom !important;
+}
+.align-text-top {
+ vertical-align: text-top !important;
+}
+.bg-primary {
+ background-color: #28282D !important;
+}
+a.bg-primary:focus,
+a.bg-primary:hover,
+button.bg-primary:focus,
+button.bg-primary:hover {
+ background-color: #005573 !important;
+}
+.bg-secondary {
+ background-color: #38383c !important;
+}
+a.bg-secondary:focus,
+a.bg-secondary:hover,
+button.bg-secondary:focus,
+button.bg-secondary:hover {
+ background-color: #434559 !important;
+}
+.bg-success {
+ background-color: #366a57 !important;
+}
+a.bg-success:focus,
+a.bg-success:hover,
+button.bg-success:focus,
+button.bg-success:hover {
+ background-color: #27926b !important;
+}
+.bg-info {
+ background-color: #053c64 !important;
+}
+a.bg-info:focus,
+a.bg-info:hover,
+button.bg-info:focus,
+button.bg-info:hover {
+ background-color: #264459 !important;
+}
+.bg-warning {
+ background-color: #8a5026 !important;
+}
+a.bg-warning:focus,
+a.bg-warning:hover,
+button.bg-warning:focus,
+button.bg-warning:hover {
+ background-color: #a35e2c !important;
+}
+.bg-danger {
+ background-color: #823a3a !important;
+}
+a.bg-danger:focus,
+a.bg-danger:hover,
+button.bg-danger:focus,
+button.bg-danger:hover {
+ background-color: #923333 !important;
+}
+.bg-light {
+ background-color: #1f2020 !important;
+}
+a.bg-light:focus,
+a.bg-light:hover,
+button.bg-light:focus,
+button.bg-light:hover {
+ background-color: #161720 !important;
+}
+.bg-dark {
+ background-color: #1a1a1a !important;
+}
+a.bg-dark:focus,
+a.bg-dark:hover,
+button.bg-dark:focus,
+button.bg-dark:hover {
+ background-color: #0e0f17 !important;
+}
+.bg-white {
+ background-color: #d5d5d5 !important;
+}
+.bg-transparent {
+ background-color: transparent !important;
+}
+.border {
+ border: 1px solid #3c3a3a !important;
+}
+.border-top {
+ border-top: 1px solid #37373B !important;
+}
+.border-right {
+ border-right: 1px solid #37373B !important;
+}
+.border-bottom {
+ border-bottom: 1px solid #3c3a3a !important;
+}
+.border-left {
+ border-left: 1px solid #000000 !important;
+}
+.border-0 {
+ border: 0 !important;
+}
+.border-top-0 {
+ border-top: 0 !important;
+}
+.border-right-0 {
+ border-right: 0 !important;
+}
+.border-bottom-0 {
+ border-bottom: 0 !important;
+}
+.border-left-0 {
+ border-left: 0 !important;
+}
+.border-primary {
+ border-color: #007aa6 !important;
+}
+.border-secondary {
+ border-color: #38383c !important;
+}
+.border-success {
+ border-color: #32ba89 !important;
+}
+.border-info {
+ border-color: #053c64 !important;
+}
+.border-warning {
+ border-color: #8a5026 !important;
+}
+.border-danger {
+ border-color: #823a3a !important;
+}
+.border-light {
+ border-color: #1f2020 !important;
+}
+.border-dark {
+ border-color: #000000 !important;
+}
+.border-white {
+ border-color: #d5d5d5 !important;
+}
+.rounded-sm {
+ border-radius: 2px !important;
+}
+.rounded {
+ border-radius: 2px !important;
+}
+.rounded-top {
+ border-top-left-radius: 2px !important;
+ border-top-right-radius: 2px !important;
+}
+.rounded-right {
+ border-top-right-radius: 2px !important;
+ border-bottom-right-radius: 2px !important;
+}
+.rounded-bottom {
+ border-bottom-right-radius: 2px !important;
+ border-bottom-left-radius: 2px !important;
+}
+.rounded-left {
+ border-top-left-radius: 2px !important;
+ border-bottom-left-radius: 2px !important;
+}
+.rounded-lg {
+ border-radius: 2px !important;
+}
+.rounded-circle {
+ border-radius: 50% !important;
+}
+.rounded-pill {
+ border-radius: 50rem !important;
+}
+.rounded-0 {
+ border-radius: 0 !important;
+}
+.clearfix::after {
+ display: block;
+ clear: both;
+ content: "";
+}
+.d-none {
+ display: none !important;
+}
+.d-inline {
+ display: inline !important;
+}
+.d-inline-block {
+ display: inline-block !important;
+}
+.d-block {
+ display: block !important;
+}
+.d-table {
+ display: table !important;
+}
+.d-table-row {
+ display: table-row !important;
+}
+.d-table-cell {
+ display: table-cell !important;
+}
+.d-flex {
+ display: flex !important;
+}
+.d-inline-flex {
+ display: inline-flex !important;
+}
+@media (min-width: 576px) {
+ .d-sm-none {
+ display: none !important;
+ }
+ .d-sm-inline {
+ display: inline !important;
+ }
+ .d-sm-inline-block {
+ display: inline-block !important;
+ }
+ .d-sm-block {
+ display: block !important;
+ }
+ .d-sm-table {
+ display: table !important;
+ }
+ .d-sm-table-row {
+ display: table-row !important;
+ }
+ .d-sm-table-cell {
+ display: table-cell !important;
+ }
+ .d-sm-flex {
+ display: flex !important;
+ }
+ .d-sm-inline-flex {
+ display: inline-flex !important;
+ }
+}
+@media (min-width: 768px) {
+ .d-md-none {
+ display: none !important;
+ }
+ .d-md-inline {
+ display: inline !important;
+ }
+ .d-md-inline-block {
+ display: inline-block !important;
+ }
+ .d-md-block {
+ display: block !important;
+ }
+ .d-md-table {
+ display: table !important;
+ }
+ .d-md-table-row {
+ display: table-row !important;
+ }
+ .d-md-table-cell {
+ display: table-cell !important;
+ }
+ .d-md-flex {
+ display: flex !important;
+ }
+ .d-md-inline-flex {
+ display: inline-flex !important;
+ }
+}
+@media (min-width: 992px) {
+ .d-lg-none {
+ display: none !important;
+ }
+ .d-lg-inline {
+ display: inline !important;
+ }
+ .d-lg-inline-block {
+ display: inline-block !important;
+ }
+ .d-lg-block {
+ display: block !important;
+ }
+ .d-lg-table {
+ display: table !important;
+ }
+ .d-lg-table-row {
+ display: table-row !important;
+ }
+ .d-lg-table-cell {
+ display: table-cell !important;
+ }
+ .d-lg-flex {
+ display: flex !important;
+ }
+ .d-lg-inline-flex {
+ display: inline-flex !important;
+ }
+}
+@media (min-width: 1200px) {
+ .d-xl-none {
+ display: none !important;
+ }
+ .d-xl-inline {
+ display: inline !important;
+ }
+ .d-xl-inline-block {
+ display: inline-block !important;
+ }
+ .d-xl-block {
+ display: block !important;
+ }
+ .d-xl-table {
+ display: table !important;
+ }
+ .d-xl-table-row {
+ display: table-row !important;
+ }
+ .d-xl-table-cell {
+ display: table-cell !important;
+ }
+ .d-xl-flex {
+ display: flex !important;
+ }
+ .d-xl-inline-flex {
+ display: inline-flex !important;
+ }
+}
+@media print {
+ .d-print-none {
+ display: none !important;
+ }
+ .d-print-inline {
+ display: inline !important;
+ }
+ .d-print-inline-block {
+ display: inline-block !important;
+ }
+ .d-print-block {
+ display: block !important;
+ }
+ .d-print-table {
+ display: table !important;
+ }
+ .d-print-table-row {
+ display: table-row !important;
+ }
+ .d-print-table-cell {
+ display: table-cell !important;
+ }
+ .d-print-flex {
+ display: flex !important;
+ }
+ .d-print-inline-flex {
+ display: inline-flex !important;
+ }
+}
+.embed-responsive {
+ position: relative;
+ display: block;
+ width: 100%;
+ padding: 0;
+ overflow: hidden;
+}
+.embed-responsive::before {
+ display: block;
+ content: "";
+}
+.embed-responsive .embed-responsive-item,
+.embed-responsive embed,
+.embed-responsive iframe,
+.embed-responsive object,
+.embed-responsive video {
+ position: absolute;
+ top: 0;
+ bottom: 0;
+ left: 0;
+ width: 100%;
+ height: 100%;
+ border: 0;
+}
+.embed-responsive-21by9::before {
+ padding-top: 42.85714%;
+}
+.embed-responsive-16by9::before {
+ padding-top: 56.25%;
+}
+.embed-responsive-4by3::before {
+ padding-top: 75%;
+}
+.embed-responsive-1by1::before {
+ padding-top: 100%;
+}
+.flex-row {
+ flex-direction: row !important;
+}
+.flex-column {
+ flex-direction: column !important;
+}
+.flex-row-reverse {
+ flex-direction: row-reverse !important;
+}
+.flex-column-reverse {
+ flex-direction: column-reverse !important;
+}
+.flex-wrap {
+ flex-wrap: wrap !important;
+}
+.flex-nowrap {
+ flex-wrap: nowrap !important;
+}
+.flex-wrap-reverse {
+ flex-wrap: wrap-reverse !important;
+}
+.flex-fill {
+ flex: 1 1 auto !important;
+}
+.flex-grow-0 {
+ flex-grow: 0 !important;
+}
+.flex-grow-1 {
+ flex-grow: 1 !important;
+}
+.flex-shrink-0 {
+ flex-shrink: 0 !important;
+}
+.flex-shrink-1 {
+ flex-shrink: 1 !important;
+}
+.justify-content-start {
+ justify-content: flex-start !important;
+}
+.justify-content-end {
+ justify-content: flex-end !important;
+}
+.justify-content-center {
+ justify-content: center !important;
+}
+.justify-content-between {
+ justify-content: space-between !important;
+}
+.justify-content-around {
+ justify-content: space-around !important;
+}
+.align-items-start {
+ align-items: flex-start !important;
+}
+.align-items-end {
+ align-items: flex-end !important;
+}
+.align-items-center {
+ align-items: center !important;
+}
+.align-items-baseline {
+ align-items: baseline !important;
+}
+.align-items-stretch {
+ align-items: stretch !important;
+}
+.align-content-start {
+ align-content: flex-start !important;
+}
+.align-content-end {
+ align-content: flex-end !important;
+}
+.align-content-center {
+ align-content: center !important;
+}
+.align-content-between {
+ align-content: space-between !important;
+}
+.align-content-around {
+ align-content: space-around !important;
+}
+.align-content-stretch {
+ align-content: stretch !important;
+}
+.align-self-auto {
+ align-self: auto !important;
+}
+.align-self-start {
+ align-self: flex-start !important;
+}
+.align-self-end {
+ align-self: flex-end !important;
+}
+.align-self-center {
+ align-self: center !important;
+}
+.align-self-baseline {
+ align-self: baseline !important;
+}
+.align-self-stretch {
+ align-self: stretch !important;
+}
+@media (min-width: 576px) {
+ .flex-sm-row {
+ flex-direction: row !important;
+ }
+ .flex-sm-column {
+ flex-direction: column !important;
+ }
+ .flex-sm-row-reverse {
+ flex-direction: row-reverse !important;
+ }
+ .flex-sm-column-reverse {
+ flex-direction: column-reverse !important;
+ }
+ .flex-sm-wrap {
+ flex-wrap: wrap !important;
+ }
+ .flex-sm-nowrap {
+ flex-wrap: nowrap !important;
+ }
+ .flex-sm-wrap-reverse {
+ flex-wrap: wrap-reverse !important;
+ }
+ .flex-sm-fill {
+ flex: 1 1 auto !important;
+ }
+ .flex-sm-grow-0 {
+ flex-grow: 0 !important;
+ }
+ .flex-sm-grow-1 {
+ flex-grow: 1 !important;
+ }
+ .flex-sm-shrink-0 {
+ flex-shrink: 0 !important;
+ }
+ .flex-sm-shrink-1 {
+ flex-shrink: 1 !important;
+ }
+ .justify-content-sm-start {
+ justify-content: flex-start !important;
+ }
+ .justify-content-sm-end {
+ justify-content: flex-end !important;
+ }
+ .justify-content-sm-center {
+ justify-content: center !important;
+ }
+ .justify-content-sm-between {
+ justify-content: space-between !important;
+ }
+ .justify-content-sm-around {
+ justify-content: space-around !important;
+ }
+ .align-items-sm-start {
+ align-items: flex-start !important;
+ }
+ .align-items-sm-end {
+ align-items: flex-end !important;
+ }
+ .align-items-sm-center {
+ align-items: center !important;
+ }
+ .align-items-sm-baseline {
+ align-items: baseline !important;
+ }
+ .align-items-sm-stretch {
+ align-items: stretch !important;
+ }
+ .align-content-sm-start {
+ align-content: flex-start !important;
+ }
+ .align-content-sm-end {
+ align-content: flex-end !important;
+ }
+ .align-content-sm-center {
+ align-content: center !important;
+ }
+ .align-content-sm-between {
+ align-content: space-between !important;
+ }
+ .align-content-sm-around {
+ align-content: space-around !important;
+ }
+ .align-content-sm-stretch {
+ align-content: stretch !important;
+ }
+ .align-self-sm-auto {
+ align-self: auto !important;
+ }
+ .align-self-sm-start {
+ align-self: flex-start !important;
+ }
+ .align-self-sm-end {
+ align-self: flex-end !important;
+ }
+ .align-self-sm-center {
+ align-self: center !important;
+ }
+ .align-self-sm-baseline {
+ align-self: baseline !important;
+ }
+ .align-self-sm-stretch {
+ align-self: stretch !important;
+ }
+}
+@media (min-width: 768px) {
+ .flex-md-row {
+ flex-direction: row !important;
+ }
+ .flex-md-column {
+ flex-direction: column !important;
+ }
+ .flex-md-row-reverse {
+ flex-direction: row-reverse !important;
+ }
+ .flex-md-column-reverse {
+ flex-direction: column-reverse !important;
+ }
+ .flex-md-wrap {
+ flex-wrap: wrap !important;
+ }
+ .flex-md-nowrap {
+ flex-wrap: nowrap !important;
+ }
+ .flex-md-wrap-reverse {
+ flex-wrap: wrap-reverse !important;
+ }
+ .flex-md-fill {
+ flex: 1 1 auto !important;
+ }
+ .flex-md-grow-0 {
+ flex-grow: 0 !important;
+ }
+ .flex-md-grow-1 {
+ flex-grow: 1 !important;
+ }
+ .flex-md-shrink-0 {
+ flex-shrink: 0 !important;
+ }
+ .flex-md-shrink-1 {
+ flex-shrink: 1 !important;
+ }
+ .justify-content-md-start {
+ justify-content: flex-start !important;
+ }
+ .justify-content-md-end {
+ justify-content: flex-end !important;
+ }
+ .justify-content-md-center {
+ justify-content: center !important;
+ }
+ .justify-content-md-between {
+ justify-content: space-between !important;
+ }
+ .justify-content-md-around {
+ justify-content: space-around !important;
+ }
+ .align-items-md-start {
+ align-items: flex-start !important;
+ }
+ .align-items-md-end {
+ align-items: flex-end !important;
+ }
+ .align-items-md-center {
+ align-items: center !important;
+ }
+ .align-items-md-baseline {
+ align-items: baseline !important;
+ }
+ .align-items-md-stretch {
+ align-items: stretch !important;
+ }
+ .align-content-md-start {
+ align-content: flex-start !important;
+ }
+ .align-content-md-end {
+ align-content: flex-end !important;
+ }
+ .align-content-md-center {
+ align-content: center !important;
+ }
+ .align-content-md-between {
+ align-content: space-between !important;
+ }
+ .align-content-md-around {
+ align-content: space-around !important;
+ }
+ .align-content-md-stretch {
+ align-content: stretch !important;
+ }
+ .align-self-md-auto {
+ align-self: auto !important;
+ }
+ .align-self-md-start {
+ align-self: flex-start !important;
+ }
+ .align-self-md-end {
+ align-self: flex-end !important;
+ }
+ .align-self-md-center {
+ align-self: center !important;
+ }
+ .align-self-md-baseline {
+ align-self: baseline !important;
+ }
+ .align-self-md-stretch {
+ align-self: stretch !important;
+ }
+}
+@media (min-width: 992px) {
+ .flex-lg-row {
+ flex-direction: row !important;
+ }
+ .flex-lg-column {
+ flex-direction: column !important;
+ }
+ .flex-lg-row-reverse {
+ flex-direction: row-reverse !important;
+ }
+ .flex-lg-column-reverse {
+ flex-direction: column-reverse !important;
+ }
+ .flex-lg-wrap {
+ flex-wrap: wrap !important;
+ }
+ .flex-lg-nowrap {
+ flex-wrap: nowrap !important;
+ }
+ .flex-lg-wrap-reverse {
+ flex-wrap: wrap-reverse !important;
+ }
+ .flex-lg-fill {
+ flex: 1 1 auto !important;
+ }
+ .flex-lg-grow-0 {
+ flex-grow: 0 !important;
+ }
+ .flex-lg-grow-1 {
+ flex-grow: 1 !important;
+ }
+ .flex-lg-shrink-0 {
+ flex-shrink: 0 !important;
+ }
+ .flex-lg-shrink-1 {
+ flex-shrink: 1 !important;
+ }
+ .justify-content-lg-start {
+ justify-content: flex-start !important;
+ }
+ .justify-content-lg-end {
+ justify-content: flex-end !important;
+ }
+ .justify-content-lg-center {
+ justify-content: center !important;
+ }
+ .justify-content-lg-between {
+ justify-content: space-between !important;
+ }
+ .justify-content-lg-around {
+ justify-content: space-around !important;
+ }
+ .align-items-lg-start {
+ align-items: flex-start !important;
+ }
+ .align-items-lg-end {
+ align-items: flex-end !important;
+ }
+ .align-items-lg-center {
+ align-items: center !important;
+ }
+ .align-items-lg-baseline {
+ align-items: baseline !important;
+ }
+ .align-items-lg-stretch {
+ align-items: stretch !important;
+ }
+ .align-content-lg-start {
+ align-content: flex-start !important;
+ }
+ .align-content-lg-end {
+ align-content: flex-end !important;
+ }
+ .align-content-lg-center {
+ align-content: center !important;
+ }
+ .align-content-lg-between {
+ align-content: space-between !important;
+ }
+ .align-content-lg-around {
+ align-content: space-around !important;
+ }
+ .align-content-lg-stretch {
+ align-content: stretch !important;
+ }
+ .align-self-lg-auto {
+ align-self: auto !important;
+ }
+ .align-self-lg-start {
+ align-self: flex-start !important;
+ }
+ .align-self-lg-end {
+ align-self: flex-end !important;
+ }
+ .align-self-lg-center {
+ align-self: center !important;
+ }
+ .align-self-lg-baseline {
+ align-self: baseline !important;
+ }
+ .align-self-lg-stretch {
+ align-self: stretch !important;
+ }
+}
+@media (min-width: 1200px) {
+ .flex-xl-row {
+ flex-direction: row !important;
+ }
+ .flex-xl-column {
+ flex-direction: column !important;
+ }
+ .flex-xl-row-reverse {
+ flex-direction: row-reverse !important;
+ }
+ .flex-xl-column-reverse {
+ flex-direction: column-reverse !important;
+ }
+ .flex-xl-wrap {
+ flex-wrap: wrap !important;
+ }
+ .flex-xl-nowrap {
+ flex-wrap: nowrap !important;
+ }
+ .flex-xl-wrap-reverse {
+ flex-wrap: wrap-reverse !important;
+ }
+ .flex-xl-fill {
+ flex: 1 1 auto !important;
+ }
+ .flex-xl-grow-0 {
+ flex-grow: 0 !important;
+ }
+ .flex-xl-grow-1 {
+ flex-grow: 1 !important;
+ }
+ .flex-xl-shrink-0 {
+ flex-shrink: 0 !important;
+ }
+ .flex-xl-shrink-1 {
+ flex-shrink: 1 !important;
+ }
+ .justify-content-xl-start {
+ justify-content: flex-start !important;
+ }
+ .justify-content-xl-end {
+ justify-content: flex-end !important;
+ }
+ .justify-content-xl-center {
+ justify-content: center !important;
+ }
+ .justify-content-xl-between {
+ justify-content: space-between !important;
+ }
+ .justify-content-xl-around {
+ justify-content: space-around !important;
+ }
+ .align-items-xl-start {
+ align-items: flex-start !important;
+ }
+ .align-items-xl-end {
+ align-items: flex-end !important;
+ }
+ .align-items-xl-center {
+ align-items: center !important;
+ }
+ .align-items-xl-baseline {
+ align-items: baseline !important;
+ }
+ .align-items-xl-stretch {
+ align-items: stretch !important;
+ }
+ .align-content-xl-start {
+ align-content: flex-start !important;
+ }
+ .align-content-xl-end {
+ align-content: flex-end !important;
+ }
+ .align-content-xl-center {
+ align-content: center !important;
+ }
+ .align-content-xl-between {
+ align-content: space-between !important;
+ }
+ .align-content-xl-around {
+ align-content: space-around !important;
+ }
+ .align-content-xl-stretch {
+ align-content: stretch !important;
+ }
+ .align-self-xl-auto {
+ align-self: auto !important;
+ }
+ .align-self-xl-start {
+ align-self: flex-start !important;
+ }
+ .align-self-xl-end {
+ align-self: flex-end !important;
+ }
+ .align-self-xl-center {
+ align-self: center !important;
+ }
+ .align-self-xl-baseline {
+ align-self: baseline !important;
+ }
+ .align-self-xl-stretch {
+ align-self: stretch !important;
+ }
+}
+.float-left {
+ float: left !important;
+}
+.float-right {
+ float: right !important;
+}
+.float-none {
+ float: none !important;
+}
+@media (min-width: 576px) {
+ .float-sm-left {
+ float: left !important;
+ }
+ .float-sm-right {
+ float: right !important;
+ }
+ .float-sm-none {
+ float: none !important;
+ }
+}
+@media (min-width: 768px) {
+ .float-md-left {
+ float: left !important;
+ }
+ .float-md-right {
+ float: right !important;
+ }
+ .float-md-none {
+ float: none !important;
+ }
+}
+@media (min-width: 992px) {
+ .float-lg-left {
+ float: left !important;
+ }
+ .float-lg-right {
+ float: right !important;
+ }
+ .float-lg-none {
+ float: none !important;
+ }
+}
+@media (min-width: 1200px) {
+ .float-xl-left {
+ float: left !important;
+ }
+ .float-xl-right {
+ float: right !important;
+ }
+ .float-xl-none {
+ float: none !important;
+ }
+}
+.overflow-auto {
+ overflow: auto !important;
+}
+.overflow-hidden {
+ overflow: hidden !important;
+}
+.position-static {
+ position: static !important;
+}
+.position-relative {
+ position: relative !important;
+}
+.position-absolute {
+ position: absolute !important;
+}
+.position-fixed {
+ position: fixed !important;
+}
+.position-sticky {
+ position: sticky !important;
+}
+.fixed-top {
+ position: fixed;
+ top: 0;
+ right: 0;
+ left: 0;
+ z-index: 1030;
+}
+.fixed-bottom {
+ position: fixed;
+ right: 0;
+ bottom: 0;
+ left: 0;
+ z-index: 1030;
+}
+@supports (position: sticky) {
+ .sticky-top {
+ position: sticky;
+ top: 0;
+ z-index: 1020;
+ }
+}
+.sr-only {
+ position: absolute;
+ width: 1px;
+ height: 1px;
+ padding: 0;
+ overflow: hidden;
+ clip: rect(0, 0, 0, 0);
+ white-space: nowrap;
+ border: 0;
+}
+.sr-only-focusable:active,
+.sr-only-focusable:focus {
+ position: static;
+ width: auto;
+ height: auto;
+ overflow: visible;
+ clip: auto;
+ white-space: normal;
+}
+.shadow-sm {
+ box-shadow: 0 0.125rem 0.25rem rgba(0, 0, 0, 0.075) !important;
+}
+.shadow {
+ box-shadow: 0 0.5rem 1rem rgba(0, 0, 0, 0.15) !important;
+}
+.shadow-lg {
+ box-shadow: 0 1rem 3rem rgba(0, 0, 0, 0.175) !important;
+}
+.shadow-none {
+ box-shadow: none !important;
+}
+.w-25 {
+ width: 25% !important;
+}
+.w-50 {
+ width: 50% !important;
+}
+.w-75 {
+ width: 75% !important;
+}
+.w-100 {
+ width: 100% !important;
+}
+.w-auto {
+ width: auto !important;
+}
+.h-25 {
+ height: 25% !important;
+}
+.h-50 {
+ height: 50% !important;
+}
+.h-75 {
+ height: 75% !important;
+}
+.h-100 {
+ height: 100% !important;
+}
+.h-auto {
+ height: auto !important;
+}
+.mw-100 {
+ max-width: 100% !important;
+}
+.mh-100 {
+ max-height: 100% !important;
+}
+.min-vw-100 {
+ min-width: 100vw !important;
+}
+.min-vh-100 {
+ min-height: 100vh !important;
+}
+.vw-100 {
+ width: 100vw !important;
+}
+.vh-100 {
+ height: 100vh !important;
+}
+.stretched-link::after {
+ position: absolute;
+ top: 0;
+ right: 0;
+ bottom: 0;
+ left: 0;
+ z-index: 1;
+ pointer-events: auto;
+ content: "";
+ background-color: rgba(0, 0, 0, 0);
+}
+.m-0 {
+ margin: 0 !important;
+}
+.mt-0,
+.my-0 {
+ margin-top: 0 !important;
+}
+.mr-0,
+.mx-0 {
+ margin-right: 0 !important;
+}
+.mb-0,
+.my-0 {
+ margin-bottom: 0 !important;
+}
+.ml-0,
+.mx-0 {
+ margin-left: 0 !important;
+}
+.m-1 {
+ margin: 0.25rem !important;
+}
+.mt-1,
+.my-1 {
+ margin-top: 0.25rem !important;
+}
+.mr-1,
+.mx-1 {
+ margin-right: 0.25rem !important;
+}
+.mb-1,
+.my-1 {
+ margin-bottom: 0.25rem !important;
+}
+.ml-1,
+.mx-1 {
+ margin-left: 0.25rem !important;
+}
+.m-2 {
+ margin: 0.5rem !important;
+}
+.mt-2,
+.my-2 {
+ margin-top: 0.5rem !important;
+}
+.mr-2,
+.mx-2 {
+ margin-right: 0.5rem !important;
+}
+.mb-2,
+.my-2 {
+ margin-bottom: 0.5rem !important;
+}
+.ml-2,
+.mx-2 {
+ margin-left: 0.5rem !important;
+}
+.m-3 {
+ margin: 1rem !important;
+}
+.mt-3,
+.my-3 {
+ margin-top: 1rem !important;
+}
+.mr-3,
+.mx-3 {
+ margin-right: 1rem !important;
+}
+.mb-3,
+.my-3 {
+ margin-bottom: 1rem !important;
+}
+.ml-3,
+.mx-3 {
+ margin-left: 1rem !important;
+}
+.m-4 {
+ margin: 1.5rem !important;
+}
+.mt-4,
+.my-4 {
+ margin-top: 1.5rem !important;
+}
+.mr-4,
+.mx-4 {
+ margin-right: 1.5rem !important;
+}
+.mb-4,
+.my-4 {
+ margin-bottom: 1.5rem !important;
+}
+.ml-4,
+.mx-4 {
+ margin-left: 1.5rem !important;
+}
+.m-5 {
+ margin: 3rem !important;
+}
+.mt-5,
+.my-5 {
+ margin-top: 3rem !important;
+}
+.mr-5,
+.mx-5 {
+ margin-right: 3rem !important;
+}
+.mb-5,
+.my-5 {
+ margin-bottom: 3rem !important;
+}
+.ml-5,
+.mx-5 {
+ margin-left: 3rem !important;
+}
+.p-0 {
+ padding: 0 !important;
+}
+.pt-0,
+.py-0 {
+ padding-top: 0 !important;
+}
+.pr-0,
+.px-0 {
+ padding-right: 0 !important;
+}
+.pb-0,
+.py-0 {
+ padding-bottom: 0 !important;
+}
+.pl-0,
+.px-0 {
+ padding-left: 0 !important;
+}
+.p-1 {
+ padding: 0.25rem !important;
+}
+.pt-1,
+.py-1 {
+ padding-top: 0.25rem !important;
+}
+.pr-1,
+.px-1 {
+ padding-right: 0.25rem !important;
+}
+.pb-1,
+.py-1 {
+ padding-bottom: 0.25rem !important;
+}
+.pl-1,
+.px-1 {
+ padding-left: 0.25rem !important;
+}
+.p-2 {
+ padding: 0.5rem !important;
+}
+.pt-2,
+.py-2 {
+ padding-top: 0.5rem !important;
+}
+.pr-2,
+.px-2 {
+ padding-right: 0.5rem !important;
+}
+.pb-2,
+.py-2 {
+ padding-bottom: 0.5rem !important;
+}
+.pl-2,
+.px-2 {
+ padding-left: 0.5rem !important;
+}
+.p-3 {
+ padding: 1rem !important;
+}
+.pt-3,
+.py-3 {
+ padding-top: 1rem !important;
+}
+.pr-3,
+.px-3 {
+ padding-right: 1rem !important;
+}
+.pb-3,
+.py-3 {
+ padding-bottom: 1rem !important;
+}
+.pl-3,
+.px-3 {
+ padding-left: 1rem !important;
+}
+.p-4 {
+ padding: 1.5rem !important;
+}
+.pt-4,
+.py-4 {
+ padding-top: 1.5rem !important;
+}
+.pr-4,
+.px-4 {
+ padding-right: 1.5rem !important;
+}
+.pb-4,
+.py-4 {
+ padding-bottom: 1.5rem !important;
+}
+.pl-4,
+.px-4 {
+ padding-left: 1.5rem !important;
+}
+.p-5 {
+ padding: 3rem !important;
+}
+.pt-5,
+.py-5 {
+ padding-top: 3rem !important;
+}
+.pr-5,
+.px-5 {
+ padding-right: 3rem !important;
+}
+.pb-5,
+.py-5 {
+ padding-bottom: 3rem !important;
+}
+.pl-5,
+.px-5 {
+ padding-left: 3rem !important;
+}
+.m-n1 {
+ margin: -0.25rem !important;
+}
+.mt-n1,
+.my-n1 {
+ margin-top: -0.25rem !important;
+}
+.mr-n1,
+.mx-n1 {
+ margin-right: -0.25rem !important;
+}
+.mb-n1,
+.my-n1 {
+ margin-bottom: -0.25rem !important;
+}
+.ml-n1,
+.mx-n1 {
+ margin-left: -0.25rem !important;
+}
+.m-n2 {
+ margin: -0.5rem !important;
+}
+.mt-n2,
+.my-n2 {
+ margin-top: -0.5rem !important;
+}
+.mr-n2,
+.mx-n2 {
+ margin-right: -0.5rem !important;
+}
+.mb-n2,
+.my-n2 {
+ margin-bottom: -0.5rem !important;
+}
+.ml-n2,
+.mx-n2 {
+ margin-left: -0.5rem !important;
+}
+.m-n3 {
+ margin: -1rem !important;
+}
+.mt-n3,
+.my-n3 {
+ margin-top: -1rem !important;
+}
+.mr-n3,
+.mx-n3 {
+ margin-right: -1rem !important;
+}
+.mb-n3,
+.my-n3 {
+ margin-bottom: -1rem !important;
+}
+.ml-n3,
+.mx-n3 {
+ margin-left: -1rem !important;
+}
+.m-n4 {
+ margin: -1.5rem !important;
+}
+.mt-n4,
+.my-n4 {
+ margin-top: -1.5rem !important;
+}
+.mr-n4,
+.mx-n4 {
+ margin-right: -1.5rem !important;
+}
+.mb-n4,
+.my-n4 {
+ margin-bottom: -1.5rem !important;
+}
+.ml-n4,
+.mx-n4 {
+ margin-left: -1.5rem !important;
+}
+.m-n5 {
+ margin: -3rem !important;
+}
+.mt-n5,
+.my-n5 {
+ margin-top: -3rem !important;
+}
+.mr-n5,
+.mx-n5 {
+ margin-right: -3rem !important;
+}
+.mb-n5,
+.my-n5 {
+ margin-bottom: -3rem !important;
+}
+.ml-n5,
+.mx-n5 {
+ margin-left: -3rem !important;
+}
+.m-auto {
+ margin: auto !important;
+}
+.mt-auto,
+.my-auto {
+ margin-top: auto !important;
+}
+.mr-auto,
+.mx-auto {
+ margin-right: auto !important;
+}
+.mb-auto,
+.my-auto {
+ margin-bottom: auto !important;
+}
+.ml-auto,
+.mx-auto {
+ margin-left: auto !important;
+}
+@media (min-width: 576px) {
+ .m-sm-0 {
+ margin: 0 !important;
+ }
+ .mt-sm-0,
+ .my-sm-0 {
+ margin-top: 0 !important;
+ }
+ .mr-sm-0,
+ .mx-sm-0 {
+ margin-right: 0 !important;
+ }
+ .mb-sm-0,
+ .my-sm-0 {
+ margin-bottom: 0 !important;
+ }
+ .ml-sm-0,
+ .mx-sm-0 {
+ margin-left: 0 !important;
+ }
+ .m-sm-1 {
+ margin: 0.25rem !important;
+ }
+ .mt-sm-1,
+ .my-sm-1 {
+ margin-top: 0.25rem !important;
+ }
+ .mr-sm-1,
+ .mx-sm-1 {
+ margin-right: 0.25rem !important;
+ }
+ .mb-sm-1,
+ .my-sm-1 {
+ margin-bottom: 0.25rem !important;
+ }
+ .ml-sm-1,
+ .mx-sm-1 {
+ margin-left: 0.25rem !important;
+ }
+ .m-sm-2 {
+ margin: 0.5rem !important;
+ }
+ .mt-sm-2,
+ .my-sm-2 {
+ margin-top: 0.5rem !important;
+ }
+ .mr-sm-2,
+ .mx-sm-2 {
+ margin-right: 0.5rem !important;
+ }
+ .mb-sm-2,
+ .my-sm-2 {
+ margin-bottom: 0.5rem !important;
+ }
+ .ml-sm-2,
+ .mx-sm-2 {
+ margin-left: 0.5rem !important;
+ }
+ .m-sm-3 {
+ margin: 1rem !important;
+ }
+ .mt-sm-3,
+ .my-sm-3 {
+ margin-top: 1rem !important;
+ }
+ .mr-sm-3,
+ .mx-sm-3 {
+ margin-right: 1rem !important;
+ }
+ .mb-sm-3,
+ .my-sm-3 {
+ margin-bottom: 1rem !important;
+ }
+ .ml-sm-3,
+ .mx-sm-3 {
+ margin-left: 1rem !important;
+ }
+ .m-sm-4 {
+ margin: 1.5rem !important;
+ }
+ .mt-sm-4,
+ .my-sm-4 {
+ margin-top: 1.5rem !important;
+ }
+ .mr-sm-4,
+ .mx-sm-4 {
+ margin-right: 1.5rem !important;
+ }
+ .mb-sm-4,
+ .my-sm-4 {
+ margin-bottom: 1.5rem !important;
+ }
+ .ml-sm-4,
+ .mx-sm-4 {
+ margin-left: 1.5rem !important;
+ }
+ .m-sm-5 {
+ margin: 3rem !important;
+ }
+ .mt-sm-5,
+ .my-sm-5 {
+ margin-top: 3rem !important;
+ }
+ .mr-sm-5,
+ .mx-sm-5 {
+ margin-right: 3rem !important;
+ }
+ .mb-sm-5,
+ .my-sm-5 {
+ margin-bottom: 3rem !important;
+ }
+ .ml-sm-5,
+ .mx-sm-5 {
+ margin-left: 3rem !important;
+ }
+ .p-sm-0 {
+ padding: 0 !important;
+ }
+ .pt-sm-0,
+ .py-sm-0 {
+ padding-top: 0 !important;
+ }
+ .pr-sm-0,
+ .px-sm-0 {
+ padding-right: 0 !important;
+ }
+ .pb-sm-0,
+ .py-sm-0 {
+ padding-bottom: 0 !important;
+ }
+ .pl-sm-0,
+ .px-sm-0 {
+ padding-left: 0 !important;
+ }
+ .p-sm-1 {
+ padding: 0.25rem !important;
+ }
+ .pt-sm-1,
+ .py-sm-1 {
+ padding-top: 0.25rem !important;
+ }
+ .pr-sm-1,
+ .px-sm-1 {
+ padding-right: 0.25rem !important;
+ }
+ .pb-sm-1,
+ .py-sm-1 {
+ padding-bottom: 0.25rem !important;
+ }
+ .pl-sm-1,
+ .px-sm-1 {
+ padding-left: 0.25rem !important;
+ }
+ .p-sm-2 {
+ padding: 0.5rem !important;
+ }
+ .pt-sm-2,
+ .py-sm-2 {
+ padding-top: 0.5rem !important;
+ }
+ .pr-sm-2,
+ .px-sm-2 {
+ padding-right: 0.5rem !important;
+ }
+ .pb-sm-2,
+ .py-sm-2 {
+ padding-bottom: 0.5rem !important;
+ }
+ .pl-sm-2,
+ .px-sm-2 {
+ padding-left: 0.5rem !important;
+ }
+ .p-sm-3 {
+ padding: 1rem !important;
+ }
+ .pt-sm-3,
+ .py-sm-3 {
+ padding-top: 1rem !important;
+ }
+ .pr-sm-3,
+ .px-sm-3 {
+ padding-right: 1rem !important;
+ }
+ .pb-sm-3,
+ .py-sm-3 {
+ padding-bottom: 1rem !important;
+ }
+ .pl-sm-3,
+ .px-sm-3 {
+ padding-left: 1rem !important;
+ }
+ .p-sm-4 {
+ padding: 1.5rem !important;
+ }
+ .pt-sm-4,
+ .py-sm-4 {
+ padding-top: 1.5rem !important;
+ }
+ .pr-sm-4,
+ .px-sm-4 {
+ padding-right: 1.5rem !important;
+ }
+ .pb-sm-4,
+ .py-sm-4 {
+ padding-bottom: 1.5rem !important;
+ }
+ .pl-sm-4,
+ .px-sm-4 {
+ padding-left: 1.5rem !important;
+ }
+ .p-sm-5 {
+ padding: 3rem !important;
+ }
+ .pt-sm-5,
+ .py-sm-5 {
+ padding-top: 3rem !important;
+ }
+ .pr-sm-5,
+ .px-sm-5 {
+ padding-right: 3rem !important;
+ }
+ .pb-sm-5,
+ .py-sm-5 {
+ padding-bottom: 3rem !important;
+ }
+ .pl-sm-5,
+ .px-sm-5 {
+ padding-left: 3rem !important;
+ }
+ .m-sm-n1 {
+ margin: -0.25rem !important;
+ }
+ .mt-sm-n1,
+ .my-sm-n1 {
+ margin-top: -0.25rem !important;
+ }
+ .mr-sm-n1,
+ .mx-sm-n1 {
+ margin-right: -0.25rem !important;
+ }
+ .mb-sm-n1,
+ .my-sm-n1 {
+ margin-bottom: -0.25rem !important;
+ }
+ .ml-sm-n1,
+ .mx-sm-n1 {
+ margin-left: -0.25rem !important;
+ }
+ .m-sm-n2 {
+ margin: -0.5rem !important;
+ }
+ .mt-sm-n2,
+ .my-sm-n2 {
+ margin-top: -0.5rem !important;
+ }
+ .mr-sm-n2,
+ .mx-sm-n2 {
+ margin-right: -0.5rem !important;
+ }
+ .mb-sm-n2,
+ .my-sm-n2 {
+ margin-bottom: -0.5rem !important;
+ }
+ .ml-sm-n2,
+ .mx-sm-n2 {
+ margin-left: -0.5rem !important;
+ }
+ .m-sm-n3 {
+ margin: -1rem !important;
+ }
+ .mt-sm-n3,
+ .my-sm-n3 {
+ margin-top: -1rem !important;
+ }
+ .mr-sm-n3,
+ .mx-sm-n3 {
+ margin-right: -1rem !important;
+ }
+ .mb-sm-n3,
+ .my-sm-n3 {
+ margin-bottom: -1rem !important;
+ }
+ .ml-sm-n3,
+ .mx-sm-n3 {
+ margin-left: -1rem !important;
+ }
+ .m-sm-n4 {
+ margin: -1.5rem !important;
+ }
+ .mt-sm-n4,
+ .my-sm-n4 {
+ margin-top: -1.5rem !important;
+ }
+ .mr-sm-n4,
+ .mx-sm-n4 {
+ margin-right: -1.5rem !important;
+ }
+ .mb-sm-n4,
+ .my-sm-n4 {
+ margin-bottom: -1.5rem !important;
+ }
+ .ml-sm-n4,
+ .mx-sm-n4 {
+ margin-left: -1.5rem !important;
+ }
+ .m-sm-n5 {
+ margin: -3rem !important;
+ }
+ .mt-sm-n5,
+ .my-sm-n5 {
+ margin-top: -3rem !important;
+ }
+ .mr-sm-n5,
+ .mx-sm-n5 {
+ margin-right: -3rem !important;
+ }
+ .mb-sm-n5,
+ .my-sm-n5 {
+ margin-bottom: -3rem !important;
+ }
+ .ml-sm-n5,
+ .mx-sm-n5 {
+ margin-left: -3rem !important;
+ }
+ .m-sm-auto {
+ margin: auto !important;
+ }
+ .mt-sm-auto,
+ .my-sm-auto {
+ margin-top: auto !important;
+ }
+ .mr-sm-auto,
+ .mx-sm-auto {
+ margin-right: auto !important;
+ }
+ .mb-sm-auto,
+ .my-sm-auto {
+ margin-bottom: auto !important;
+ }
+ .ml-sm-auto,
+ .mx-sm-auto {
+ margin-left: auto !important;
+ }
+}
+@media (min-width: 768px) {
+ .m-md-0 {
+ margin: 0 !important;
+ }
+ .mt-md-0,
+ .my-md-0 {
+ margin-top: 0 !important;
+ }
+ .mr-md-0,
+ .mx-md-0 {
+ margin-right: 0 !important;
+ }
+ .mb-md-0,
+ .my-md-0 {
+ margin-bottom: 0 !important;
+ }
+ .ml-md-0,
+ .mx-md-0 {
+ margin-left: 0 !important;
+ }
+ .m-md-1 {
+ margin: 0.25rem !important;
+ }
+ .mt-md-1,
+ .my-md-1 {
+ margin-top: 0.25rem !important;
+ }
+ .mr-md-1,
+ .mx-md-1 {
+ margin-right: 0.25rem !important;
+ }
+ .mb-md-1,
+ .my-md-1 {
+ margin-bottom: 0.25rem !important;
+ }
+ .ml-md-1,
+ .mx-md-1 {
+ margin-left: 0.25rem !important;
+ }
+ .m-md-2 {
+ margin: 0.5rem !important;
+ }
+ .mt-md-2,
+ .my-md-2 {
+ margin-top: 0.5rem !important;
+ }
+ .mr-md-2,
+ .mx-md-2 {
+ margin-right: 0.5rem !important;
+ }
+ .mb-md-2,
+ .my-md-2 {
+ margin-bottom: 0.5rem !important;
+ }
+ .ml-md-2,
+ .mx-md-2 {
+ margin-left: 0.5rem !important;
+ }
+ .m-md-3 {
+ margin: 1rem !important;
+ }
+ .mt-md-3,
+ .my-md-3 {
+ margin-top: 1rem !important;
+ }
+ .mr-md-3,
+ .mx-md-3 {
+ margin-right: 1rem !important;
+ }
+ .mb-md-3,
+ .my-md-3 {
+ margin-bottom: 1rem !important;
+ }
+ .ml-md-3,
+ .mx-md-3 {
+ margin-left: 1rem !important;
+ }
+ .m-md-4 {
+ margin: 1.5rem !important;
+ }
+ .mt-md-4,
+ .my-md-4 {
+ margin-top: 1.5rem !important;
+ }
+ .mr-md-4,
+ .mx-md-4 {
+ margin-right: 1.5rem !important;
+ }
+ .mb-md-4,
+ .my-md-4 {
+ margin-bottom: 1.5rem !important;
+ }
+ .ml-md-4,
+ .mx-md-4 {
+ margin-left: 1.5rem !important;
+ }
+ .m-md-5 {
+ margin: 3rem !important;
+ }
+ .mt-md-5,
+ .my-md-5 {
+ margin-top: 3rem !important;
+ }
+ .mr-md-5,
+ .mx-md-5 {
+ margin-right: 3rem !important;
+ }
+ .mb-md-5,
+ .my-md-5 {
+ margin-bottom: 3rem !important;
+ }
+ .ml-md-5,
+ .mx-md-5 {
+ margin-left: 3rem !important;
+ }
+ .p-md-0 {
+ padding: 0 !important;
+ }
+ .pt-md-0,
+ .py-md-0 {
+ padding-top: 0 !important;
+ }
+ .pr-md-0,
+ .px-md-0 {
+ padding-right: 0 !important;
+ }
+ .pb-md-0,
+ .py-md-0 {
+ padding-bottom: 0 !important;
+ }
+ .pl-md-0,
+ .px-md-0 {
+ padding-left: 0 !important;
+ }
+ .p-md-1 {
+ padding: 0.25rem !important;
+ }
+ .pt-md-1,
+ .py-md-1 {
+ padding-top: 0.25rem !important;
+ }
+ .pr-md-1,
+ .px-md-1 {
+ padding-right: 0.25rem !important;
+ }
+ .pb-md-1,
+ .py-md-1 {
+ padding-bottom: 0.25rem !important;
+ }
+ .pl-md-1,
+ .px-md-1 {
+ padding-left: 0.25rem !important;
+ }
+ .p-md-2 {
+ padding: 0.5rem !important;
+ }
+ .pt-md-2,
+ .py-md-2 {
+ padding-top: 0.5rem !important;
+ }
+ .pr-md-2,
+ .px-md-2 {
+ padding-right: 0.5rem !important;
+ }
+ .pb-md-2,
+ .py-md-2 {
+ padding-bottom: 0.5rem !important;
+ }
+ .pl-md-2,
+ .px-md-2 {
+ padding-left: 0.5rem !important;
+ }
+ .p-md-3 {
+ padding: 1rem !important;
+ }
+ .pt-md-3,
+ .py-md-3 {
+ padding-top: 1rem !important;
+ }
+ .pr-md-3,
+ .px-md-3 {
+ padding-right: 1rem !important;
+ }
+ .pb-md-3,
+ .py-md-3 {
+ padding-bottom: 1rem !important;
+ }
+ .pl-md-3,
+ .px-md-3 {
+ padding-left: 1rem !important;
+ }
+ .p-md-4 {
+ padding: 1.5rem !important;
+ }
+ .pt-md-4,
+ .py-md-4 {
+ padding-top: 1.5rem !important;
+ }
+ .pr-md-4,
+ .px-md-4 {
+ padding-right: 1.5rem !important;
+ }
+ .pb-md-4,
+ .py-md-4 {
+ padding-bottom: 1.5rem !important;
+ }
+ .pl-md-4,
+ .px-md-4 {
+ padding-left: 1.5rem !important;
+ }
+ .p-md-5 {
+ padding: 3rem !important;
+ }
+ .pt-md-5,
+ .py-md-5 {
+ padding-top: 3rem !important;
+ }
+ .pr-md-5,
+ .px-md-5 {
+ padding-right: 3rem !important;
+ }
+ .pb-md-5,
+ .py-md-5 {
+ padding-bottom: 3rem !important;
+ }
+ .pl-md-5,
+ .px-md-5 {
+ padding-left: 3rem !important;
+ }
+ .m-md-n1 {
+ margin: -0.25rem !important;
+ }
+ .mt-md-n1,
+ .my-md-n1 {
+ margin-top: -0.25rem !important;
+ }
+ .mr-md-n1,
+ .mx-md-n1 {
+ margin-right: -0.25rem !important;
+ }
+ .mb-md-n1,
+ .my-md-n1 {
+ margin-bottom: -0.25rem !important;
+ }
+ .ml-md-n1,
+ .mx-md-n1 {
+ margin-left: -0.25rem !important;
+ }
+ .m-md-n2 {
+ margin: -0.5rem !important;
+ }
+ .mt-md-n2,
+ .my-md-n2 {
+ margin-top: -0.5rem !important;
+ }
+ .mr-md-n2,
+ .mx-md-n2 {
+ margin-right: -0.5rem !important;
+ }
+ .mb-md-n2,
+ .my-md-n2 {
+ margin-bottom: -0.5rem !important;
+ }
+ .ml-md-n2,
+ .mx-md-n2 {
+ margin-left: -0.5rem !important;
+ }
+ .m-md-n3 {
+ margin: -1rem !important;
+ }
+ .mt-md-n3,
+ .my-md-n3 {
+ margin-top: -1rem !important;
+ }
+ .mr-md-n3,
+ .mx-md-n3 {
+ margin-right: -1rem !important;
+ }
+ .mb-md-n3,
+ .my-md-n3 {
+ margin-bottom: -1rem !important;
+ }
+ .ml-md-n3,
+ .mx-md-n3 {
+ margin-left: -1rem !important;
+ }
+ .m-md-n4 {
+ margin: -1.5rem !important;
+ }
+ .mt-md-n4,
+ .my-md-n4 {
+ margin-top: -1.5rem !important;
+ }
+ .mr-md-n4,
+ .mx-md-n4 {
+ margin-right: -1.5rem !important;
+ }
+ .mb-md-n4,
+ .my-md-n4 {
+ margin-bottom: -1.5rem !important;
+ }
+ .ml-md-n4,
+ .mx-md-n4 {
+ margin-left: -1.5rem !important;
+ }
+ .m-md-n5 {
+ margin: -3rem !important;
+ }
+ .mt-md-n5,
+ .my-md-n5 {
+ margin-top: -3rem !important;
+ }
+ .mr-md-n5,
+ .mx-md-n5 {
+ margin-right: -3rem !important;
+ }
+ .mb-md-n5,
+ .my-md-n5 {
+ margin-bottom: -3rem !important;
+ }
+ .ml-md-n5,
+ .mx-md-n5 {
+ margin-left: -3rem !important;
+ }
+ .m-md-auto {
+ margin: auto !important;
+ }
+ .mt-md-auto,
+ .my-md-auto {
+ margin-top: auto !important;
+ }
+ .mr-md-auto,
+ .mx-md-auto {
+ margin-right: auto !important;
+ }
+ .mb-md-auto,
+ .my-md-auto {
+ margin-bottom: auto !important;
+ }
+ .ml-md-auto,
+ .mx-md-auto {
+ margin-left: auto !important;
+ }
+}
+@media (min-width: 992px) {
+ .m-lg-0 {
+ margin: 0 !important;
+ }
+ .mt-lg-0,
+ .my-lg-0 {
+ margin-top: 0 !important;
+ }
+ .mr-lg-0,
+ .mx-lg-0 {
+ margin-right: 0 !important;
+ }
+ .mb-lg-0,
+ .my-lg-0 {
+ margin-bottom: 0 !important;
+ }
+ .ml-lg-0,
+ .mx-lg-0 {
+ margin-left: 0 !important;
+ }
+ .m-lg-1 {
+ margin: 0.25rem !important;
+ }
+ .mt-lg-1,
+ .my-lg-1 {
+ margin-top: 0.25rem !important;
+ }
+ .mr-lg-1,
+ .mx-lg-1 {
+ margin-right: 0.25rem !important;
+ }
+ .mb-lg-1,
+ .my-lg-1 {
+ margin-bottom: 0.25rem !important;
+ }
+ .ml-lg-1,
+ .mx-lg-1 {
+ margin-left: 0.25rem !important;
+ }
+ .m-lg-2 {
+ margin: 0.5rem !important;
+ }
+ .mt-lg-2,
+ .my-lg-2 {
+ margin-top: 0.5rem !important;
+ }
+ .mr-lg-2,
+ .mx-lg-2 {
+ margin-right: 0.5rem !important;
+ }
+ .mb-lg-2,
+ .my-lg-2 {
+ margin-bottom: 0.5rem !important;
+ }
+ .ml-lg-2,
+ .mx-lg-2 {
+ margin-left: 0.5rem !important;
+ }
+ .m-lg-3 {
+ margin: 1rem !important;
+ }
+ .mt-lg-3,
+ .my-lg-3 {
+ margin-top: 1rem !important;
+ }
+ .mr-lg-3,
+ .mx-lg-3 {
+ margin-right: 1rem !important;
+ }
+ .mb-lg-3,
+ .my-lg-3 {
+ margin-bottom: 1rem !important;
+ }
+ .ml-lg-3,
+ .mx-lg-3 {
+ margin-left: 1rem !important;
+ }
+ .m-lg-4 {
+ margin: 1.5rem !important;
+ }
+ .mt-lg-4,
+ .my-lg-4 {
+ margin-top: 1.5rem !important;
+ }
+ .mr-lg-4,
+ .mx-lg-4 {
+ margin-right: 1.5rem !important;
+ }
+ .mb-lg-4,
+ .my-lg-4 {
+ margin-bottom: 1.5rem !important;
+ }
+ .ml-lg-4,
+ .mx-lg-4 {
+ margin-left: 1.5rem !important;
+ }
+ .m-lg-5 {
+ margin: 3rem !important;
+ }
+ .mt-lg-5,
+ .my-lg-5 {
+ margin-top: 3rem !important;
+ }
+ .mr-lg-5,
+ .mx-lg-5 {
+ margin-right: 3rem !important;
+ }
+ .mb-lg-5,
+ .my-lg-5 {
+ margin-bottom: 3rem !important;
+ }
+ .ml-lg-5,
+ .mx-lg-5 {
+ margin-left: 3rem !important;
+ }
+ .p-lg-0 {
+ padding: 0 !important;
+ }
+ .pt-lg-0,
+ .py-lg-0 {
+ padding-top: 0 !important;
+ }
+ .pr-lg-0,
+ .px-lg-0 {
+ padding-right: 0 !important;
+ }
+ .pb-lg-0,
+ .py-lg-0 {
+ padding-bottom: 0 !important;
+ }
+ .pl-lg-0,
+ .px-lg-0 {
+ padding-left: 0 !important;
+ }
+ .p-lg-1 {
+ padding: 0.25rem !important;
+ }
+ .pt-lg-1,
+ .py-lg-1 {
+ padding-top: 0.25rem !important;
+ }
+ .pr-lg-1,
+ .px-lg-1 {
+ padding-right: 0.25rem !important;
+ }
+ .pb-lg-1,
+ .py-lg-1 {
+ padding-bottom: 0.25rem !important;
+ }
+ .pl-lg-1,
+ .px-lg-1 {
+ padding-left: 0.25rem !important;
+ }
+ .p-lg-2 {
+ padding: 0.5rem !important;
+ }
+ .pt-lg-2,
+ .py-lg-2 {
+ padding-top: 0.5rem !important;
+ }
+ .pr-lg-2,
+ .px-lg-2 {
+ padding-right: 0.5rem !important;
+ }
+ .pb-lg-2,
+ .py-lg-2 {
+ padding-bottom: 0.5rem !important;
+ }
+ .pl-lg-2,
+ .px-lg-2 {
+ padding-left: 0.5rem !important;
+ }
+ .p-lg-3 {
+ padding: 1rem !important;
+ }
+ .pt-lg-3,
+ .py-lg-3 {
+ padding-top: 1rem !important;
+ }
+ .pr-lg-3,
+ .px-lg-3 {
+ padding-right: 1rem !important;
+ }
+ .pb-lg-3,
+ .py-lg-3 {
+ padding-bottom: 1rem !important;
+ }
+ .pl-lg-3,
+ .px-lg-3 {
+ padding-left: 1rem !important;
+ }
+ .p-lg-4 {
+ padding: 1.5rem !important;
+ }
+ .pt-lg-4,
+ .py-lg-4 {
+ padding-top: 1.5rem !important;
+ }
+ .pr-lg-4,
+ .px-lg-4 {
+ padding-right: 1.5rem !important;
+ }
+ .pb-lg-4,
+ .py-lg-4 {
+ padding-bottom: 1.5rem !important;
+ }
+ .pl-lg-4,
+ .px-lg-4 {
+ padding-left: 1.5rem !important;
+ }
+ .p-lg-5 {
+ padding: 3rem !important;
+ }
+ .pt-lg-5,
+ .py-lg-5 {
+ padding-top: 3rem !important;
+ }
+ .pr-lg-5,
+ .px-lg-5 {
+ padding-right: 3rem !important;
+ }
+ .pb-lg-5,
+ .py-lg-5 {
+ padding-bottom: 3rem !important;
+ }
+ .pl-lg-5,
+ .px-lg-5 {
+ padding-left: 3rem !important;
+ }
+ .m-lg-n1 {
+ margin: -0.25rem !important;
+ }
+ .mt-lg-n1,
+ .my-lg-n1 {
+ margin-top: -0.25rem !important;
+ }
+ .mr-lg-n1,
+ .mx-lg-n1 {
+ margin-right: -0.25rem !important;
+ }
+ .mb-lg-n1,
+ .my-lg-n1 {
+ margin-bottom: -0.25rem !important;
+ }
+ .ml-lg-n1,
+ .mx-lg-n1 {
+ margin-left: -0.25rem !important;
+ }
+ .m-lg-n2 {
+ margin: -0.5rem !important;
+ }
+ .mt-lg-n2,
+ .my-lg-n2 {
+ margin-top: -0.5rem !important;
+ }
+ .mr-lg-n2,
+ .mx-lg-n2 {
+ margin-right: -0.5rem !important;
+ }
+ .mb-lg-n2,
+ .my-lg-n2 {
+ margin-bottom: -0.5rem !important;
+ }
+ .ml-lg-n2,
+ .mx-lg-n2 {
+ margin-left: -0.5rem !important;
+ }
+ .m-lg-n3 {
+ margin: -1rem !important;
+ }
+ .mt-lg-n3,
+ .my-lg-n3 {
+ margin-top: -1rem !important;
+ }
+ .mr-lg-n3,
+ .mx-lg-n3 {
+ margin-right: -1rem !important;
+ }
+ .mb-lg-n3,
+ .my-lg-n3 {
+ margin-bottom: -1rem !important;
+ }
+ .ml-lg-n3,
+ .mx-lg-n3 {
+ margin-left: -1rem !important;
+ }
+ .m-lg-n4 {
+ margin: -1.5rem !important;
+ }
+ .mt-lg-n4,
+ .my-lg-n4 {
+ margin-top: -1.5rem !important;
+ }
+ .mr-lg-n4,
+ .mx-lg-n4 {
+ margin-right: -1.5rem !important;
+ }
+ .mb-lg-n4,
+ .my-lg-n4 {
+ margin-bottom: -1.5rem !important;
+ }
+ .ml-lg-n4,
+ .mx-lg-n4 {
+ margin-left: -1.5rem !important;
+ }
+ .m-lg-n5 {
+ margin: -3rem !important;
+ }
+ .mt-lg-n5,
+ .my-lg-n5 {
+ margin-top: -3rem !important;
+ }
+ .mr-lg-n5,
+ .mx-lg-n5 {
+ margin-right: -3rem !important;
+ }
+ .mb-lg-n5,
+ .my-lg-n5 {
+ margin-bottom: -3rem !important;
+ }
+ .ml-lg-n5,
+ .mx-lg-n5 {
+ margin-left: -3rem !important;
+ }
+ .m-lg-auto {
+ margin: auto !important;
+ }
+ .mt-lg-auto,
+ .my-lg-auto {
+ margin-top: auto !important;
+ }
+ .mr-lg-auto,
+ .mx-lg-auto {
+ margin-right: auto !important;
+ }
+ .mb-lg-auto,
+ .my-lg-auto {
+ margin-bottom: auto !important;
+ }
+ .ml-lg-auto,
+ .mx-lg-auto {
+ margin-left: auto !important;
+ }
+}
+@media (min-width: 1200px) {
+ .m-xl-0 {
+ margin: 0 !important;
+ }
+ .mt-xl-0,
+ .my-xl-0 {
+ margin-top: 0 !important;
+ }
+ .mr-xl-0,
+ .mx-xl-0 {
+ margin-right: 0 !important;
+ }
+ .mb-xl-0,
+ .my-xl-0 {
+ margin-bottom: 0 !important;
+ }
+ .ml-xl-0,
+ .mx-xl-0 {
+ margin-left: 0 !important;
+ }
+ .m-xl-1 {
+ margin: 0.25rem !important;
+ }
+ .mt-xl-1,
+ .my-xl-1 {
+ margin-top: 0.25rem !important;
+ }
+ .mr-xl-1,
+ .mx-xl-1 {
+ margin-right: 0.25rem !important;
+ }
+ .mb-xl-1,
+ .my-xl-1 {
+ margin-bottom: 0.25rem !important;
+ }
+ .ml-xl-1,
+ .mx-xl-1 {
+ margin-left: 0.25rem !important;
+ }
+ .m-xl-2 {
+ margin: 0.5rem !important;
+ }
+ .mt-xl-2,
+ .my-xl-2 {
+ margin-top: 0.5rem !important;
+ }
+ .mr-xl-2,
+ .mx-xl-2 {
+ margin-right: 0.5rem !important;
+ }
+ .mb-xl-2,
+ .my-xl-2 {
+ margin-bottom: 0.5rem !important;
+ }
+ .ml-xl-2,
+ .mx-xl-2 {
+ margin-left: 0.5rem !important;
+ }
+ .m-xl-3 {
+ margin: 1rem !important;
+ }
+ .mt-xl-3,
+ .my-xl-3 {
+ margin-top: 1rem !important;
+ }
+ .mr-xl-3,
+ .mx-xl-3 {
+ margin-right: 1rem !important;
+ }
+ .mb-xl-3,
+ .my-xl-3 {
+ margin-bottom: 1rem !important;
+ }
+ .ml-xl-3,
+ .mx-xl-3 {
+ margin-left: 1rem !important;
+ }
+ .m-xl-4 {
+ margin: 1.5rem !important;
+ }
+ .mt-xl-4,
+ .my-xl-4 {
+ margin-top: 1.5rem !important;
+ }
+ .mr-xl-4,
+ .mx-xl-4 {
+ margin-right: 1.5rem !important;
+ }
+ .mb-xl-4,
+ .my-xl-4 {
+ margin-bottom: 1.5rem !important;
+ }
+ .ml-xl-4,
+ .mx-xl-4 {
+ margin-left: 1.5rem !important;
+ }
+ .m-xl-5 {
+ margin: 3rem !important;
+ }
+ .mt-xl-5,
+ .my-xl-5 {
+ margin-top: 3rem !important;
+ }
+ .mr-xl-5,
+ .mx-xl-5 {
+ margin-right: 3rem !important;
+ }
+ .mb-xl-5,
+ .my-xl-5 {
+ margin-bottom: 3rem !important;
+ }
+ .ml-xl-5,
+ .mx-xl-5 {
+ margin-left: 3rem !important;
+ }
+ .p-xl-0 {
+ padding: 0 !important;
+ }
+ .pt-xl-0,
+ .py-xl-0 {
+ padding-top: 0 !important;
+ }
+ .pr-xl-0,
+ .px-xl-0 {
+ padding-right: 0 !important;
+ }
+ .pb-xl-0,
+ .py-xl-0 {
+ padding-bottom: 0 !important;
+ }
+ .pl-xl-0,
+ .px-xl-0 {
+ padding-left: 0 !important;
+ }
+ .p-xl-1 {
+ padding: 0.25rem !important;
+ }
+ .pt-xl-1,
+ .py-xl-1 {
+ padding-top: 0.25rem !important;
+ }
+ .pr-xl-1,
+ .px-xl-1 {
+ padding-right: 0.25rem !important;
+ }
+ .pb-xl-1,
+ .py-xl-1 {
+ padding-bottom: 0.25rem !important;
+ }
+ .pl-xl-1,
+ .px-xl-1 {
+ padding-left: 0.25rem !important;
+ }
+ .p-xl-2 {
+ padding: 0.5rem !important;
+ }
+ .pt-xl-2,
+ .py-xl-2 {
+ padding-top: 0.5rem !important;
+ }
+ .pr-xl-2,
+ .px-xl-2 {
+ padding-right: 0.5rem !important;
+ }
+ .pb-xl-2,
+ .py-xl-2 {
+ padding-bottom: 0.5rem !important;
+ }
+ .pl-xl-2,
+ .px-xl-2 {
+ padding-left: 0.5rem !important;
+ }
+ .p-xl-3 {
+ padding: 1rem !important;
+ }
+ .pt-xl-3,
+ .py-xl-3 {
+ padding-top: 1rem !important;
+ }
+ .pr-xl-3,
+ .px-xl-3 {
+ padding-right: 1rem !important;
+ }
+ .pb-xl-3,
+ .py-xl-3 {
+ padding-bottom: 1rem !important;
+ }
+ .pl-xl-3,
+ .px-xl-3 {
+ padding-left: 1rem !important;
+ }
+ .p-xl-4 {
+ padding: 1.5rem !important;
+ }
+ .pt-xl-4,
+ .py-xl-4 {
+ padding-top: 1.5rem !important;
+ }
+ .pr-xl-4,
+ .px-xl-4 {
+ padding-right: 1.5rem !important;
+ }
+ .pb-xl-4,
+ .py-xl-4 {
+ padding-bottom: 1.5rem !important;
+ }
+ .pl-xl-4,
+ .px-xl-4 {
+ padding-left: 1.5rem !important;
+ }
+ .p-xl-5 {
+ padding: 3rem !important;
+ }
+ .pt-xl-5,
+ .py-xl-5 {
+ padding-top: 3rem !important;
+ }
+ .pr-xl-5,
+ .px-xl-5 {
+ padding-right: 3rem !important;
+ }
+ .pb-xl-5,
+ .py-xl-5 {
+ padding-bottom: 3rem !important;
+ }
+ .pl-xl-5,
+ .px-xl-5 {
+ padding-left: 3rem !important;
+ }
+ .m-xl-n1 {
+ margin: -0.25rem !important;
+ }
+ .mt-xl-n1,
+ .my-xl-n1 {
+ margin-top: -0.25rem !important;
+ }
+ .mr-xl-n1,
+ .mx-xl-n1 {
+ margin-right: -0.25rem !important;
+ }
+ .mb-xl-n1,
+ .my-xl-n1 {
+ margin-bottom: -0.25rem !important;
+ }
+ .ml-xl-n1,
+ .mx-xl-n1 {
+ margin-left: -0.25rem !important;
+ }
+ .m-xl-n2 {
+ margin: -0.5rem !important;
+ }
+ .mt-xl-n2,
+ .my-xl-n2 {
+ margin-top: -0.5rem !important;
+ }
+ .mr-xl-n2,
+ .mx-xl-n2 {
+ margin-right: -0.5rem !important;
+ }
+ .mb-xl-n2,
+ .my-xl-n2 {
+ margin-bottom: -0.5rem !important;
+ }
+ .ml-xl-n2,
+ .mx-xl-n2 {
+ margin-left: -0.5rem !important;
+ }
+ .m-xl-n3 {
+ margin: -1rem !important;
+ }
+ .mt-xl-n3,
+ .my-xl-n3 {
+ margin-top: -1rem !important;
+ }
+ .mr-xl-n3,
+ .mx-xl-n3 {
+ margin-right: -1rem !important;
+ }
+ .mb-xl-n3,
+ .my-xl-n3 {
+ margin-bottom: -1rem !important;
+ }
+ .ml-xl-n3,
+ .mx-xl-n3 {
+ margin-left: -1rem !important;
+ }
+ .m-xl-n4 {
+ margin: -1.5rem !important;
+ }
+ .mt-xl-n4,
+ .my-xl-n4 {
+ margin-top: -1.5rem !important;
+ }
+ .mr-xl-n4,
+ .mx-xl-n4 {
+ margin-right: -1.5rem !important;
+ }
+ .mb-xl-n4,
+ .my-xl-n4 {
+ margin-bottom: -1.5rem !important;
+ }
+ .ml-xl-n4,
+ .mx-xl-n4 {
+ margin-left: -1.5rem !important;
+ }
+ .m-xl-n5 {
+ margin: -3rem !important;
+ }
+ .mt-xl-n5,
+ .my-xl-n5 {
+ margin-top: -3rem !important;
+ }
+ .mr-xl-n5,
+ .mx-xl-n5 {
+ margin-right: -3rem !important;
+ }
+ .mb-xl-n5,
+ .my-xl-n5 {
+ margin-bottom: -3rem !important;
+ }
+ .ml-xl-n5,
+ .mx-xl-n5 {
+ margin-left: -3rem !important;
+ }
+ .m-xl-auto {
+ margin: auto !important;
+ }
+ .mt-xl-auto,
+ .my-xl-auto {
+ margin-top: auto !important;
+ }
+ .mr-xl-auto,
+ .mx-xl-auto {
+ margin-right: auto !important;
+ }
+ .mb-xl-auto,
+ .my-xl-auto {
+ margin-bottom: auto !important;
+ }
+ .ml-xl-auto,
+ .mx-xl-auto {
+ margin-left: auto !important;
+ }
+}
+.text-monospace {
+ font-family: "JetBrains Mono", Menlo, Monaco, Consolas, "Liberation Mono", "Courier New",
+ monospace !important;
+}
+.text-justify {
+ text-align: justify !important;
+}
+.text-wrap {
+ white-space: normal !important;
+}
+.text-nowrap {
+ white-space: nowrap !important;
+}
+.text-truncate {
+ overflow: hidden;
+ text-overflow: ellipsis;
+ white-space: nowrap;
+}
+.text-left {
+ text-align: left !important;
+}
+.text-right {
+ text-align: right !important;
+}
+.text-center {
+ text-align: center !important;
+}
+@media (min-width: 576px) {
+ .text-sm-left {
+ text-align: left !important;
+ }
+ .text-sm-right {
+ text-align: right !important;
+ }
+ .text-sm-center {
+ text-align: center !important;
+ }
+}
+@media (min-width: 768px) {
+ .text-md-left {
+ text-align: left !important;
+ }
+ .text-md-right {
+ text-align: right !important;
+ }
+ .text-md-center {
+ text-align: center !important;
+ }
+}
+@media (min-width: 992px) {
+ .text-lg-left {
+ text-align: left !important;
+ }
+ .text-lg-right {
+ text-align: right !important;
+ }
+ .text-lg-center {
+ text-align: center !important;
+ }
+}
+@media (min-width: 1200px) {
+ .text-xl-left {
+ text-align: left !important;
+ }
+ .text-xl-right {
+ text-align: right !important;
+ }
+ .text-xl-center {
+ text-align: center !important;
+ }
+}
+.text-lowercase {
+ text-transform: lowercase !important;
+}
+.text-uppercase {
+ text-transform: uppercase !important;
+}
+.text-capitalize {
+ text-transform: capitalize !important;
+}
+.font-weight-light {
+ font-weight: 300 !important;
+}
+.font-weight-lighter {
+ font-weight: lighter !important;
+}
+.font-weight-normal {
+ font-weight: 400 !important;
+}
+.font-weight-bold {
+ font-weight: 700 !important;
+}
+.font-weight-bolder {
+ font-weight: bolder !important;
+}
+.font-italic {
+ font-style: italic !important;
+}
+.text-white {
+ color: #d5d5d5 !important;
+}
+.text-primary {
+ color: #007aa6 !important;
+}
+a.text-primary:focus,
+a.text-primary:hover {
+ color: #00425a !important;
+}
+.text-secondary {
+ color: #89898e !important;
+}
+a.text-secondary:focus,
+a.text-secondary:hover {
+ color: #383a4a !important;
+}
+.text-success {
+ color: #32ba89 !important;
+}
+a.text-success:focus,
+a.text-success:hover {
+ color: #227e5d !important;
+}
+.text-info {
+ color: #0673c3 !important;
+}
+a.text-info:focus,
+a.text-info:hover {
+ color: #1e3647 !important;
+}
+.text-warning {
+ color: #8a5026 !important;
+}
+a.text-warning:focus,
+a.text-warning:hover {
+ color: #8f5227 !important;
+}
+.text-danger {
+ color: #FF5858 !important;
+}
+a.text-danger:focus,
+a.text-danger:hover {
+ color: #7f2c2c !important;
+}
+.text-light {
+ color: #747B90 !important;
+}
+a.text-light:focus,
+a.text-light:hover {
+ color: #0b0c11 !important;
+}
+.text-dark {
+ color: #babbcc !important;
+}
+a.text-dark:focus,
+a.text-dark:hover {
+ color: #6f7087 !important;
+}
+.text-body {
+ color: #9e9eab !important;
+}
+.text-muted {
+ color: #868e96 !important;
+}
+.text-black-50 {
+ color: rgba(0, 0, 0, 0.5) !important;
+}
+.text-white-50 {
+ color: rgba(255, 255, 255, 0.5) !important;
+}
+.text-hide {
+ font: 0/0 a;
+ color: transparent;
+ text-shadow: none;
+ background-color: transparent;
+ border: 0;
+}
+.text-decoration-none {
+ text-decoration: none !important;
+}
+.text-break {
+ word-break: break-word !important;
+ overflow-wrap: break-word !important;
+}
+.text-reset {
+ color: inherit !important;
+}
+.visible {
+ visibility: visible !important;
+}
+.invisible {
+ visibility: hidden !important;
+}
+@media print {
+ *,
+ ::after,
+ ::before {
+ text-shadow: none !important;
+ box-shadow: none !important;
+ }
+ a:not(.btn) {
+ text-decoration: underline;
+ }
+ abbr[title]::after {
+ content: " (" attr(title) ")";
+ }
+ pre {
+ white-space: pre-wrap !important;
+ }
+ blockquote,
+ pre {
+ border: 1px solid #adb5bd;
+ page-break-inside: avoid;
+ }
+ thead {
+ display: table-header-group;
+ }
+ img,
+ tr {
+ page-break-inside: avoid;
+ }
+ h2,
+ h3,
+ p {
+ orphans: 3;
+ widows: 3;
+ }
+ h2,
+ h3 {
+ page-break-after: avoid;
+ }
+ @page {
+ size: a3;
+ }
+ body {
+ min-width: 992px !important;
+ }
+ .container {
+ min-width: 992px !important;
+ }
+ .navbar {
+ display: none;
+ }
+ .badge {
+ border: 1px solid #000;
+ }
+ .table {
+ border-collapse: collapse !important;
+ }
+ .table td,
+ .table th {
+ background-color: #d5d5d5 !important;
+ }
+ .table-bordered td,
+ .table-bordered th {
+ border: 1px solid #dee2e6 !important;
+ }
+ .table-dark {
+ color: inherit;
+ }
+ .table-dark tbody + tbody,
+ .table-dark td,
+ .table-dark th,
+ .table-dark thead th {
+ border-color: #51536b;
+ }
+ .table .thead-dark th {
+ color: inherit;
+ border-color: #51536b;
+ }
+}
+.text-underline {
+ text-decoration: underline !important;
+}
+
+/* Base */
+.module-section {
+ border-bottom: 1px solid #000000;
+}
+
+/* Plugins manager */
+.plugin-manager {
+ background: #1a1a1a;
+}
+.plugins-header {
+ background-color: #1a1a1a !important;
+ border-bottom: 1px solid #000000 !important;
+}
+.plugins-list-header {
+ justify-content: flex-start !important;
+ padding: 1rem 1.5rem;
+ background-color: #1a1a1a !important
+}
+.plugins-list-title {
+ margin: 0 0.5rem 0 0 !important;
+ font-size: 1rem !important;
+ padding: 0 !important;
+}
+.remix-bg-opacity {
+ background: rgba(42, 42, 45, 0.8) !important;
+ padding: 9px 24px !important;
+}
+.plugins-list-group {
+ padding: 0 1rem !important;
+}
+.plugins-list-group-item {
+ padding: 0.5rem 0.5rem 0 !important;
+}
+.plugins-list-group-item:first-child {
+ border-top-left-radius: 2px;
+ border-top-right-radius: 2px;
+}
+.plugins-list-group-item:last-child {
+ border-bottom-left-radius: 2px;
+ border-bottom-right-radius: 2px;
+}
+.plugins-list-group-item + .plugins-list-group-item {
+ border-top: 1px solid #000000;
+}
+.plugin-name {
+ margin: 0;
+ font-size: 13px;
+ line-height: 16px;
+ text-transform: uppercase;
+}
+.plugin-text {
+ color: #9e9eab !important;
+}
+.plugin-version {
+ color: #9e9eab;
+ border: 1px solid #9e9eab;
+}
+.settings-button {
+ height: 32px;
+ padding: 0 12px !important;
+ font-weight: 700;
+ font-size: 12px;
+ line-height: 16px;
+}
+
+/* Deploy & Run transaction Colors */
+.run-tab i {
+ color: #8f8f8f;
+}
+.run-tab .fa-clipboard::before {
+ content: "\f0c5";
+}
+.run-recorded-section {
+ background: none;
+}
+/* Deploy & Run transaction Layout*/
+.run-tab .list-group-item {
+ background: none;
+}
+.run-instance-header {
+ margin-bottom: 0px !important;
+ background: none !important;
+ border: none !important;
+}
+.run-instance-multi-title {
+ color: #d5d5d5 !important;
+}
+.run-instance-multi-arg label {
+ color: #747B90 !important;
+}
+.run-instance-list {
+ padding: 0 !important;
+ margin: 0 !important;
+ border: 0 !important;
+ color: #aaaaaa !important;
+}
+.run-instance-list li {
+ margin: 0 !important;
+}
+
+/* Settings */
+.tokens-link {
+ color: #4DA5C5;
+}
+
+/* Theme Typography custom */
+#journal, .ace-content, .ace_editor {
+ font-family: "JetBrains Mono", monospace!important;
+}
diff --git a/apps/remix-ide/src/blockchain/execution-context.js b/apps/remix-ide/src/blockchain/execution-context.js
index 2623ab0dcf..67a3f1f28c 100644
--- a/apps/remix-ide/src/blockchain/execution-context.js
+++ b/apps/remix-ide/src/blockchain/execution-context.js
@@ -76,7 +76,6 @@ export class ExecutionContext {
if (err) name = 'Unknown'
// https://github.com/ethereum/EIPs/blob/master/EIPS/eip-155.md
else if (id === 1) name = 'Main'
- else if (id === 2) name = 'Morden (deprecated)'
else if (id === 3) name = 'Ropsten'
else if (id === 4) name = 'Rinkeby'
else if (id === 5) name = 'Goerli'
diff --git a/apps/remix-ide/src/blockchain/providers/vm.js b/apps/remix-ide/src/blockchain/providers/vm.js
index 0bc9b85d3d..b503aed6f9 100644
--- a/apps/remix-ide/src/blockchain/providers/vm.js
+++ b/apps/remix-ide/src/blockchain/providers/vm.js
@@ -20,7 +20,6 @@ class VMProvider {
this.accounts = {}
this.RemixSimulatorProvider = new Provider({ fork: this.executionContext.getCurrentFork() })
this.RemixSimulatorProvider.init()
- this.RemixSimulatorProvider.Accounts.resetAccounts()
this.web3 = new Web3(this.RemixSimulatorProvider)
extend(this.web3)
this.accounts = {}
diff --git a/apps/remix-ide/src/lib/cmdInterpreterAPI.js b/apps/remix-ide/src/lib/cmdInterpreterAPI.js
index 9c79cae25b..fc7489d998 100644
--- a/apps/remix-ide/src/lib/cmdInterpreterAPI.js
+++ b/apps/remix-ide/src/lib/cmdInterpreterAPI.js
@@ -6,7 +6,6 @@ var EventManager = require('../lib/events')
var toolTip = require('../app/ui/tooltip')
var globalRegistry = require('../global/registry')
-var SourceHighlighter = require('../app/editor/sourceHighlighter')
var GistHandler = require('./gist-handler')
class CmdInterpreterAPI {
@@ -17,7 +16,6 @@ class CmdInterpreterAPI {
self._components = {}
self._components.registry = localRegistry || globalRegistry
self._components.terminal = terminal
- self._components.sourceHighlighter = new SourceHighlighter()
self._components.fileImport = new CompilerImports()
self._components.gistHandler = new GistHandler()
self._deps = {
@@ -93,7 +91,6 @@ class CmdInterpreterAPI {
if (cb) cb()
return
}
-
self._components.terminal.commands.script(content)
}
diff --git a/apps/remix-ide/src/remixAppManager.js b/apps/remix-ide/src/remixAppManager.js
index 8f4187cc98..f834990ac5 100644
--- a/apps/remix-ide/src/remixAppManager.js
+++ b/apps/remix-ide/src/remixAppManager.js
@@ -14,7 +14,7 @@ const requiredModules = [ // services + layout views + system views
const dependentModules = ['git', 'hardhat'] // module which shouldn't be manually activated (e.g git is activated by remixd)
export function isNative (name) {
- const nativePlugins = ['vyper', 'workshops', 'debugger', 'remixd', 'menuicons', 'solidity', 'hardhat-provider']
+ const nativePlugins = ['vyper', 'workshops', 'debugger', 'remixd', 'menuicons', 'solidity', 'hardhat-provider', 'solidityStaticAnalysis', 'solidityUnitTesting']
return nativePlugins.includes(name) || requiredModules.includes(name)
}
diff --git a/apps/remix-ide/src/remixEngine.js b/apps/remix-ide/src/remixEngine.js
index e7c358e576..1ad385146b 100644
--- a/apps/remix-ide/src/remixEngine.js
+++ b/apps/remix-ide/src/remixEngine.js
@@ -13,6 +13,7 @@ export class RemixEngine extends Engine {
if (name === 'dGitProvider') return { queueTimeout: 60000 * 4 }
if (name === 'slither') return { queueTimeout: 60000 * 4 } // Requires when a solc version is installed
if (name === 'hardhat') return { queueTimeout: 60000 * 4 }
+ if (name === 'localPlugin') return { queueTimeout: 60000 * 4 }
return { queueTimeout: 10000 }
}
diff --git a/apps/solidity-compiler/src/app/app.tsx b/apps/solidity-compiler/src/app/app.tsx
index 00ce99f3d7..85e67924b8 100644
--- a/apps/solidity-compiler/src/app/app.tsx
+++ b/apps/solidity-compiler/src/app/app.tsx
@@ -6,7 +6,7 @@ import { CompilerClientApi } from './compiler'
const remix = new CompilerClientApi()
-export const App = () => {
+export const App = () => {
return (
diff --git a/apps/solidity-compiler/src/app/compiler.ts b/apps/solidity-compiler/src/app/compiler.ts
index 5a6e8eafaa..4f90fa4bd3 100644
--- a/apps/solidity-compiler/src/app/compiler.ts
+++ b/apps/solidity-compiler/src/app/compiler.ts
@@ -30,7 +30,6 @@ const defaultCompilerParameters = {
evmVersion: null, // compiler default
language: 'Solidity'
}
-
export class CompilerClientApi extends CompilerApiMixin(PluginClient) implements ICompilerApi {
constructor () {
super()
diff --git a/libs/remix-analyzer/.eslintrc b/libs/remix-analyzer/.eslintrc
index cc6cabcbcd..e27a064a6d 100644
--- a/libs/remix-analyzer/.eslintrc
+++ b/libs/remix-analyzer/.eslintrc
@@ -4,7 +4,8 @@
"@typescript-eslint/no-explicit-any": "off",
"@typescript-eslint/no-unused-vars": "off",
"no-unused-vars": "off",
- "dot-notation": "off"
+ "dot-notation": "off",
+ "no-use-before-define": "off"
},
"ignorePatterns": ["!**/*"]
}
diff --git a/libs/remix-analyzer/package.json b/libs/remix-analyzer/package.json
index c5cd096a67..17971332cc 100644
--- a/libs/remix-analyzer/package.json
+++ b/libs/remix-analyzer/package.json
@@ -1,6 +1,6 @@
{
"name": "@remix-project/remix-analyzer",
- "version": "0.5.16",
+ "version": "0.5.17",
"description": "Tool to perform static analysis on Solidity smart contracts",
"main": "src/index.js",
"types": "src/index.d.ts",
@@ -19,11 +19,11 @@
}
],
"dependencies": {
- "@ethereumjs/block": "^3.4.0",
- "@ethereumjs/tx": "^3.3.0",
- "@ethereumjs/vm": "^5.5.0",
- "@remix-project/remix-astwalker": "^0.0.37",
- "@remix-project/remix-lib": "^0.5.7",
+ "@ethereumjs/block": "^3.5.1",
+ "@ethereumjs/tx": "^3.3.2",
+ "@ethereumjs/vm": "^5.5.3",
+ "@remix-project/remix-astwalker": "^0.0.38",
+ "@remix-project/remix-lib": "^0.5.8",
"async": "^2.6.2",
"ethereumjs-util": "^7.0.10",
"ethers": "^5.4.2",
@@ -51,5 +51,5 @@
"typescript": "^3.7.5"
},
"typings": "src/index.d.ts",
- "gitHead": "4705cbc4d1761f75267992552da9db6cff2f3ed5"
+ "gitHead": "13f961dadacea374de4d79a70b1aa4acf243b18b"
}
\ No newline at end of file
diff --git a/libs/remix-astwalker/.eslintrc b/libs/remix-astwalker/.eslintrc
index 592e8bc3e9..60e5336d5c 100644
--- a/libs/remix-astwalker/.eslintrc
+++ b/libs/remix-astwalker/.eslintrc
@@ -3,7 +3,8 @@
"rules": {
"@typescript-eslint/no-explicit-any": "off",
"@typescript-eslint/prefer-namespace-keyword": "off",
- "no-unused-vars": "off"
+ "no-unused-vars": "off",
+ "no-use-before-define": "off"
},
"ignorePatterns": ["!**/*"]
}
diff --git a/libs/remix-astwalker/package.json b/libs/remix-astwalker/package.json
index fe3baecb9d..9a516b5b66 100644
--- a/libs/remix-astwalker/package.json
+++ b/libs/remix-astwalker/package.json
@@ -1,6 +1,6 @@
{
"name": "@remix-project/remix-astwalker",
- "version": "0.0.37",
+ "version": "0.0.38",
"description": "Tool to walk through Solidity AST",
"main": "src/index.js",
"scripts": {
@@ -34,10 +34,10 @@
]
},
"dependencies": {
- "@ethereumjs/block": "^3.4.0",
- "@ethereumjs/tx": "^3.3.0",
- "@ethereumjs/vm": "^5.5.0",
- "@remix-project/remix-lib": "^0.5.7",
+ "@ethereumjs/block": "^3.5.1",
+ "@ethereumjs/tx": "^3.3.2",
+ "@ethereumjs/vm": "^5.5.3",
+ "@remix-project/remix-lib": "^0.5.8",
"@types/tape": "^4.2.33",
"async": "^2.6.2",
"ethereumjs-util": "^7.0.10",
@@ -53,5 +53,5 @@
"tap-spec": "^5.0.0"
},
"typings": "src/index.d.ts",
- "gitHead": "4705cbc4d1761f75267992552da9db6cff2f3ed5"
+ "gitHead": "13f961dadacea374de4d79a70b1aa4acf243b18b"
}
\ No newline at end of file
diff --git a/libs/remix-astwalker/src/astWalker.ts b/libs/remix-astwalker/src/astWalker.ts
index d784a6f378..853ff647b5 100644
--- a/libs/remix-astwalker/src/astWalker.ts
+++ b/libs/remix-astwalker/src/astWalker.ts
@@ -39,6 +39,7 @@ export function isYulAstNode (node: Record
): boolean {
* in each case, if the event emits false it does not descend into children.
* If no event for the current type, children are visited.
*/
+// eslint-disable-next-line no-redeclare
export class AstWalker extends EventEmitter {
manageCallback (
node: AstNode,
diff --git a/libs/remix-astwalker/src/sourceMappings.ts b/libs/remix-astwalker/src/sourceMappings.ts
index 275b90f394..1246eb387b 100644
--- a/libs/remix-astwalker/src/sourceMappings.ts
+++ b/libs/remix-astwalker/src/sourceMappings.ts
@@ -58,6 +58,7 @@ export function sourceLocationFromSrc (src: string): Location {
* Routines for retrieving solc AST object(s) using some criteria, usually
* includng "src' information.
*/
+// eslint-disable-next-line no-redeclare
export class SourceMappings {
readonly source: string;
readonly lineBreaks: Array;
diff --git a/libs/remix-core-plugin/src/lib/compiler-artefacts.ts b/libs/remix-core-plugin/src/lib/compiler-artefacts.ts
index da22ffb39e..52e1c7730b 100644
--- a/libs/remix-core-plugin/src/lib/compiler-artefacts.ts
+++ b/libs/remix-core-plugin/src/lib/compiler-artefacts.ts
@@ -4,7 +4,7 @@ import { CompilerAbstract } from '@remix-project/remix-solidity'
const profile = {
name: 'compilerArtefacts',
- methods: ['get', 'addResolvedContract'],
+ methods: ['get', 'addResolvedContract', 'getCompilerAbstract'],
events: [],
version: '0.0.1'
}
diff --git a/libs/remix-debug/package.json b/libs/remix-debug/package.json
index 5be0192f86..87c7d36a42 100644
--- a/libs/remix-debug/package.json
+++ b/libs/remix-debug/package.json
@@ -1,6 +1,6 @@
{
"name": "@remix-project/remix-debug",
- "version": "0.5.7",
+ "version": "0.5.8",
"description": "Tool to debug Ethereum transactions",
"contributors": [
{
@@ -18,19 +18,24 @@
],
"main": "src/index.js",
"dependencies": {
- "@ethereumjs/block": "^3.4.0",
- "@ethereumjs/common": "^2.2.0",
- "@ethereumjs/tx": "^3.3.0",
- "@ethereumjs/vm": "^5.5.0",
- "@remix-project/remix-astwalker": "^0.0.37",
- "@remix-project/remix-lib": "^0.5.7",
- "@remix-project/remix-simulator": "^0.2.7",
+ "@ethereumjs/block": "^3.5.1",
+ "@ethereumjs/common": "^2.5.0",
+ "@ethereumjs/tx": "^3.3.2",
+ "@ethereumjs/vm": "^5.5.3",
+ "@remix-project/remix-astwalker": "^0.0.38",
+ "@remix-project/remix-lib": "^0.5.8",
+ "@remix-project/remix-simulator": "^0.2.8",
+ "ansi-gray": "^0.1.1",
"async": "^2.6.2",
+ "color-support": "^1.1.3",
"commander": "^2.19.0",
"deep-equal": "^1.0.1",
"ethereumjs-util": "^7.0.10",
"ethers": "^5.4.2",
+ "express-ws": "^4.0.0",
+ "merge": "^2.1.1",
"string-similarity": "^4.0.4",
+ "time-stamp": "^2.2.0",
"web3": "^1.5.1"
},
"devDependencies": {
@@ -62,5 +67,5 @@
},
"homepage": "https://github.com/ethereum/remix-project/tree/master/libs/remix-debug#readme",
"typings": "src/index.d.ts",
- "gitHead": "4705cbc4d1761f75267992552da9db6cff2f3ed5"
+ "gitHead": "13f961dadacea374de4d79a70b1aa4acf243b18b"
}
\ No newline at end of file
diff --git a/libs/remix-lib/.eslintrc b/libs/remix-lib/.eslintrc
index 6da901f7e1..6ee9d5e4a6 100644
--- a/libs/remix-lib/.eslintrc
+++ b/libs/remix-lib/.eslintrc
@@ -3,7 +3,8 @@
"rules": {
"standard/no-callback-literal": "off",
"no-unused-vars": "off",
- "dot-notation": "off"
+ "dot-notation": "off",
+ "no-use-before-define": "off"
},
"env": {
"browser": true,
diff --git a/libs/remix-lib/package.json b/libs/remix-lib/package.json
index 5b25ecd191..a0ccdef497 100644
--- a/libs/remix-lib/package.json
+++ b/libs/remix-lib/package.json
@@ -1,6 +1,6 @@
{
"name": "@remix-project/remix-lib",
- "version": "0.5.7",
+ "version": "0.5.8",
"description": "Library to various Remix tools",
"contributors": [
{
@@ -14,12 +14,13 @@
],
"main": "src/index.js",
"dependencies": {
- "@ethereumjs/block": "^3.4.0",
- "@ethereumjs/tx": "^3.3.0",
- "@ethereumjs/vm": "^5.5.0",
+ "@ethereumjs/block": "^3.5.1",
+ "@ethereumjs/tx": "^3.3.2",
+ "@ethereumjs/vm": "^5.5.3",
"async": "^2.1.2",
"ethereumjs-util": "^7.0.10",
"ethers": "^4.0.40",
+ "ethjs-util": "^0.1.6",
"events": "^3.0.0",
"solc": "^0.7.4",
"string-similarity": "^4.0.4",
@@ -53,5 +54,5 @@
},
"homepage": "https://github.com/ethereum/remix-project/tree/master/libs/remix-lib#readme",
"typings": "src/index.d.ts",
- "gitHead": "4705cbc4d1761f75267992552da9db6cff2f3ed5"
+ "gitHead": "13f961dadacea374de4d79a70b1aa4acf243b18b"
}
\ No newline at end of file
diff --git a/libs/remix-lib/src/web3Provider/web3VmProvider.ts b/libs/remix-lib/src/web3Provider/web3VmProvider.ts
index a431507687..f29e225e5a 100644
--- a/libs/remix-lib/src/web3Provider/web3VmProvider.ts
+++ b/libs/remix-lib/src/web3Provider/web3VmProvider.ts
@@ -129,11 +129,7 @@ export class Web3VmProvider {
this.storageCache[this.processingHash] = {}
if (data.to) {
try {
- // dumpStorage throws error as 'Missing Node in DB'
- // This can be uncommented once that error is handled
- // https://github.com/ethereum/remix-project/issues/1644
- // const storage = await this.vm.stateManager.dumpStorage(data.to)
- const storage = {}
+ const storage = await this.vm.stateManager.dumpStorage(data.to)
this.storageCache[this.processingHash][tx['to']] = storage
this.lastProcessedStorageTxHash[tx['to']] = this.processingHash
} catch (e) {
@@ -249,11 +245,7 @@ export class Web3VmProvider {
if (!this.storageCache[this.processingHash][this.processingAddress]) {
const account = Address.fromString(this.processingAddress)
try {
- // dumpStorage throws error as 'Missing Node in DB'
- // This can be uncommented once that error is handled
- // https://github.com/ethereum/remix-project/issues/1644
- // const storage = await this.vm.stateManager.dumpStorage(account)
- const storage = {}
+ const storage = await this.vm.stateManager.dumpStorage(account)
this.storageCache[this.processingHash][this.processingAddress] = storage
this.lastProcessedStorageTxHash[this.processingAddress] = this.processingHash
} catch (e) {
diff --git a/libs/remix-simulator/package.json b/libs/remix-simulator/package.json
index 891cc3bad6..2cfe77d521 100644
--- a/libs/remix-simulator/package.json
+++ b/libs/remix-simulator/package.json
@@ -1,6 +1,6 @@
{
"name": "@remix-project/remix-simulator",
- "version": "0.2.7",
+ "version": "0.2.8",
"description": "Ethereum IDE and tools for the web",
"contributors": [
{
@@ -14,11 +14,11 @@
],
"main": "src/index.js",
"dependencies": {
- "@ethereumjs/block": "^3.4.0",
- "@ethereumjs/common": "^2.2.0",
- "@ethereumjs/tx": "^3.3.0",
- "@ethereumjs/vm": "^5.5.0",
- "@remix-project/remix-lib": "^0.5.7",
+ "@ethereumjs/block": "^3.5.1",
+ "@ethereumjs/common": "^2.5.0",
+ "@ethereumjs/tx": "^3.3.2",
+ "@ethereumjs/vm": "^5.5.3",
+ "@remix-project/remix-lib": "^0.5.8",
"ansi-gray": "^0.1.1",
"async": "^3.1.0",
"body-parser": "^1.18.2",
@@ -66,5 +66,5 @@
},
"homepage": "https://github.com/ethereum/remix-project/tree/master/libs/remix-simulator#readme",
"typings": "src/index.d.ts",
- "gitHead": "4705cbc4d1761f75267992552da9db6cff2f3ed5"
+ "gitHead": "13f961dadacea374de4d79a70b1aa4acf243b18b"
}
\ No newline at end of file
diff --git a/libs/remix-simulator/test/blocks.ts b/libs/remix-simulator/test/blocks.ts
index e415bb6a14..47e7f8ba9e 100644
--- a/libs/remix-simulator/test/blocks.ts
+++ b/libs/remix-simulator/test/blocks.ts
@@ -115,8 +115,6 @@ describe('blocks', () => {
assert.deepEqual(numberTransactions, correctBlock.uncles.length)
})
})
-
- /*
describe('eth_getStorageAt', () => {
it('should get storage at position at given address', async () => {
const abi: any = [
@@ -201,30 +199,28 @@ describe('blocks', () => {
}
]
- // const code = '0x608060405234801561001057600080fd5b506040516020806102018339810180604052602081101561003057600080fd5b810190808051906020019092919050505080600081905550506101a9806100586000396000f3fe60806040526004361061005c576000357c0100000000000000000000000000000000000000000000000000000000900480632a1afcd91461006157806360fe47b11461008c5780636d4ce63c146100c7578063ce01e1ec146100f2575b600080fd5b34801561006d57600080fd5b5061007661012d565b6040518082815260200191505060405180910390f35b34801561009857600080fd5b506100c5600480360360208110156100af57600080fd5b8101908080359060200190929190505050610133565b005b3480156100d357600080fd5b506100dc61013d565b6040518082815260200191505060405180910390f35b3480156100fe57600080fd5b5061012b6004803603602081101561011557600080fd5b8101908080359060200190929190505050610146565b005b60005481565b8060008190555050565b60008054905090565b80600081905550807f63a242a632efe33c0e210e04e4173612a17efa4f16aa4890bc7e46caece80de060405160405180910390a25056fea165627a7a7230582063160eb16dc361092a85ced1a773eed0b63738b83bea1e1c51cf066fa90e135d0029'
+ const code = '0x608060405234801561001057600080fd5b506040516020806102018339810180604052602081101561003057600080fd5b810190808051906020019092919050505080600081905550506101a9806100586000396000f3fe60806040526004361061005c576000357c0100000000000000000000000000000000000000000000000000000000900480632a1afcd91461006157806360fe47b11461008c5780636d4ce63c146100c7578063ce01e1ec146100f2575b600080fd5b34801561006d57600080fd5b5061007661012d565b6040518082815260200191505060405180910390f35b34801561009857600080fd5b506100c5600480360360208110156100af57600080fd5b8101908080359060200190929190505050610133565b005b3480156100d357600080fd5b506100dc61013d565b6040518082815260200191505060405180910390f35b3480156100fe57600080fd5b5061012b6004803603602081101561011557600080fd5b8101908080359060200190929190505050610146565b005b60005481565b8060008190555050565b60008054905090565b80600081905550807f63a242a632efe33c0e210e04e4173612a17efa4f16aa4890bc7e46caece80de060405160405180910390a25056fea165627a7a7230582063160eb16dc361092a85ced1a773eed0b63738b83bea1e1c51cf066fa90e135d0029'
- // const contract = new web3.eth.Contract(abi)
- // const accounts = await web3.eth.getAccounts()
+ const contract = new web3.eth.Contract(abi)
+ const accounts = await web3.eth.getAccounts()
- // const contractInstance: any = await contract.deploy({ data: code, arguments: [100] }).send({ from: accounts[0], gas: 400000 })
- // contractInstance.currentProvider = web3.eth.currentProvider
- // contractInstance.givenProvider = web3.eth.currentProvider
+ const contractInstance: any = await contract.deploy({ data: code, arguments: [100] }).send({ from: accounts[0], gas: 400000 })
+ contractInstance.currentProvider = web3.eth.currentProvider
+ contractInstance.givenProvider = web3.eth.currentProvider
- // await contractInstance.methods.set(100).send({ from: accounts[0].toLowerCase(), gas: 400000 })
- // let storage = await web3.eth.getStorageAt(contractInstance.options.address, 0)
- // assert.deepEqual(storage, '0x64')
+ await contractInstance.methods.set(100).send({ from: accounts[0].toLowerCase(), gas: 400000 })
+ let storage = await web3.eth.getStorageAt(contractInstance.options.address, 0)
+ assert.deepEqual(storage, '0x64')
- // await contractInstance.methods.set(200).send({ from: accounts[0], gas: 400000 })
- // storage = await web3.eth.getStorageAt(contractInstance.options.address, 0)
- // assert.deepEqual(storage, '0x64')
+ await contractInstance.methods.set(200).send({ from: accounts[0], gas: 400000 })
+ storage = await web3.eth.getStorageAt(contractInstance.options.address, 0)
+ assert.deepEqual(storage, '0x64')
await contractInstance.methods.set(200).send({ from: accounts[0], gas: 400000 })
storage = await web3.eth.getStorageAt(contractInstance.options.address, 0)
assert.deepEqual(storage, '0xc8')
})
})
- */
-
describe('eth_call', () => {
it('should get a value', async () => {
const abi: any = [
diff --git a/libs/remix-solidity/.eslintrc b/libs/remix-solidity/.eslintrc
index 35c51f7ae7..f57f93144e 100644
--- a/libs/remix-solidity/.eslintrc
+++ b/libs/remix-solidity/.eslintrc
@@ -2,7 +2,8 @@
"extends": "../../.eslintrc",
"rules": {
"dot-notation": "off",
- "no-unused-vars": "off"
+ "no-unused-vars": "off",
+ "no-use-before-define": "off"
},
"env": {
"browser": true,
diff --git a/libs/remix-solidity/package.json b/libs/remix-solidity/package.json
index 50ee1074a5..82a372bd90 100644
--- a/libs/remix-solidity/package.json
+++ b/libs/remix-solidity/package.json
@@ -1,6 +1,6 @@
{
"name": "@remix-project/remix-solidity",
- "version": "0.4.7",
+ "version": "0.4.8",
"description": "Tool to load and run Solidity compiler",
"main": "src/index.js",
"types": "src/index.d.ts",
@@ -15,10 +15,10 @@
}
],
"dependencies": {
- "@ethereumjs/block": "^3.4.0",
- "@ethereumjs/tx": "^3.3.0",
- "@ethereumjs/vm": "^5.5.0",
- "@remix-project/remix-lib": "^0.5.7",
+ "@ethereumjs/block": "^3.5.1",
+ "@ethereumjs/tx": "^3.3.2",
+ "@ethereumjs/vm": "^5.5.3",
+ "@remix-project/remix-lib": "^0.5.8",
"async": "^2.6.2",
"eslint-scope": "^5.0.0",
"ethereumjs-util": "^7.0.10",
@@ -61,5 +61,5 @@
},
"homepage": "https://github.com/ethereum/remix-project/tree/master/libs/remix-solidity#readme",
"typings": "src/index.d.ts",
- "gitHead": "4705cbc4d1761f75267992552da9db6cff2f3ed5"
+ "gitHead": "13f961dadacea374de4d79a70b1aa4acf243b18b"
}
\ No newline at end of file
diff --git a/libs/remix-solidity/src/compiler/types.ts b/libs/remix-solidity/src/compiler/types.ts
index 75091f366b..14751cfabc 100644
--- a/libs/remix-solidity/src/compiler/types.ts
+++ b/libs/remix-solidity/src/compiler/types.ts
@@ -150,7 +150,7 @@ export interface CompilerInputOptions {
language?: Language
}
-export type EVMVersion = 'homestead' | 'tangerineWhistle' | 'spuriousDragon' | 'byzantium' | 'constantinople' | 'petersburg' | 'istanbul' | 'muirGlacier' | 'berlin' | 'london' | null
+export type EVMVersion = 'homestead' | 'tangerineWhistle' | 'spuriousDragon' | 'byzantium' | 'constantinople' | 'petersburg' | 'istanbul' | 'berlin' | 'london' | null
export type Language = 'Solidity' | 'Yul'
diff --git a/libs/remix-tests/.eslintrc b/libs/remix-tests/.eslintrc
index 35c51f7ae7..f57f93144e 100644
--- a/libs/remix-tests/.eslintrc
+++ b/libs/remix-tests/.eslintrc
@@ -2,7 +2,8 @@
"extends": "../../.eslintrc",
"rules": {
"dot-notation": "off",
- "no-unused-vars": "off"
+ "no-unused-vars": "off",
+ "no-use-before-define": "off"
},
"env": {
"browser": true,
diff --git a/libs/remix-tests/jest.config.js b/libs/remix-tests/jest.config.js
index 0f08d413b7..6e6de8df08 100644
--- a/libs/remix-tests/jest.config.js
+++ b/libs/remix-tests/jest.config.js
@@ -6,7 +6,7 @@ module.exports = {
transform: {
'^.+\\.[tj]sx?$': 'ts-jest',
},
- transformIgnorePatterns: ["/node_modules/", "\\.pnp\\.[^\\\/]+$"],
+ transformIgnorePatterns: ["/node_modules/", "/dist/", "\\.pnp\\.[^\\\/]+$"],
rootDir: "./",
testTimeout: 40000,
moduleFileExtensions: ['ts', 'tsx', 'js', 'jsx', 'html', 'json'],
diff --git a/libs/remix-tests/package.json b/libs/remix-tests/package.json
index 990ad5a6a1..ef6999ad0e 100644
--- a/libs/remix-tests/package.json
+++ b/libs/remix-tests/package.json
@@ -1,6 +1,6 @@
{
"name": "@remix-project/remix-tests",
- "version": "0.2.7",
+ "version": "0.2.8",
"description": "Tool to test Solidity smart contracts",
"main": "src/index.js",
"types": "./src/index.d.ts",
@@ -35,13 +35,13 @@
},
"homepage": "https://github.com/ethereum/remix-project/tree/master/libs/remix-tests#readme",
"dependencies": {
- "@ethereumjs/block": "^3.4.0",
- "@ethereumjs/common": "^2.2.0",
- "@ethereumjs/tx": "^3.3.0",
- "@ethereumjs/vm": "^5.5.0",
- "@remix-project/remix-lib": "^0.5.7",
- "@remix-project/remix-simulator": "^0.2.7",
- "@remix-project/remix-solidity": "^0.4.7",
+ "@ethereumjs/block": "^3.5.1",
+ "@ethereumjs/common": "^2.5.0",
+ "@ethereumjs/tx": "^3.3.2",
+ "@ethereumjs/vm": "^5.5.3",
+ "@remix-project/remix-lib": "^0.5.8",
+ "@remix-project/remix-simulator": "^0.2.8",
+ "@remix-project/remix-solidity": "^0.4.8",
"ansi-gray": "^0.1.1",
"async": "^2.6.0",
"axios": ">=0.21.1",
@@ -77,5 +77,5 @@
"typescript": "^3.3.1"
},
"typings": "src/index.d.ts",
- "gitHead": "4705cbc4d1761f75267992552da9db6cff2f3ed5"
+ "gitHead": "13f961dadacea374de4d79a70b1aa4acf243b18b"
}
\ No newline at end of file
diff --git a/libs/remix-tests/src/compiler.ts b/libs/remix-tests/src/compiler.ts
index e77fdcdcfc..e15bb656e4 100644
--- a/libs/remix-tests/src/compiler.ts
+++ b/libs/remix-tests/src/compiler.ts
@@ -171,8 +171,9 @@ export function compileFileOrFiles (filename: string, isDirectory: boolean, opts
* @param cb Callback
*/
export function compileContractSources (sources: SrcIfc, compilerConfig: CompilerConfiguration, importFileCb: any, opts: any, cb): void {
- let compiler, filepath: string
+ let compiler
const accounts: string[] = opts.accounts || []
+ const filepath = opts.testFilePath || ''
// Iterate over sources keys. Inject test libraries. Inject test library import statements.
if (!('remix_tests.sol' in sources) && !('tests.sol' in sources)) {
sources['tests.sol'] = { content: require('../sol/tests.sol.js') }
diff --git a/libs/remix-tests/src/deployer.ts b/libs/remix-tests/src/deployer.ts
index aeefac3faa..d700b08de5 100644
--- a/libs/remix-tests/src/deployer.ts
+++ b/libs/remix-tests/src/deployer.ts
@@ -11,7 +11,7 @@ import { compilationInterface } from './types'
* @param callback Callback
*/
-export function deployAll (compileResult: compilationInterface, web3: Web3, withDoubleGas: boolean, callback) {
+export function deployAll (compileResult: compilationInterface, web3: Web3, withDoubleGas: boolean, deployCb, callback) {
const compiledObject = {}
const contracts = {}
let accounts: string[] = []
@@ -70,7 +70,7 @@ export function deployAll (compileResult: compilationInterface, web3: Web3, with
deployObject.send({
from: accounts[0],
gas: gas
- }).on('receipt', function (receipt) {
+ }).on('receipt', async function (receipt) {
contractObject.options.address = receipt.contractAddress
contractObject.options.from = accounts[0]
contractObject.options.gas = 5000 * 1000
@@ -79,6 +79,7 @@ export function deployAll (compileResult: compilationInterface, web3: Web3, with
contracts[contractName] = contractObject
contracts[contractName].filename = filename
+ if (deployCb) await deployCb(filename, receipt.contractAddress)
callback(null, { receipt: { contractAddress: receipt.contractAddress } }) // TODO this will only work with JavaScriptV VM
}).on('error', function (err) {
console.error(err)
diff --git a/libs/remix-tests/src/run.ts b/libs/remix-tests/src/run.ts
index 062016312b..8228ced38b 100644
--- a/libs/remix-tests/src/run.ts
+++ b/libs/remix-tests/src/run.ts
@@ -81,8 +81,8 @@ commander
const compVersion = commander.compiler
const baseURL = 'https://binaries.soliditylang.org/wasm/'
const response: AxiosResponse = await axios.get(baseURL + 'list.json')
- const { releases, latestRelease } = response.data
- const compString = releases[compVersion]
+ const { releases, latestRelease } = response.data as { releases: string[], latestRelease: string }
+ const compString = releases ? releases[compVersion] : null
if (!compString) {
log.error(`No compiler found in releases with version ${compVersion}`)
process.exit()
diff --git a/libs/remix-tests/src/runTestFiles.ts b/libs/remix-tests/src/runTestFiles.ts
index b447452f22..d9ed0c2b6e 100644
--- a/libs/remix-tests/src/runTestFiles.ts
+++ b/libs/remix-tests/src/runTestFiles.ts
@@ -61,13 +61,13 @@ export function runTestFiles (filepath: string, isDirectory: boolean, web3: Web3
for (const filename in asts) {
if (filename.endsWith('_test.sol')) { sourceASTs[filename] = asts[filename].ast }
}
- deployAll(compilationResult, web3, false, (err, contracts) => {
+ deployAll(compilationResult, web3, false, null, (err, contracts) => {
if (err) {
// If contract deployment fails because of 'Out of Gas' error, try again with double gas
// This is temporary, should be removed when remix-tests will have a dedicated UI to
// accept deployment params from UI
if (err.message.includes('The contract code couldn\'t be stored, please check your gas limit')) {
- deployAll(compilationResult, web3, true, (error, contracts) => {
+ deployAll(compilationResult, web3, true, null, (error, contracts) => {
if (error) next([{ message: 'contract deployment failed after trying twice: ' + error.message, severity: 'error' }]) // IDE expects errors in array
else next(null, compilationResult, contracts)
})
diff --git a/libs/remix-tests/src/runTestSources.ts b/libs/remix-tests/src/runTestSources.ts
index 4894b713eb..ecc35aa3f2 100644
--- a/libs/remix-tests/src/runTestSources.ts
+++ b/libs/remix-tests/src/runTestSources.ts
@@ -39,7 +39,7 @@ export class UnitTestRunner {
* @param importFileCb Import file callback
* @param opts Options
*/
- async runTestSources (contractSources: SrcIfc, compilerConfig: CompilerConfiguration, testCallback, resultCallback, finalCallback: any, importFileCb, opts: Options) {
+ async runTestSources (contractSources: SrcIfc, compilerConfig: CompilerConfiguration, testCallback, resultCallback, deployCb:any, finalCallback: any, importFileCb, opts: Options) {
opts = opts || {}
const sourceASTs: any = {}
const web3 = opts.web3 || await this.createWeb3Provider()
@@ -53,19 +53,19 @@ export class UnitTestRunner {
})
},
(next) => {
- compileContractSources(contractSources, compilerConfig, importFileCb, { accounts, event: this.event }, next)
+ compileContractSources(contractSources, compilerConfig, importFileCb, { accounts, testFilePath: opts.testFilePath, event: this.event }, next)
},
function deployAllContracts (compilationResult: compilationInterface, asts: ASTInterface, next) {
for (const filename in asts) {
if (filename.endsWith('_test.sol')) { sourceASTs[filename] = asts[filename].ast }
}
- deployAll(compilationResult, web3, false, (err, contracts) => {
+ deployAll(compilationResult, web3, false, deployCb, (err, contracts) => {
if (err) {
// If contract deployment fails because of 'Out of Gas' error, try again with double gas
// This is temporary, should be removed when remix-tests will have a dedicated UI to
// accept deployment params from UI
if (err.message.includes('The contract code couldn\'t be stored, please check your gas limit')) {
- deployAll(compilationResult, web3, true, (error, contracts) => {
+ deployAll(compilationResult, web3, true, deployCb, (error, contracts) => {
if (error) next([{ message: 'contract deployment failed after trying twice: ' + error.message, severity: 'error' }]) // IDE expects errors in array
else next(null, compilationResult, contracts)
})
diff --git a/libs/remix-tests/src/testRunner.ts b/libs/remix-tests/src/testRunner.ts
index c3b59480d0..fe5014d2f9 100644
--- a/libs/remix-tests/src/testRunner.ts
+++ b/libs/remix-tests/src/testRunner.ts
@@ -244,6 +244,7 @@ export function runTest (testName: string, testObject: any, contractDetails: Com
if (func.inputs && func.inputs.length > 0) { return resultsCallback(new Error(`Method '${func.name}' can not have parameters inside a test contract`), { passingNum, failureNum, timePassed }) }
const method = testObject.methods[func.name].apply(testObject.methods[func.name], [])
const startTime = Date.now()
+ let debugTxHash:string
if (func.constant) {
sendParams = {}
const tagTimestamp = 'remix_tests_tag' + Date.now()
@@ -251,18 +252,20 @@ export function runTest (testName: string, testObject: any, contractDetails: Com
method.call(sendParams).then(async (result) => {
const time = (Date.now() - startTime) / 1000.0
let tagTxHash
- let hhLogs
if (web3.eth && web3.eth.getHashFromTagBySimulator) tagTxHash = await web3.eth.getHashFromTagBySimulator(tagTimestamp)
if (web3.eth && web3.eth.getHHLogsForTx) hhLogs = await web3.eth.getHHLogsForTx(tagTxHash)
+ debugTxHash = tagTxHash
if (result) {
const resp: TestResultInterface = {
type: 'testPass',
value: changeCase.sentenceCase(func.name),
filename: testObject.filename,
time: time,
- context: testName
+ context: testName,
+ web3,
+ debugTxHash
}
- if (hhLogs) resp.hhLogs = hhLogs
+ if (hhLogs && hhLogs.length) resp.hhLogs = hhLogs
testCallback(undefined, resp)
passingNum += 1
timePassed += time
@@ -273,9 +276,11 @@ export function runTest (testName: string, testObject: any, contractDetails: Com
filename: testObject.filename,
time: time,
errMsg: 'function returned false',
- context: testName
+ context: testName,
+ web3,
+ debugTxHash
}
- if (hhLogs) resp.hhLogs = hhLogs
+ if (hhLogs && hhLogs.length) resp.hhLogs = hhLogs
testCallback(undefined, resp)
failureNum += 1
timePassed += time
@@ -294,6 +299,7 @@ export function runTest (testName: string, testObject: any, contractDetails: Com
sendParams.gas = 10000000 * 8
method.send(sendParams).on('receipt', async (receipt) => {
try {
+ debugTxHash = receipt.transactionHash
if (web3.eth && web3.eth.getHHLogsForTx) hhLogs = await web3.eth.getHHLogsForTx(receipt.transactionHash)
const time: number = (Date.now() - startTime) / 1000.0
const assertionEventHashes = assertionEvents.map(e => Web3.utils.sha3(e.name + '(' + e.params.join() + ')'))
@@ -323,9 +329,10 @@ export function runTest (testName: string, testObject: any, contractDetails: Com
returned: testEvent[3],
expected: testEvent[4],
location,
- web3
+ web3,
+ debugTxHash
}
- if (hhLogs) resp.hhLogs = hhLogs
+ if (hhLogs && hhLogs.length) resp.hhLogs = hhLogs
testCallback(undefined, resp)
failureNum += 1
timePassed += time
@@ -342,13 +349,15 @@ export function runTest (testName: string, testObject: any, contractDetails: Com
value: changeCase.sentenceCase(func.name),
filename: testObject.filename,
time: time,
- context: testName
+ context: testName,
+ web3,
+ debugTxHash
}
- if (hhLogs) resp.hhLogs = hhLogs
+ if (hhLogs && hhLogs.length) resp.hhLogs = hhLogs
testCallback(undefined, resp)
passingNum += 1
timePassed += time
- } else if (hhLogs) {
+ } else if (hhLogs && hhLogs.length) {
const resp: TestResultInterface = {
type: 'logOnly',
value: changeCase.sentenceCase(func.name),
@@ -380,7 +389,8 @@ export function runTest (testName: string, testObject: any, contractDetails: Com
if (err.message.includes('Transaction has been reverted by the EVM')) {
const txHash = JSON.parse(err.message.replace('Transaction has been reverted by the EVM:', '')).transactionHash
if (web3.eth && web3.eth.getHHLogsForTx) hhLogs = await web3.eth.getHHLogsForTx(txHash)
- if (hhLogs) resp.hhLogs = hhLogs
+ if (hhLogs && hhLogs.length) resp.hhLogs = hhLogs
+ resp.debugTxHash = txHash
}
testCallback(undefined, resp)
failureNum += 1
diff --git a/libs/remix-tests/src/types.ts b/libs/remix-tests/src/types.ts
index b0d4145dbf..fb03e94887 100644
--- a/libs/remix-tests/src/types.ts
+++ b/libs/remix-tests/src/types.ts
@@ -38,6 +38,7 @@ export interface TestResultInterface {
location?: string
hhLogs?: []
web3?: any
+ debugTxHash?: string
}
export interface TestCbInterface {
(error: Error | null | undefined, result: TestResultInterface) : void;
@@ -48,6 +49,7 @@ export interface ResultCbInterface {
export interface Options {
accounts?: string[] | null,
+ testFilePath?: string
web3?: any
}
@@ -58,13 +60,12 @@ export interface CompilerConfiguration {
usingWorker?: boolean,
runs: number
}
-
export interface CompilationErrors {
name: string,
errors: Array,
message: string
}
-
+// eslint-disable-next-line no-redeclare
export class CompilationErrors extends Error {
constructor (errors: Array) {
const mapError = errors.map((e) => { return e.formattedMessage || e.message })
diff --git a/libs/remix-tests/tests/examples_0/assert_ok_without_console_test.sol b/libs/remix-tests/tests/examples_0/assert_ok_without_console_test.sol
new file mode 100644
index 0000000000..030552b16a
--- /dev/null
+++ b/libs/remix-tests/tests/examples_0/assert_ok_without_console_test.sol
@@ -0,0 +1,12 @@
+import "remix_tests.sol"; // this import is automatically injected by Remix.
+
+contract AssertOkTest {
+
+ function okPassTest() public {
+ Assert.ok(true, "okPassTest passes");
+ }
+
+ function okFailTest() public {
+ Assert.ok(false, "okFailTest fails");
+ }
+}
\ No newline at end of file
diff --git a/libs/remix-tests/tests/testRunner.cli.spec_disabled.ts b/libs/remix-tests/tests/testRunner.cli.spec.ts
similarity index 91%
rename from libs/remix-tests/tests/testRunner.cli.spec_disabled.ts
rename to libs/remix-tests/tests/testRunner.cli.spec.ts
index 91174355af..496f6f4936 100644
--- a/libs/remix-tests/tests/testRunner.cli.spec_disabled.ts
+++ b/libs/remix-tests/tests/testRunner.cli.spec.ts
@@ -10,7 +10,9 @@ describe('testRunner: remix-tests CLI', () => {
if(result) {
const dirContent = result.stdout.toString()
// Install dependencies if 'node_modules' is not already present
- if(!dirContent.includes('node_modules')) execSync('npm install', { cwd: resolve(__dirname + '/../../../dist/libs/remix-tests') })
+ if(!dirContent.includes('node_modules')) {
+ execSync('npm install', { cwd: resolve(__dirname + '/../../../dist/libs/remix-tests') })
+ }
}
@@ -40,7 +42,7 @@ Commands:
})
test('remix-tests running a test file', () => {
- const res = spawnSync(executablePath, [resolve(__dirname + '/examples_0/assert_ok_test.sol')])
+ const res = spawnSync(executablePath, [resolve(__dirname + '/examples_0/assert_ok_without_console_test.sol')])
// match initial lines
expect(res.stdout.toString().trim()).toMatch(/:: Running remix-tests - Unit testing for solidity ::/)
expect(res.stdout.toString().trim()).toMatch(/creation of library remix_tests.sol:Assert pending.../)
@@ -55,7 +57,7 @@ Commands:
})
test('remix-tests running a test file with custom compiler version', () => {
- const res = spawnSync(executablePath, ['--compiler', '0.7.4', resolve(__dirname + '/examples_0/assert_ok_test.sol')])
+ const res = spawnSync(executablePath, ['--compiler', '0.7.4', resolve(__dirname + '/examples_0/assert_ok_without_console_test.sol')])
// match initial lines
expect(res.stdout.toString().trim().includes('Compiler version set to 0.7.4. Latest version is')).toBeTruthy()
expect(res.stdout.toString().trim().includes('Loading remote solc version v0.7.4+commit.3f05b770 ...')).toBeTruthy()
@@ -69,13 +71,13 @@ Commands:
})
test('remix-tests running a test file with unavailable custom compiler version (should fail)', () => {
- const res = spawnSync(executablePath, ['--compiler', '1.10.4', resolve(__dirname + '/examples_0/assert_ok_test.sol')])
+ const res = spawnSync(executablePath, ['--compiler', '1.10.4', resolve(__dirname + '/examples_0/assert_ok_without_console_test.sol')])
// match initial lines
expect(res.stdout.toString().trim().includes('No compiler found in releases with version 1.10.4')).toBeTruthy()
})
test('remix-tests running a test file with custom EVM', () => {
- const res = spawnSync(executablePath, ['--evm', 'petersburg', resolve(__dirname + '/examples_0/assert_ok_test.sol')])
+ const res = spawnSync(executablePath, ['--evm', 'petersburg', resolve(__dirname + '/examples_0/assert_ok_without_console_test.sol')])
// match initial lines
expect(res.stdout.toString().trim().includes('EVM set to petersburg')).toBeTruthy()
expect(res.stdout.toString().trim()).toMatch(/:: Running remix-tests - Unit testing for solidity ::/)
@@ -88,7 +90,7 @@ Commands:
})
test('remix-tests running a test file by enabling optimization', () => {
- const res = spawnSync(executablePath, ['--optimize', 'true', resolve(__dirname + '/examples_0/assert_ok_test.sol')])
+ const res = spawnSync(executablePath, ['--optimize', 'true', resolve(__dirname + '/examples_0/assert_ok_without_console_test.sol')])
// match initial lines
expect(res.stdout.toString().trim().includes('Optimization is enabled')).toBeTruthy()
expect(res.stdout.toString().trim()).toMatch(/:: Running remix-tests - Unit testing for solidity ::/)
@@ -101,7 +103,7 @@ Commands:
})
test('remix-tests running a test file by enabling optimization and setting runs', () => {
- const res = spawnSync(executablePath, ['--optimize', 'true', '--runs', '300', resolve(__dirname + '/examples_0/assert_ok_test.sol')])
+ const res = spawnSync(executablePath, ['--optimize', 'true', '--runs', '300', resolve(__dirname + '/examples_0/assert_ok_without_console_test.sol')])
// match initial lines
expect(res.stdout.toString().trim().includes('Optimization is enabled')).toBeTruthy()
expect(res.stdout.toString().trim().includes('Runs set to 300')).toBeTruthy()
@@ -115,13 +117,13 @@ Commands:
})
test('remix-tests running a test file without enabling optimization and setting runs (should fail)', () => {
- const res = spawnSync(executablePath, ['--runs', '300', resolve(__dirname + '/examples_0/assert_ok_test.sol')])
+ const res = spawnSync(executablePath, ['--runs', '300', resolve(__dirname + '/examples_0/assert_ok_without_console_test.sol')])
// match initial lines
expect(res.stdout.toString().trim().includes('Optimization should be enabled for runs')).toBeTruthy()
})
test('remix-tests running a test file with all options', () => {
- const res = spawnSync(executablePath, ['--compiler', '0.7.5', '--evm', 'istanbul', '--optimize', 'true', '--runs', '250', resolve(__dirname + '/examples_0/assert_ok_test.sol')])
+ const res = spawnSync(executablePath, ['--compiler', '0.7.5', '--evm', 'istanbul', '--optimize', 'true', '--runs', '250', resolve(__dirname + '/examples_0/assert_ok_without_console_test.sol')])
// match initial lines
expect(res.stdout.toString().trim().includes('Compiler version set to 0.7.5. Latest version is')).toBeTruthy()
expect(res.stdout.toString().trim().includes('Loading remote solc version v0.7.5+commit.eb77ed08 ...')).toBeTruthy()
diff --git a/libs/remix-tests/tests/testRunner.spec.ts b/libs/remix-tests/tests/testRunner.spec.ts
index 351daf23f4..928491faa5 100644
--- a/libs/remix-tests/tests/testRunner.spec.ts
+++ b/libs/remix-tests/tests/testRunner.spec.ts
@@ -67,7 +67,7 @@ async function compileAndDeploy(filename: string, callback: Function) {
}
try {
compilationData = compilationResult
- deployAll(compilationResult, web3, false, next)
+ deployAll(compilationResult, web3, false, null, next)
} catch (e) {
throw e
}
@@ -128,8 +128,8 @@ describe('testRunner', () => {
deepEqualExcluding(tests, [
{ type: 'accountList', value: accounts },
{ type: 'contract', value: 'AssertOkTest', filename: __dirname + '/examples_0/assert_ok_test.sol' },
- { type: 'testPass', value: 'Ok pass test', filename: __dirname + '/examples_0/assert_ok_test.sol', context: 'AssertOkTest', hhLogs: hhLogs1 },
- { type: 'testFailure', value: 'Ok fail test', filename: __dirname + '/examples_0/assert_ok_test.sol', errMsg: 'okFailTest fails', context: 'AssertOkTest', hhLogs: hhLogs2, assertMethod: 'ok', location: '370:36:0', expected: 'true', returned: 'false'},
+ { type: 'testPass', debugTxHash: '0x5b665752a4faf83229259b9b2811d3295be0af633b0051d4b90042283ef55707', value: 'Ok pass test', filename: __dirname + '/examples_0/assert_ok_test.sol', context: 'AssertOkTest', hhLogs: hhLogs1 },
+ { type: 'testFailure', debugTxHash: '0xa0a30ad042a7fc3495f72be7ba788d705888ffbbec7173f60bb27e07721510f2',value: 'Ok fail test', filename: __dirname + '/examples_0/assert_ok_test.sol', errMsg: 'okFailTest fails', context: 'AssertOkTest', hhLogs: hhLogs2, assertMethod: 'ok', location: '370:36:0', expected: 'true', returned: 'false'},
], ['time', 'web3'])
})
@@ -158,18 +158,18 @@ describe('testRunner', () => {
deepEqualExcluding(tests, [
{ type: 'accountList', value: accounts },
{ type: 'contract', value: 'AssertEqualTest', filename: __dirname + '/examples_0/assert_equal_test.sol' },
- { type: 'testPass', value: 'Equal uint pass test', filename: __dirname + '/examples_0/assert_equal_test.sol', context: 'AssertEqualTest' },
- { type: 'testFailure', value: 'Equal uint fail test', filename: __dirname + '/examples_0/assert_equal_test.sol', errMsg: 'equalUintFailTest fails', context: 'AssertEqualTest', assertMethod: 'equal', location: '273:57:0', expected: '2', returned: '1'},
- { type: 'testPass', value: 'Equal int pass test', filename: __dirname + '/examples_0/assert_equal_test.sol', context: 'AssertEqualTest' },
- { type: 'testFailure', value: 'Equal int fail test', filename: __dirname + '/examples_0/assert_equal_test.sol', errMsg: 'equalIntFailTest fails', context: 'AssertEqualTest', assertMethod: 'equal', location: '493:45:0', expected: '2', returned: '-1'},
- { type: 'testPass', value: 'Equal bool pass test', filename: __dirname + '/examples_0/assert_equal_test.sol', context: 'AssertEqualTest' },
- { type: 'testFailure', value: 'Equal bool fail test', filename: __dirname + '/examples_0/assert_equal_test.sol', errMsg: 'equalBoolFailTest fails', context: 'AssertEqualTest', assertMethod: 'equal', location: '708:52:0', expected: false, returned: true},
- { type: 'testPass', value: 'Equal address pass test', filename: __dirname + '/examples_0/assert_equal_test.sol', context: 'AssertEqualTest' },
- { type: 'testFailure', value: 'Equal address fail test', filename: __dirname + '/examples_0/assert_equal_test.sol', errMsg: 'equalAddressFailTest fails', context: 'AssertEqualTest', assertMethod: 'equal', location: '1015:130:0', expected: '0x1c6637567229159d1eFD45f95A6675e77727E013', returned: '0x7994f14563F39875a2F934Ce42cAbF48a93FdDA9'},
- { type: 'testPass', value: 'Equal bytes32 pass test', filename: __dirname + '/examples_0/assert_equal_test.sol', context: 'AssertEqualTest' },
- { type: 'testFailure', value: 'Equal bytes32 fail test', filename: __dirname + '/examples_0/assert_equal_test.sol', errMsg: 'equalBytes32FailTest fails', context: 'AssertEqualTest', assertMethod: 'equal', location: '1670:48:0', expected: '0x72656d6978000000000000000000000000000000000000000000000000000000', returned: '0x72656d6979000000000000000000000000000000000000000000000000000000'},
- { type: 'testPass', value: 'Equal string pass test', filename: __dirname + '/examples_0/assert_equal_test.sol', context: 'AssertEqualTest' },
- { type: 'testFailure', value: 'Equal string fail test', filename: __dirname + '/examples_0/assert_equal_test.sol', errMsg: 'equalStringFailTest fails', context: 'AssertEqualTest', assertMethod: 'equal', location: '1916:81:0', expected: 'remix-tests', returned: 'remix'}
+ { type: 'testPass', debugTxHash: '0xbe77baee10f8a044a68fbb83abf57ce1ca63b8739f3b2dcd122dab0ee44fd0e9', value: 'Equal uint pass test', filename: __dirname + '/examples_0/assert_equal_test.sol', context: 'AssertEqualTest' },
+ { type: 'testFailure', debugTxHash: '0xfc9691b0cd0a49dbefed5cd3fad32158dd229e5bb7b0eb11da3c72054eafae8b', value: 'Equal uint fail test', filename: __dirname + '/examples_0/assert_equal_test.sol', errMsg: 'equalUintFailTest fails', context: 'AssertEqualTest', assertMethod: 'equal', location: '273:57:0', expected: '2', returned: '1'},
+ { type: 'testPass', debugTxHash: '0xbc142789e5a51841781536a9291c9022896b0c7453140fdc98996638c0d76045', value: 'Equal int pass test', filename: __dirname + '/examples_0/assert_equal_test.sol', context: 'AssertEqualTest' },
+ { type: 'testFailure', debugTxHash: '0xcc28211a4ab3149b1122fb47f45529a4edddbafa076d2338cc3754ab0629eaa1', value: 'Equal int fail test', filename: __dirname + '/examples_0/assert_equal_test.sol', errMsg: 'equalIntFailTest fails', context: 'AssertEqualTest', assertMethod: 'equal', location: '493:45:0', expected: '2', returned: '-1'},
+ { type: 'testPass', debugTxHash: '0x4f5570fc7da86f09aafb436ff3b4c46aa885f71680a233234433d0ef0346206b', value: 'Equal bool pass test', filename: __dirname + '/examples_0/assert_equal_test.sol', context: 'AssertEqualTest' },
+ { type: 'testFailure', debugTxHash: '0x28dc2d146dee77a2d6446efb088e5f9d008a3c7a14116e798401b68470da017f', value: 'Equal bool fail test', filename: __dirname + '/examples_0/assert_equal_test.sol', errMsg: 'equalBoolFailTest fails', context: 'AssertEqualTest', assertMethod: 'equal', location: '708:52:0', expected: false, returned: true},
+ { type: 'testPass', debugTxHash: '0x0abc8fa8831efa3a8c82c758d045c1382f71b6a7f7e9135ffbe9e40059f84617', value: 'Equal address pass test', filename: __dirname + '/examples_0/assert_equal_test.sol', context: 'AssertEqualTest' },
+ { type: 'testFailure', debugTxHash: '0x5ec200fb053539b8165a6b6ab36e9229a870c4752b0d6ff2786c4d5a66d5b35d', value: 'Equal address fail test', filename: __dirname + '/examples_0/assert_equal_test.sol', errMsg: 'equalAddressFailTest fails', context: 'AssertEqualTest', assertMethod: 'equal', location: '1015:130:0', expected: '0x1c6637567229159d1eFD45f95A6675e77727E013', returned: '0x7994f14563F39875a2F934Ce42cAbF48a93FdDA9'},
+ { type: 'testPass', debugTxHash: '0xb6c34f5baa6916569d122bcb1210fcd07fb126f4b859fea58db5328e5f1dab85', value: 'Equal bytes32 pass test', filename: __dirname + '/examples_0/assert_equal_test.sol', context: 'AssertEqualTest' },
+ { type: 'testFailure', debugTxHash: '0xb3af74a384b8b6ddacbc03a480ae48e233415b1570717ca7023530023a871be6', value: 'Equal bytes32 fail test', filename: __dirname + '/examples_0/assert_equal_test.sol', errMsg: 'equalBytes32FailTest fails', context: 'AssertEqualTest', assertMethod: 'equal', location: '1670:48:0', expected: '0x72656d6978000000000000000000000000000000000000000000000000000000', returned: '0x72656d6979000000000000000000000000000000000000000000000000000000'},
+ { type: 'testPass', debugTxHash: '0x8537e74941b511b5c745b398e55435748adcdf637659247e0d573fb681ee4833', value: 'Equal string pass test', filename: __dirname + '/examples_0/assert_equal_test.sol', context: 'AssertEqualTest' },
+ { type: 'testFailure', debugTxHash: '0x30d44498e63ac51f1412062b849144c103e19a4dc9daf81c5e84bd984ef738a6', value: 'Equal string fail test', filename: __dirname + '/examples_0/assert_equal_test.sol', errMsg: 'equalStringFailTest fails', context: 'AssertEqualTest', assertMethod: 'equal', location: '1916:81:0', expected: 'remix-tests', returned: 'remix'}
], ['time', 'web3'])
})
})
@@ -197,18 +197,18 @@ describe('testRunner', () => {
deepEqualExcluding(tests, [
{ type: 'accountList', value: accounts },
{ type: 'contract', value: 'AssertNotEqualTest', filename: __dirname + '/examples_0/assert_notEqual_test.sol' },
- { type: 'testPass', value: 'Not equal uint pass test', filename: __dirname + '/examples_0/assert_notEqual_test.sol', context: 'AssertNotEqualTest' },
- { type: 'testFailure', value: 'Not equal uint fail test', filename: __dirname + '/examples_0/assert_notEqual_test.sol', errMsg: 'notEqualUintFailTest fails', context: 'AssertNotEqualTest', assertMethod: 'notEqual', location: '288:63:0', expected: '1', returned: '1'},
- { type: 'testPass', value: 'Not equal int pass test', filename: __dirname + '/examples_0/assert_notEqual_test.sol', context: 'AssertNotEqualTest' },
- { type: 'testFailure', value: 'Not equal int fail test', filename: __dirname + '/examples_0/assert_notEqual_test.sol', errMsg: 'notEqualIntFailTest fails', context: 'AssertNotEqualTest', assertMethod: 'notEqual', location: '525:52:0', expected: '-2', returned: '-2'},
- { type: 'testPass', value: 'Not equal bool pass test', filename: __dirname + '/examples_0/assert_notEqual_test.sol', context: 'AssertNotEqualTest' },
- { type: 'testFailure', value: 'Not equal bool fail test', filename: __dirname + '/examples_0/assert_notEqual_test.sol', errMsg: 'notEqualBoolFailTest fails', context: 'AssertNotEqualTest', assertMethod: 'notEqual', location: '760:57:0', expected: true, returned: true},
- { type: 'testPass', value: 'Not equal address pass test', filename: __dirname + '/examples_0/assert_notEqual_test.sol', context: 'AssertNotEqualTest' },
- { type: 'testFailure', value: 'Not equal address fail test', filename: __dirname + '/examples_0/assert_notEqual_test.sol', errMsg: 'notEqualAddressFailTest fails', context: 'AssertNotEqualTest', assertMethod: 'notEqual', location: '1084:136:0', expected: 0x7994f14563F39875a2F934Ce42cAbF48a93FdDA9, returned: 0x7994f14563F39875a2F934Ce42cAbF48a93FdDA9},
- { type: 'testPass', value: 'Not equal bytes32 pass test', filename: __dirname + '/examples_0/assert_notEqual_test.sol', context: 'AssertNotEqualTest' },
- { type: 'testFailure', value: 'Not equal bytes32 fail test', filename: __dirname + '/examples_0/assert_notEqual_test.sol', errMsg: 'notEqualBytes32FailTest fails', context: 'AssertNotEqualTest', assertMethod: 'notEqual', location: '1756:54:0', expected: '0x72656d6978000000000000000000000000000000000000000000000000000000', returned: '0x72656d6978000000000000000000000000000000000000000000000000000000'},
- { type: 'testPass', value: 'Not equal string pass test', filename: __dirname + '/examples_0/assert_notEqual_test.sol', context: 'AssertNotEqualTest' },
- { type: 'testFailure', value: 'Not equal string fail test', filename: __dirname + '/examples_0/assert_notEqual_test.sol', errMsg: 'notEqualStringFailTest fails', context: 'AssertNotEqualTest', assertMethod: 'notEqual', location: '2026:81:0', expected: 'remix', returned: 'remix'},
+ { type: 'testPass', debugTxHash: '0xb0ac5cde13a5005dc1b4efbb66fb3a5d6f0697467aedd6165ed1c8ee552939bc', value: 'Not equal uint pass test', filename: __dirname + '/examples_0/assert_notEqual_test.sol', context: 'AssertNotEqualTest' },
+ { type: 'testFailure', debugTxHash: '0x69d25ed9b9a010e97e0f7282313d4018c77a8873fd5f2e0b12483701febdd6b4', value: 'Not equal uint fail test', filename: __dirname + '/examples_0/assert_notEqual_test.sol', errMsg: 'notEqualUintFailTest fails', context: 'AssertNotEqualTest', assertMethod: 'notEqual', location: '288:63:0', expected: '1', returned: '1'},
+ { type: 'testPass', debugTxHash: '0x19a743cfb44b273c78b3271d603412d31087974309a70595bc5d15097a52c5c5', value: 'Not equal int pass test', filename: __dirname + '/examples_0/assert_notEqual_test.sol', context: 'AssertNotEqualTest' },
+ { type: 'testFailure', debugTxHash: '0x8dfce61b71a9ea65fb00c471370413779626f290b71d41f8be8408674e64f4d2', value: 'Not equal int fail test', filename: __dirname + '/examples_0/assert_notEqual_test.sol', errMsg: 'notEqualIntFailTest fails', context: 'AssertNotEqualTest', assertMethod: 'notEqual', location: '525:52:0', expected: '-2', returned: '-2'},
+ { type: 'testPass', debugTxHash: '0x12bc9eb3a653ebe4c7ab954c144dab4848295c88d71d17cb86a41e8a004419ba', value: 'Not equal bool pass test', filename: __dirname + '/examples_0/assert_notEqual_test.sol', context: 'AssertNotEqualTest' },
+ { type: 'testFailure', debugTxHash: '0x901b9cd631f8f29841243a257d1914060b9c36d88ee7d8b624de76dad4a34c85', value: 'Not equal bool fail test', filename: __dirname + '/examples_0/assert_notEqual_test.sol', errMsg: 'notEqualBoolFailTest fails', context: 'AssertNotEqualTest', assertMethod: 'notEqual', location: '760:57:0', expected: true, returned: true},
+ { type: 'testPass', debugTxHash: '0xf9e48bac26d3a2871ceb92974b897cae61e60bbc4db115b7e8eff4ac0390e4a5', value: 'Not equal address pass test', filename: __dirname + '/examples_0/assert_notEqual_test.sol', context: 'AssertNotEqualTest' },
+ { type: 'testFailure', debugTxHash: '0x4e83a17426bc79b147ddd30a5434a2430a8302b3ce78b6979088ac5eceac5d3c', value: 'Not equal address fail test', filename: __dirname + '/examples_0/assert_notEqual_test.sol', errMsg: 'notEqualAddressFailTest fails', context: 'AssertNotEqualTest', assertMethod: 'notEqual', location: '1084:136:0', expected: 0x7994f14563F39875a2F934Ce42cAbF48a93FdDA9, returned: 0x7994f14563F39875a2F934Ce42cAbF48a93FdDA9},
+ { type: 'testPass', debugTxHash: '0xfb4b30bb8373eeb6b09e38ad07880b86654f72780b41d7cf7554a112a04a0f53', value: 'Not equal bytes32 pass test', filename: __dirname + '/examples_0/assert_notEqual_test.sol', context: 'AssertNotEqualTest' },
+ { type: 'testFailure', debugTxHash: '0x43edf8bc68229415ee63f63f5303351a0dfecf9f3eb2ec35ffd2c10c60cf7005', value: 'Not equal bytes32 fail test', filename: __dirname + '/examples_0/assert_notEqual_test.sol', errMsg: 'notEqualBytes32FailTest fails', context: 'AssertNotEqualTest', assertMethod: 'notEqual', location: '1756:54:0', expected: '0x72656d6978000000000000000000000000000000000000000000000000000000', returned: '0x72656d6978000000000000000000000000000000000000000000000000000000'},
+ { type: 'testPass', debugTxHash: '0x712932edc040596e2b02ddc06a48b773f5fccc7346d55cefc5d1c52528ce3168', value: 'Not equal string pass test', filename: __dirname + '/examples_0/assert_notEqual_test.sol', context: 'AssertNotEqualTest' },
+ { type: 'testFailure', debugTxHash: '0x961ce7425fdd4049aeb678ea20a0441eb837c1fe26b0d010593fc07d668321e6', value: 'Not equal string fail test', filename: __dirname + '/examples_0/assert_notEqual_test.sol', errMsg: 'notEqualStringFailTest fails', context: 'AssertNotEqualTest', assertMethod: 'notEqual', location: '2026:81:0', expected: 'remix', returned: 'remix'},
], ['time', 'web3'])
})
})
@@ -235,14 +235,14 @@ describe('testRunner', () => {
deepEqualExcluding(tests, [
{ type: 'accountList', value: accounts },
{ type: 'contract', value: 'AssertGreaterThanTest', filename: __dirname + '/examples_0/assert_greaterThan_test.sol' },
- { type: 'testPass', value: 'Greater than uint pass test', filename: __dirname + '/examples_0/assert_greaterThan_test.sol', context: 'AssertGreaterThanTest' },
- { type: 'testFailure', value: 'Greater than uint fail test', filename: __dirname + '/examples_0/assert_greaterThan_test.sol', errMsg: 'greaterThanUintFailTest fails', context: 'AssertGreaterThanTest', assertMethod: 'greaterThan', location: '303:69:0', expected: '4', returned: '1'},
- { type: 'testPass', value: 'Greater than int pass test', filename: __dirname + '/examples_0/assert_greaterThan_test.sol', context: 'AssertGreaterThanTest' },
- { type: 'testFailure', value: 'Greater than int fail test', filename: __dirname + '/examples_0/assert_greaterThan_test.sol', errMsg: 'greaterThanIntFailTest fails', context: 'AssertGreaterThanTest', assertMethod: 'greaterThan', location: '569:67:0', expected: '1', returned: '-1'},
- { type: 'testPass', value: 'Greater than uint int pass test', filename: __dirname + '/examples_0/assert_greaterThan_test.sol', context: 'AssertGreaterThanTest' },
- { type: 'testFailure', value: 'Greater than uint int fail test', filename: __dirname + '/examples_0/assert_greaterThan_test.sol', errMsg: 'greaterThanUintIntFailTest fails', context: 'AssertGreaterThanTest', assertMethod: 'greaterThan', location: '845:71:0', expected: '2', returned: '1'},
- { type: 'testPass', value: 'Greater than int uint pass test', filename: __dirname + '/examples_0/assert_greaterThan_test.sol', context: 'AssertGreaterThanTest' },
- { type: 'testFailure', value: 'Greater than int uint fail test', filename: __dirname + '/examples_0/assert_greaterThan_test.sol', errMsg: 'greaterThanIntUintFailTest fails', context: 'AssertGreaterThanTest', assertMethod: 'greaterThan', location: '1125:76:0', expected: '115792089237316195423570985008687907853269984665640564039457584007913129639836', returned: '100'}
+ { type: 'testPass', debugTxHash: '0x81cf46560b522280ac60bd5c8efedad4598957d33435a898c23eefb13ca6104f', value: 'Greater than uint pass test', filename: __dirname + '/examples_0/assert_greaterThan_test.sol', context: 'AssertGreaterThanTest' },
+ { type: 'testFailure', debugTxHash: '0x7090dc27ac06e1afd66963992bdd9188200d0404d43b95cfa5d925bbe6eba3ed', value: 'Greater than uint fail test', filename: __dirname + '/examples_0/assert_greaterThan_test.sol', errMsg: 'greaterThanUintFailTest fails', context: 'AssertGreaterThanTest', assertMethod: 'greaterThan', location: '303:69:0', expected: '4', returned: '1'},
+ { type: 'testPass', debugTxHash: '0xd57b40ed464763baf128f8a72efcd198e825e0b8f498cef90aed23045d0196db', value: 'Greater than int pass test', filename: __dirname + '/examples_0/assert_greaterThan_test.sol', context: 'AssertGreaterThanTest' },
+ { type: 'testFailure', debugTxHash: '0x6c7b84bd8fc452b7839e11129d3818fa69dfd9b914e55556b39fdc68b70fc1b5', value: 'Greater than int fail test', filename: __dirname + '/examples_0/assert_greaterThan_test.sol', errMsg: 'greaterThanIntFailTest fails', context: 'AssertGreaterThanTest', assertMethod: 'greaterThan', location: '569:67:0', expected: '1', returned: '-1'},
+ { type: 'testPass', debugTxHash: '0xc5883db70b83a1d3afff24a9f0555de3edd7776e5ec157cc2110e426e5be2594', value: 'Greater than uint int pass test', filename: __dirname + '/examples_0/assert_greaterThan_test.sol', context: 'AssertGreaterThanTest' },
+ { type: 'testFailure', debugTxHash: '0xa534085a6bbdcf73a68bdef6a1421218c11ac0ec1af398f9445defeea31cea6e', value: 'Greater than uint int fail test', filename: __dirname + '/examples_0/assert_greaterThan_test.sol', errMsg: 'greaterThanUintIntFailTest fails', context: 'AssertGreaterThanTest', assertMethod: 'greaterThan', location: '845:71:0', expected: '2', returned: '1'},
+ { type: 'testPass', debugTxHash: '0x36a7139445d76f6072fab4cc0717461068276748622c0dfc3f092d548b197de8', value: 'Greater than int uint pass test', filename: __dirname + '/examples_0/assert_greaterThan_test.sol', context: 'AssertGreaterThanTest' },
+ { type: 'testFailure', debugTxHash: '0x7890f7b8f2eabae581b6f70d55d2d3bfa64ddd7753d5f892dbdf86ced96945fe', value: 'Greater than int uint fail test', filename: __dirname + '/examples_0/assert_greaterThan_test.sol', errMsg: 'greaterThanIntUintFailTest fails', context: 'AssertGreaterThanTest', assertMethod: 'greaterThan', location: '1125:76:0', expected: '115792089237316195423570985008687907853269984665640564039457584007913129639836', returned: '100'}
], ['time', 'web3'])
})
})
@@ -270,14 +270,14 @@ describe('testRunner', () => {
deepEqualExcluding(tests, [
{ type: 'accountList', value: accounts },
{ type: 'contract', value: 'AssertLesserThanTest', filename: __dirname + '/examples_0/assert_lesserThan_test.sol' },
- { type: 'testPass', value: 'Lesser than uint pass test', filename: __dirname + '/examples_0/assert_lesserThan_test.sol', context: 'AssertLesserThanTest' },
- { type: 'testFailure', value: 'Lesser than uint fail test', filename: __dirname + '/examples_0/assert_lesserThan_test.sol', errMsg: 'lesserThanUintFailTest fails', context: 'AssertLesserThanTest', assertMethod: 'lesserThan', location: '298:67:0', expected: '2', returned: '4'},
- { type: 'testPass', value: 'Lesser than int pass test', filename: __dirname + '/examples_0/assert_lesserThan_test.sol', context: 'AssertLesserThanTest' },
- { type: 'testFailure', value: 'Lesser than int fail test', filename: __dirname + '/examples_0/assert_lesserThan_test.sol', errMsg: 'lesserThanIntFailTest fails', context: 'AssertLesserThanTest', assertMethod: 'lesserThan', location: '557:65:0', expected: '-1', returned: '1'},
- { type: 'testPass', value: 'Lesser than uint int pass test', filename: __dirname + '/examples_0/assert_lesserThan_test.sol', context: 'AssertLesserThanTest' },
- { type: 'testFailure', value: 'Lesser than uint int fail test', filename: __dirname + '/examples_0/assert_lesserThan_test.sol', errMsg: 'lesserThanUintIntFailTest fails', context: 'AssertLesserThanTest', assertMethod: 'lesserThan', location: '826:71:0', expected: '-1', returned: '115792089237316195423570985008687907853269984665640564039457584007913129639935'},
- { type: 'testPass', value: 'Lesser than int uint pass test', filename: __dirname + '/examples_0/assert_lesserThan_test.sol', context: 'AssertLesserThanTest' },
- { type: 'testFailure', value: 'Lesser than int uint fail test', filename: __dirname + '/examples_0/assert_lesserThan_test.sol', errMsg: 'lesserThanIntUintFailTest fails', context: 'AssertLesserThanTest', assertMethod: 'lesserThan', location: '1105:69:0', expected: '1', returned: '1'},
+ { type: 'testPass', debugTxHash: '0x47875047c1fff8a7b1cc1603418960cd2a3afe8a9c59337b19fb463a85d6e47e', value: 'Lesser than uint pass test', filename: __dirname + '/examples_0/assert_lesserThan_test.sol', context: 'AssertLesserThanTest' },
+ { type: 'testFailure', debugTxHash: '0xf6fd459d0b28d0d85c56dd69d953331291e1c234c8a263150252e35da0ed6671', value: 'Lesser than uint fail test', filename: __dirname + '/examples_0/assert_lesserThan_test.sol', errMsg: 'lesserThanUintFailTest fails', context: 'AssertLesserThanTest', assertMethod: 'lesserThan', location: '298:67:0', expected: '2', returned: '4'},
+ { type: 'testPass', debugTxHash: '0x761d95111764af396634474899ff1db218d5e514d6de6bc3260af15b1f5b929f', value: 'Lesser than int pass test', filename: __dirname + '/examples_0/assert_lesserThan_test.sol', context: 'AssertLesserThanTest' },
+ { type: 'testFailure', debugTxHash: '0xc17697ef2df92c22707639caa9355bdf0d98dbb18157e72b8b257bb0eb2beb4e', value: 'Lesser than int fail test', filename: __dirname + '/examples_0/assert_lesserThan_test.sol', errMsg: 'lesserThanIntFailTest fails', context: 'AssertLesserThanTest', assertMethod: 'lesserThan', location: '557:65:0', expected: '-1', returned: '1'},
+ { type: 'testPass', debugTxHash: '0xf0721b28c547c1c64948661d677cf6afc10d139315726280162a984f2f7e5d9c', value: 'Lesser than uint int pass test', filename: __dirname + '/examples_0/assert_lesserThan_test.sol', context: 'AssertLesserThanTest' },
+ { type: 'testFailure', debugTxHash: '0x0757289229b58043c101cb311df8db16d1b30944747493e1491daa9aca6aa30e', value: 'Lesser than uint int fail test', filename: __dirname + '/examples_0/assert_lesserThan_test.sol', errMsg: 'lesserThanUintIntFailTest fails', context: 'AssertLesserThanTest', assertMethod: 'lesserThan', location: '826:71:0', expected: '-1', returned: '115792089237316195423570985008687907853269984665640564039457584007913129639935'},
+ { type: 'testPass', debugTxHash: '0x316feb8f80c04b12194262dd80b6b004232eab00d7f7c3846badf6e92684e177', value: 'Lesser than int uint pass test', filename: __dirname + '/examples_0/assert_lesserThan_test.sol', context: 'AssertLesserThanTest' },
+ { type: 'testFailure', debugTxHash: '0x65c5ab3cb85f163eefe3321cc4444defa99154d3cbe415b9384bbd2627449b6a', value: 'Lesser than int uint fail test', filename: __dirname + '/examples_0/assert_lesserThan_test.sol', errMsg: 'lesserThanIntUintFailTest fails', context: 'AssertLesserThanTest', assertMethod: 'lesserThan', location: '1105:69:0', expected: '1', returned: '1'},
], ['time', 'web3'])
})
})
@@ -305,10 +305,10 @@ describe('testRunner', () => {
deepEqualExcluding(tests, [
{ type: 'accountList', value: accounts },
{ type: 'contract', value: 'MyTest', filename: __dirname + '/examples_1/simple_storage_test.sol' },
- { type: 'testPass', value: 'Initial value should be100', filename: __dirname + '/examples_1/simple_storage_test.sol', context: 'MyTest' },
- { type: 'testPass', value: 'Initial value should not be200', filename: __dirname + '/examples_1/simple_storage_test.sol', context: 'MyTest' },
- { type: 'testFailure', value: 'Should trigger one fail', filename: __dirname + '/examples_1/simple_storage_test.sol', errMsg: 'uint test 1 fails', context: 'MyTest', assertMethod: 'equal', location: '532:51:1', expected: '2', returned: '1'},
- { type: 'testPass', value: 'Should trigger one pass', filename: __dirname + '/examples_1/simple_storage_test.sol', context: 'MyTest' }
+ { type: 'testPass', debugTxHash: '0x5a805403a12f0431c5dd190d31a87eb62758f09dddc0c6ee7ee6899c5e7eba71', value: 'Initial value should be100', filename: __dirname + '/examples_1/simple_storage_test.sol', context: 'MyTest' },
+ { type: 'testPass', debugTxHash: '0xd0ae7cb5a3a0f5e8f7bf90129e3daba36f649a5c1176ad54609f7b7615bef7dd', value: 'Initial value should not be200', filename: __dirname + '/examples_1/simple_storage_test.sol', context: 'MyTest' },
+ { type: 'testFailure', debugTxHash: '0xb0d613434f2fd7060f97d4ca8bbfd8f2deeebed83062a25044f0237bd38b3229', value: 'Should trigger one fail', filename: __dirname + '/examples_1/simple_storage_test.sol', errMsg: 'uint test 1 fails', context: 'MyTest', assertMethod: 'equal', location: '532:51:1', expected: '2', returned: '1'},
+ { type: 'testPass', debugTxHash: '0x5ee675ec81b550386b2fdd359ae3530e49dd3e02145e877a4a5f68753ac4e341', value: 'Should trigger one pass', filename: __dirname + '/examples_1/simple_storage_test.sol', context: 'MyTest' }
], ['time', 'web3'])
})
})
@@ -336,8 +336,8 @@ describe('testRunner', () => {
deepEqualExcluding(tests, [
{ type: 'accountList', value: accounts },
{ type: 'contract', value: 'MyTest', filename: __dirname + '/examples_2/simple_storage_test.sol' },
- { type: 'testPass', value: 'Initial value should be100', filename: __dirname + '/examples_2/simple_storage_test.sol', context: 'MyTest' },
- { type: 'testPass', value: 'Value is set200', filename: __dirname + '/examples_2/simple_storage_test.sol', context: 'MyTest' }
+ { type: 'testPass', debugTxHash: '0xa700d29204f1ddb40ef66f151c44387f905d405b6da10380111a751451af2fe1', value: 'Initial value should be100', filename: __dirname + '/examples_2/simple_storage_test.sol', context: 'MyTest' },
+ { type: 'testPass', debugTxHash: '0x2c037b78a435e5964615f838ea65f077f3b15d8552d514b3551d0fb87419e444', value: 'Value is set200', filename: __dirname + '/examples_2/simple_storage_test.sol', context: 'MyTest' }
], ['time', 'web3'])
})
})
@@ -362,8 +362,8 @@ describe('testRunner', () => {
deepEqualExcluding(tests, [
{ type: 'accountList', value: accounts },
{ type: 'contract', value: 'StringTest', filename: __dirname + '/examples_3/simple_string_test.sol' },
- { type: 'testPass', value: 'Initial value should be hello world', filename: __dirname + '/examples_3/simple_string_test.sol', context: 'StringTest' },
- { type: 'testPass', value: 'Value should not be hello wordl', filename: __dirname + '/examples_3/simple_string_test.sol', context: 'StringTest' }
+ { type: 'testPass', debugTxHash: '0x4e160dbc81f88d3d87b39d81651c42b0ea8e3aaa10c1a57394467e073bbcb2a4', value: 'Initial value should be hello world', filename: __dirname + '/examples_3/simple_string_test.sol', context: 'StringTest' },
+ { type: 'testPass', debugTxHash: '0x47030578c5bcb990d837356430697d061a02813e3322fa3323f6b5f78176eea6', value: 'Value should not be hello wordl', filename: __dirname + '/examples_3/simple_string_test.sol', context: 'StringTest' }
], ['time', 'web3'])
})
})
@@ -388,9 +388,9 @@ describe('testRunner', () => {
deepEqualExcluding(tests, [
{ type: 'accountList', value: accounts },
{ type: 'contract', value: 'StorageResolveTest', filename: __dirname + '/examples_5/test/simple_storage_test.sol' },
- { type: 'testPass', value: 'Initial value should be100', filename: __dirname + '/examples_5/test/simple_storage_test.sol', context: 'StorageResolveTest' },
- { type: 'testPass', value: 'Check if even', filename: __dirname + '/examples_5/test/simple_storage_test.sol', context: 'StorageResolveTest' },
- { type: 'testPass', value: 'Check if odd', filename: __dirname + '/examples_5/test/simple_storage_test.sol', context: 'StorageResolveTest' }
+ { type: 'testPass', debugTxHash: '0x85e901e9160c4a17725d020f030c7cbb020d36da1fda8422d990391df3cbfcbb', value: 'Initial value should be100', filename: __dirname + '/examples_5/test/simple_storage_test.sol', context: 'StorageResolveTest' },
+ { type: 'testPass', debugTxHash: '0x1abb2456746b416cddcaf2f3fe960103e740e9772c47a0f1d65d48394facb21a', value: 'Check if even', filename: __dirname + '/examples_5/test/simple_storage_test.sol', context: 'StorageResolveTest' },
+ { type: 'testPass', debugTxHash: '0xfcc2332a24d2780390e85a06343fab81c4dc20c12cf5455d746641a9c3e8db03', value: 'Check if odd', filename: __dirname + '/examples_5/test/simple_storage_test.sol', context: 'StorageResolveTest' }
], ['time', 'web3'])
})
})
diff --git a/libs/remix-ui/debugger-ui/src/lib/idebugger-api.ts b/libs/remix-ui/debugger-ui/src/lib/idebugger-api.ts
index 5fa07cb4e8..86476a195d 100644
--- a/libs/remix-ui/debugger-ui/src/lib/idebugger-api.ts
+++ b/libs/remix-ui/debugger-ui/src/lib/idebugger-api.ts
@@ -1,10 +1,6 @@
import type { CompilationResult, CompilationSource } from '@remix-project/remix-solidity-ts' // eslint-disable-line
-export interface DebuggerUIProps {
- debuggerAPI: IDebuggerApi
-}
-
export interface LineColumnLocation {
start: {
line: number, column: number
@@ -68,3 +64,7 @@ export interface IDebuggerApi {
web3: () => any // returns an instance of web3.js
showMessage (title: string, message: string): void
}
+
+export interface DebuggerUIProps {
+ debuggerAPI: IDebuggerApi
+}
diff --git a/libs/remix-ui/debugger-ui/src/types/index.ts b/libs/remix-ui/debugger-ui/src/types/index.ts
index 9d13aab883..ee5e02a85f 100644
--- a/libs/remix-ui/debugger-ui/src/types/index.ts
+++ b/libs/remix-ui/debugger-ui/src/types/index.ts
@@ -1,3 +1,5 @@
+/* eslint-disable no-undef */
+
export interface ExtractData {
children?: Array<{key: number | string, value: ExtractData}>
self?: string | number,
@@ -13,7 +15,7 @@ export interface ExtractData {
}
export type ExtractFunc = (json: any, parent?: any) => ExtractData
-
+export type FormatSelfFunc = (key: string | number, data: ExtractData) => JSX.Element
export interface DropdownPanelProps {
dropdownName: string,
dropdownMessage?: string,
@@ -32,5 +34,3 @@ export interface DropdownPanelProps {
headStyle?: React.CSSProperties,
hexHighlight?: boolean // highlight non zero value of hex value
}
-
-export type FormatSelfFunc = (key: string | number, data: ExtractData) => JSX.Element
diff --git a/libs/remix-ui/file-explorer/.babelrc b/libs/remix-ui/editor/.babelrc
similarity index 100%
rename from libs/remix-ui/file-explorer/.babelrc
rename to libs/remix-ui/editor/.babelrc
diff --git a/libs/remix-ui/editor/.eslintrc b/libs/remix-ui/editor/.eslintrc
new file mode 100644
index 0000000000..598257efa0
--- /dev/null
+++ b/libs/remix-ui/editor/.eslintrc
@@ -0,0 +1,20 @@
+{
+ "env": {
+ "browser": true,
+ "es6": true
+ },
+ "extends": "../../../.eslintrc",
+ "globals": {
+ "Atomics": "readonly",
+ "SharedArrayBuffer": "readonly"
+ },
+ "parserOptions": {
+ "ecmaVersion": 11,
+ "sourceType": "module"
+ },
+ "rules": {
+ "no-unused-vars": "off",
+ "@typescript-eslint/no-unused-vars": "error"
+ },
+ "ignorePatterns": ["monaco.d.ts"]
+}
\ No newline at end of file
diff --git a/libs/remix-ui/editor/README.md b/libs/remix-ui/editor/README.md
new file mode 100644
index 0000000000..5e63800aab
--- /dev/null
+++ b/libs/remix-ui/editor/README.md
@@ -0,0 +1,4 @@
+# remix-ui-editor
+
+This library was generated with [Nx](https://nx.dev).
+Its purpose is to integrate Monaco editor as a react component inside Remix IDE.
\ No newline at end of file
diff --git a/libs/remix-ui/editor/src/index.ts b/libs/remix-ui/editor/src/index.ts
new file mode 100644
index 0000000000..7e3dcbc386
--- /dev/null
+++ b/libs/remix-ui/editor/src/index.ts
@@ -0,0 +1 @@
+export * from './lib/remix-ui-editor'
diff --git a/libs/remix-ui/editor/src/lib/actions/editor.ts b/libs/remix-ui/editor/src/lib/actions/editor.ts
new file mode 100644
index 0000000000..0b49c0686b
--- /dev/null
+++ b/libs/remix-ui/editor/src/lib/actions/editor.ts
@@ -0,0 +1,135 @@
+export interface Action {
+ type: string;
+ payload: Record
+ monaco: any,
+ editor: any
+}
+
+export const initialState = {}
+
+export const reducerActions = (models = initialState, action: Action) => {
+ const monaco = action.monaco
+ const editor = action.editor
+ switch (action.type) {
+ case 'ADD_MODEL': {
+ if (!editor) return models
+ const uri = action.payload.uri
+ const value = action.payload.value
+ const language = action.payload.language
+ const readOnly = action.payload.readOnly
+ if (models[uri]) return models // already existing
+ models[uri] = { language, uri, readOnly }
+ const model = monaco.editor.createModel(value, language, monaco.Uri.parse(uri))
+ models[uri].model = model
+ model.onDidChangeContent(() => action.payload.events.onDidChangeContent(uri))
+ return models
+ }
+ case 'DISPOSE_MODEL': {
+ const uri = action.payload.uri
+ const model = models[uri]?.model
+ if (model) model.dispose()
+ delete models[uri]
+ return models
+ }
+ case 'SET_VALUE': {
+ if (!editor) return models
+ const uri = action.payload.uri
+ const value = action.payload.value
+ const model = models[uri]?.model
+ if (model) {
+ model.setValue(value)
+ }
+ return models
+ }
+ case 'REVEAL_LINE': {
+ if (!editor) return models
+ const line = action.payload.line
+ const column = action.payload.column
+ editor.revealLine(line)
+ editor.setPosition({ column, lineNumber: line })
+ return models
+ }
+ case 'FOCUS': {
+ if (!editor) return models
+ editor.focus()
+ return models
+ }
+ case 'SET_FONTSIZE': {
+ if (!editor) return models
+ const size = action.payload.size
+ editor.updateOptions({ fontSize: size })
+ return models
+ }
+ case 'SET_WORDWRAP': {
+ if (!editor) return models
+ const wrap = action.payload.wrap
+ editor.updateOptions({ wordWrap: wrap ? 'on' : 'off' })
+ return models
+ }
+ }
+}
+
+export const reducerListener = (plugin, dispatch, monaco, editor, events) => {
+ plugin.on('editor', 'addModel', (value, language, uri, readOnly) => {
+ dispatch({
+ type: 'ADD_MODEL',
+ payload: { uri, value, language, readOnly, events },
+ monaco,
+ editor
+ })
+ })
+
+ plugin.on('editor', 'disposeModel', (uri) => {
+ dispatch({
+ type: 'DISPOSE_MODEL',
+ payload: { uri },
+ monaco,
+ editor
+ })
+ })
+
+ plugin.on('editor', 'setValue', (uri, value) => {
+ dispatch({
+ type: 'SET_VALUE',
+ payload: { uri, value },
+ monaco,
+ editor
+ })
+ })
+
+ plugin.on('editor', 'revealLine', (line, column) => {
+ dispatch({
+ type: 'REVEAL_LINE',
+ payload: { line, column },
+ monaco,
+ editor
+ })
+ })
+
+ plugin.on('editor', 'focus', () => {
+ dispatch({
+ type: 'FOCUS',
+ payload: {},
+ monaco,
+ editor
+ })
+ })
+
+ plugin.on('editor', 'setFontSize', (size) => {
+ dispatch({
+ type: 'SET_FONTSIZE',
+ payload: { size },
+ monaco,
+ editor
+ })
+ })
+
+ plugin.on('editor', 'setWordWrap', (wrap) => {
+ dispatch({
+ type: 'SET_WORDWRAP',
+ payload: { wrap },
+ monaco,
+ editor
+ })
+ })
+}
diff --git a/libs/remix-ui/editor/src/lib/remix-ui-editor.css b/libs/remix-ui/editor/src/lib/remix-ui-editor.css
new file mode 100644
index 0000000000..a487d143f8
--- /dev/null
+++ b/libs/remix-ui/editor/src/lib/remix-ui-editor.css
@@ -0,0 +1,11 @@
+.hover-row {
+ white-space: pre;
+ margin-left : 10px;
+ background : var(--light);
+ font-weight : bold;
+ font-family : monospace;
+ padding : 10px;
+ border-radius : 10px;
+ height: auto;
+ width: auto;
+}
\ No newline at end of file
diff --git a/libs/remix-ui/editor/src/lib/remix-ui-editor.tsx b/libs/remix-ui/editor/src/lib/remix-ui-editor.tsx
new file mode 100644
index 0000000000..fceb98d971
--- /dev/null
+++ b/libs/remix-ui/editor/src/lib/remix-ui-editor.tsx
@@ -0,0 +1,256 @@
+import React, { useState, useRef, useEffect, useReducer } from 'react' // eslint-disable-line
+import Editor from '@monaco-editor/react'
+import { reducerActions, reducerListener, initialState } from './actions/editor'
+
+import './remix-ui-editor.css'
+
+type cursorPosition = {
+ startLineNumber: number,
+ startColumn: number,
+ endLineNumber: number,
+ endColumn: number
+}
+
+type sourceAnnotation = {
+ row: number,
+ column: number,
+ text: string,
+ type: 'error' | 'warning' | 'info'
+ hide: boolean
+ from: string // plugin name
+}
+
+type sourceMarker = {
+ position: {
+ start: {
+ line: number
+ column: number
+ },
+ end: {
+ line: number
+ column: number
+ }
+ },
+ from: string // plugin name
+ hide: boolean
+}
+
+type sourceAnnotationMap = {
+ [key: string]: [sourceAnnotation];
+}
+
+type sourceMarkerMap = {
+ [key: string]: [sourceMarker];
+}
+
+/* eslint-disable-next-line */
+export interface EditorUIProps {
+ activated: boolean
+ theme: string
+ currentFile: string
+ sourceAnnotationsPerFile: sourceAnnotationMap
+ markerPerFile: sourceMarkerMap
+ events: {
+ onBreakPointAdded: (file: string, line: number) => void
+ onBreakPointCleared: (file: string, line: number) => void
+ onDidChangeContent: (file: string) => void
+ onEditorMounted: () => void
+ }
+ plugin: {
+ on: (plugin: string, event: string, listener: any) => void
+ }
+ editorAPI:{
+ findMatches: (uri: string, value: string) => any
+ getFontSize: () => number,
+ getValue: (uri: string) => string
+ getCursorPosition: () => cursorPosition
+ }
+}
+
+export const EditorUI = (props: EditorUIProps) => {
+ const [, setCurrentBreakpoints] = useState({})
+ const [currentAnnotations, setCurrentAnnotations] = useState({})
+ const [currentMarkers, setCurrentMarkers] = useState({})
+ const editorRef = useRef(null)
+ const monacoRef = useRef(null)
+ const currentFileRef = useRef('')
+
+ const [editorModelsState, dispatch] = useReducer(reducerActions, initialState)
+
+ useEffect(() => {
+ if (!monacoRef.current) return
+ monacoRef.current.editor.setTheme(props.theme)
+ }, [props.theme])
+
+ if (monacoRef.current) monacoRef.current.editor.setTheme(props.theme)
+
+ const setAnnotationsbyFile = (uri) => {
+ if (props.sourceAnnotationsPerFile[uri]) {
+ const model = editorModelsState[uri]?.model
+ const newAnnotations = []
+ for (const annotation of props.sourceAnnotationsPerFile[uri]) {
+ if (!annotation.hide) {
+ newAnnotations.push({
+ range: new monacoRef.current.Range(annotation.row + 1, 1, annotation.row + 1, 1),
+ options: {
+ isWholeLine: false,
+ glyphMarginHoverMessage: { value: (annotation.from ? `from ${annotation.from}:\n` : '') + annotation.text },
+ glyphMarginClassName: `fal fa-exclamation-square text-${annotation.type === 'error' ? 'danger' : (annotation.type === 'warning' ? 'warning' : 'info')}`
+ }
+ })
+ }
+ }
+ setCurrentAnnotations(prevState => {
+ prevState[uri] = model.deltaDecorations(currentAnnotations[uri] || [], newAnnotations)
+ return prevState
+ })
+ }
+ }
+
+ const setMarkerbyFile = (uri) => {
+ if (props.markerPerFile[uri]) {
+ const model = editorModelsState[uri]?.model
+ const newMarkers = []
+ for (const marker of props.markerPerFile[uri]) {
+ if (!marker.hide) {
+ let isWholeLine = false
+ if (marker.position.start.line === marker.position.end.line && marker.position.end.column - marker.position.start.column < 3) {
+ // in this case we force highlighting the whole line (doesn't make sense to highlight 2 chars)
+ isWholeLine = true
+ }
+ newMarkers.push({
+ range: new monacoRef.current.Range(marker.position.start.line + 1, marker.position.start.column + 1, marker.position.end.line + 1, marker.position.end.column + 1),
+ options: {
+ isWholeLine,
+ inlineClassName: `bg-info highlightLine${marker.position.start.line + 1}`
+ }
+ })
+ }
+ }
+ setCurrentMarkers(prevState => {
+ prevState[uri] = model.deltaDecorations(currentMarkers[uri] || [], newMarkers)
+ return prevState
+ })
+ }
+ }
+
+ useEffect(() => {
+ if (!editorRef.current) return
+ currentFileRef.current = props.currentFile
+ editorRef.current.setModel(editorModelsState[props.currentFile].model)
+ editorRef.current.updateOptions({ readOnly: editorModelsState[props.currentFile].readOnly })
+ setAnnotationsbyFile(props.currentFile)
+ setMarkerbyFile(props.currentFile)
+ }, [props.currentFile])
+
+ useEffect(() => {
+ setAnnotationsbyFile(props.currentFile)
+ }, [JSON.stringify(props.sourceAnnotationsPerFile)])
+
+ useEffect(() => {
+ setMarkerbyFile(props.currentFile)
+ }, [JSON.stringify(props.markerPerFile)])
+
+ props.editorAPI.findMatches = (uri: string, value: string) => {
+ if (!editorRef.current) return
+ const model = editorModelsState[uri]?.model
+ if (model) return model.findMatches(value)
+ }
+
+ props.editorAPI.getValue = (uri: string) => {
+ if (!editorRef.current) return
+ const model = editorModelsState[uri]?.model
+ if (model) {
+ return model.getValue()
+ }
+ }
+
+ props.editorAPI.getCursorPosition = () => {
+ if (!monacoRef.current) return
+ const model = editorModelsState[currentFileRef.current]?.model
+ if (model) {
+ return model.getOffsetAt(editorRef.current.getPosition())
+ }
+ }
+
+ props.editorAPI.getFontSize = () => {
+ if (!editorRef.current) return
+ return editorRef.current.getOption(42).fontSize
+ }
+
+ (window as any).addRemixBreakpoint = (position) => { // make it available from e2e testing...
+ const model = editorRef.current.getModel()
+ if (model) {
+ setCurrentBreakpoints(prevState => {
+ const currentFile = currentFileRef.current
+ if (!prevState[currentFile]) prevState[currentFile] = {}
+ const decoration = Object.keys(prevState[currentFile]).filter((line) => parseInt(line) === position.lineNumber)
+ if (decoration.length) {
+ props.events.onBreakPointCleared(currentFile, position.lineNumber)
+ model.deltaDecorations([prevState[currentFile][position.lineNumber]], [])
+ delete prevState[currentFile][position.lineNumber]
+ } else {
+ props.events.onBreakPointAdded(currentFile, position.lineNumber)
+ const decorationIds = model.deltaDecorations([], [{
+ range: new monacoRef.current.Range(position.lineNumber, 1, position.lineNumber, 1),
+ options: {
+ isWholeLine: false,
+ glyphMarginClassName: 'fas fa-circle text-info'
+ }
+ }])
+ prevState[currentFile][position.lineNumber] = decorationIds[0]
+ }
+ return prevState
+ })
+ }
+ }
+
+ function handleEditorDidMount (editor) {
+ editorRef.current = editor
+ monacoRef.current.editor.setTheme(props.theme)
+ reducerListener(props.plugin, dispatch, monacoRef.current, editorRef.current, props.events)
+ props.events.onEditorMounted()
+ editor.onMouseUp((e) => {
+ if (e && e.target && e.target.toString().startsWith('GUTTER')) {
+ (window as any).addRemixBreakpoint(e.target.position)
+ }
+ })
+ }
+
+ function handleEditorWillMount (monaco) {
+ monacoRef.current = monaco
+ // see https://microsoft.github.io/monaco-editor/playground.html#customizing-the-appearence-exposed-colors
+ const lightColor = window.getComputedStyle(document.documentElement).getPropertyValue('--light').trim()
+ const infoColor = window.getComputedStyle(document.documentElement).getPropertyValue('--info').trim()
+ const darkColor = window.getComputedStyle(document.documentElement).getPropertyValue('--dark').trim()
+ const grayColor = window.getComputedStyle(document.documentElement).getPropertyValue('--gray-dark').trim()
+ monaco.editor.defineTheme('remix-dark', {
+ base: 'vs-dark',
+ inherit: true, // can also be false to completely replace the builtin rules
+ rules: [{ background: darkColor.replace('#', '') }],
+ colors: {
+ 'editor.background': darkColor,
+ 'editorSuggestWidget.background': lightColor,
+ 'editorSuggestWidget.selectedBackground': lightColor,
+ 'editorSuggestWidget.highlightForeground': infoColor,
+ 'editor.lineHighlightBorder': lightColor,
+ 'editor.lineHighlightBackground': grayColor,
+ 'editorGutter.background': lightColor
+ }
+ })
+ }
+
+ return (
+
+ )
+}
+
+export default EditorUI
diff --git a/libs/remix-ui/editor/src/types/monaco.d.ts b/libs/remix-ui/editor/src/types/monaco.d.ts
new file mode 100644
index 0000000000..91dd573c33
--- /dev/null
+++ b/libs/remix-ui/editor/src/types/monaco.d.ts
@@ -0,0 +1,7709 @@
+/* eslint-disable */
+/*!-----------------------------------------------------------
+ * Copyright (c) Microsoft Corporation. All rights reserved.
+ * Type definitions for monaco-editor
+ * Released under the MIT license
+*-----------------------------------------------------------*/
+/*---------------------------------------------------------------------------------------------
+ * Copyright (c) Microsoft Corporation. All rights reserved.
+ * Licensed under the MIT License. See License.txt in the project root for license information.
+ *--------------------------------------------------------------------------------------------*/
+
+declare let MonacoEnvironment: monaco.Environment | undefined;
+
+declare namespace monaco {
+
+ export type Thenable = PromiseLike;
+
+ export interface Environment {
+ globalAPI?: boolean;
+ baseUrl?: string;
+ getWorker?(workerId: string, label: string): Worker;
+ getWorkerUrl?(workerId: string, label: string): string;
+ }
+
+ export interface IDisposable {
+ dispose(): void;
+ }
+
+ export interface IEvent {
+ (listener: (e: T) => any, thisArg?: any): IDisposable;
+ }
+
+ /**
+ * A helper that allows to emit and listen to typed events
+ */
+ export class Emitter {
+ constructor();
+ readonly event: IEvent;
+ fire(event: T): void;
+ dispose(): void;
+ }
+
+
+ export enum MarkerTag {
+ Unnecessary = 1,
+ Deprecated = 2
+ }
+
+ export enum MarkerSeverity {
+ Hint = 1,
+ Info = 2,
+ Warning = 4,
+ Error = 8
+ }
+
+ export class CancellationTokenSource {
+ constructor(parent?: CancellationToken);
+ get token(): CancellationToken;
+ cancel(): void;
+ dispose(cancel?: boolean): void;
+ }
+
+ export interface CancellationToken {
+ /**
+ * A flag signalling is cancellation has been requested.
+ */
+ readonly isCancellationRequested: boolean;
+ /**
+ * An event which fires when cancellation is requested. This event
+ * only ever fires `once` as cancellation can only happen once. Listeners
+ * that are registered after cancellation will be called (next event loop run),
+ * but also only once.
+ *
+ * @event
+ */
+ readonly onCancellationRequested: (listener: (e: any) => any, thisArgs?: any, disposables?: IDisposable[]) => IDisposable;
+ }
+ /**
+ * Uniform Resource Identifier (Uri) http://tools.ietf.org/html/rfc3986.
+ * This class is a simple parser which creates the basic component parts
+ * (http://tools.ietf.org/html/rfc3986#section-3) with minimal validation
+ * and encoding.
+ *
+ * ```txt
+ * foo://example.com:8042/over/there?name=ferret#nose
+ * \_/ \______________/\_________/ \_________/ \__/
+ * | | | | |
+ * scheme authority path query fragment
+ * | _____________________|__
+ * / \ / \
+ * urn:example:animal:ferret:nose
+ * ```
+ */
+ export class Uri implements UriComponents {
+ static isUri(thing: any): thing is Uri;
+ /**
+ * scheme is the 'http' part of 'http://www.msft.com/some/path?query#fragment'.
+ * The part before the first colon.
+ */
+ readonly scheme: string;
+ /**
+ * authority is the 'www.msft.com' part of 'http://www.msft.com/some/path?query#fragment'.
+ * The part between the first double slashes and the next slash.
+ */
+ readonly authority: string;
+ /**
+ * path is the '/some/path' part of 'http://www.msft.com/some/path?query#fragment'.
+ */
+ readonly path: string;
+ /**
+ * query is the 'query' part of 'http://www.msft.com/some/path?query#fragment'.
+ */
+ readonly query: string;
+ /**
+ * fragment is the 'fragment' part of 'http://www.msft.com/some/path?query#fragment'.
+ */
+ readonly fragment: string;
+ /**
+ * Returns a string representing the corresponding file system path of this Uri.
+ * Will handle UNC paths, normalizes windows drive letters to lower-case, and uses the
+ * platform specific path separator.
+ *
+ * * Will *not* validate the path for invalid characters and semantics.
+ * * Will *not* look at the scheme of this Uri.
+ * * The result shall *not* be used for display purposes but for accessing a file on disk.
+ *
+ *
+ * The *difference* to `Uri#path` is the use of the platform specific separator and the handling
+ * of UNC paths. See the below sample of a file-uri with an authority (UNC path).
+ *
+ * ```ts
+ const u = Uri.parse('file://server/c$/folder/file.txt')
+ u.authority === 'server'
+ u.path === '/shares/c$/file.txt'
+ u.fsPath === '\\server\c$\folder\file.txt'
+ ```
+ *
+ * Using `Uri#path` to read a file (using fs-apis) would not be enough because parts of the path,
+ * namely the server name, would be missing. Therefore `Uri#fsPath` exists - it's sugar to ease working
+ * with URIs that represent files on disk (`file` scheme).
+ */
+ get fsPath(): string;
+ with(change: {
+ scheme?: string;
+ authority?: string | null;
+ path?: string | null;
+ query?: string | null;
+ fragment?: string | null;
+ }): Uri;
+ /**
+ * Creates a new Uri from a string, e.g. `http://www.msft.com/some/path`,
+ * `file:///usr/home`, or `scheme:with/path`.
+ *
+ * @param value A string which represents an Uri (see `Uri#toString`).
+ */
+ static parse(value: string, _strict?: boolean): Uri;
+ /**
+ * Creates a new Uri from a file system path, e.g. `c:\my\files`,
+ * `/usr/home`, or `\\server\share\some\path`.
+ *
+ * The *difference* between `Uri#parse` and `Uri#file` is that the latter treats the argument
+ * as path, not as stringified-uri. E.g. `Uri.file(path)` is **not the same as**
+ * `Uri.parse('file://' + path)` because the path might contain characters that are
+ * interpreted (# and ?). See the following sample:
+ * ```ts
+ const good = Uri.file('/coding/c#/project1');
+ good.scheme === 'file';
+ good.path === '/coding/c#/project1';
+ good.fragment === '';
+ const bad = Uri.parse('file://' + '/coding/c#/project1');
+ bad.scheme === 'file';
+ bad.path === '/coding/c'; // path is now broken
+ bad.fragment === '/project1';
+ ```
+ *
+ * @param path A file system path (see `Uri#fsPath`)
+ */
+ static file(path: string): Uri;
+ static from(components: {
+ scheme: string;
+ authority?: string;
+ path?: string;
+ query?: string;
+ fragment?: string;
+ }): Uri;
+ /**
+ * Join a Uri path with path fragments and normalizes the resulting path.
+ *
+ * @param uri The input Uri.
+ * @param pathFragment The path fragment to add to the Uri path.
+ * @returns The resulting Uri.
+ */
+ static joinPath(uri: Uri, ...pathFragment: string[]): Uri;
+ /**
+ * Creates a string representation for this Uri. It's guaranteed that calling
+ * `Uri.parse` with the result of this function creates an Uri which is equal
+ * to this Uri.
+ *
+ * * The result shall *not* be used for display purposes but for externalization or transport.
+ * * The result will be encoded using the percentage encoding and encoding happens mostly
+ * ignore the scheme-specific encoding rules.
+ *
+ * @param skipEncoding Do not encode the result, default is `false`
+ */
+ toString(skipEncoding?: boolean): string;
+ toJSON(): UriComponents;
+ static revive(data: UriComponents | Uri): Uri;
+ static revive(data: UriComponents | Uri | undefined): Uri | undefined;
+ static revive(data: UriComponents | Uri | null): Uri | null;
+ static revive(data: UriComponents | Uri | undefined | null): Uri | undefined | null;
+ }
+
+ export interface UriComponents {
+ scheme: string;
+ authority: string;
+ path: string;
+ query: string;
+ fragment: string;
+ }
+
+ /**
+ * Virtual Key Codes, the value does not hold any inherent meaning.
+ * Inspired somewhat from https://msdn.microsoft.com/en-us/library/windows/desktop/dd375731(v=vs.85).aspx
+ * But these are "more general", as they should work across browsers & OS`s.
+ */
+ export enum KeyCode {
+ DependsOnKbLayout = -1,
+ /**
+ * Placed first to cover the 0 value of the enum.
+ */
+ Unknown = 0,
+ Backspace = 1,
+ Tab = 2,
+ Enter = 3,
+ Shift = 4,
+ Ctrl = 5,
+ Alt = 6,
+ PauseBreak = 7,
+ CapsLock = 8,
+ Escape = 9,
+ Space = 10,
+ PageUp = 11,
+ PageDown = 12,
+ End = 13,
+ Home = 14,
+ LeftArrow = 15,
+ UpArrow = 16,
+ RightArrow = 17,
+ DownArrow = 18,
+ Insert = 19,
+ Delete = 20,
+ KEY_0 = 21,
+ KEY_1 = 22,
+ KEY_2 = 23,
+ KEY_3 = 24,
+ KEY_4 = 25,
+ KEY_5 = 26,
+ KEY_6 = 27,
+ KEY_7 = 28,
+ KEY_8 = 29,
+ KEY_9 = 30,
+ KEY_A = 31,
+ KEY_B = 32,
+ KEY_C = 33,
+ KEY_D = 34,
+ KEY_E = 35,
+ KEY_F = 36,
+ KEY_G = 37,
+ KEY_H = 38,
+ KEY_I = 39,
+ KEY_J = 40,
+ KEY_K = 41,
+ KEY_L = 42,
+ KEY_M = 43,
+ KEY_N = 44,
+ KEY_O = 45,
+ KEY_P = 46,
+ KEY_Q = 47,
+ KEY_R = 48,
+ KEY_S = 49,
+ KEY_T = 50,
+ KEY_U = 51,
+ KEY_V = 52,
+ KEY_W = 53,
+ KEY_X = 54,
+ KEY_Y = 55,
+ KEY_Z = 56,
+ Meta = 57,
+ ContextMenu = 58,
+ F1 = 59,
+ F2 = 60,
+ F3 = 61,
+ F4 = 62,
+ F5 = 63,
+ F6 = 64,
+ F7 = 65,
+ F8 = 66,
+ F9 = 67,
+ F10 = 68,
+ F11 = 69,
+ F12 = 70,
+ F13 = 71,
+ F14 = 72,
+ F15 = 73,
+ F16 = 74,
+ F17 = 75,
+ F18 = 76,
+ F19 = 77,
+ NumLock = 78,
+ ScrollLock = 79,
+ /**
+ * Used for miscellaneous characters; it can vary by keyboard.
+ * For the US standard keyboard, the ';:' key
+ */
+ US_SEMICOLON = 80,
+ /**
+ * For any country/region, the '+' key
+ * For the US standard keyboard, the '=+' key
+ */
+ US_EQUAL = 81,
+ /**
+ * For any country/region, the ',' key
+ * For the US standard keyboard, the ',<' key
+ */
+ US_COMMA = 82,
+ /**
+ * For any country/region, the '-' key
+ * For the US standard keyboard, the '-_' key
+ */
+ US_MINUS = 83,
+ /**
+ * For any country/region, the '.' key
+ * For the US standard keyboard, the '.>' key
+ */
+ US_DOT = 84,
+ /**
+ * Used for miscellaneous characters; it can vary by keyboard.
+ * For the US standard keyboard, the '/?' key
+ */
+ US_SLASH = 85,
+ /**
+ * Used for miscellaneous characters; it can vary by keyboard.
+ * For the US standard keyboard, the '`~' key
+ */
+ US_BACKTICK = 86,
+ /**
+ * Used for miscellaneous characters; it can vary by keyboard.
+ * For the US standard keyboard, the '[{' key
+ */
+ US_OPEN_SQUARE_BRACKET = 87,
+ /**
+ * Used for miscellaneous characters; it can vary by keyboard.
+ * For the US standard keyboard, the '\|' key
+ */
+ US_BACKSLASH = 88,
+ /**
+ * Used for miscellaneous characters; it can vary by keyboard.
+ * For the US standard keyboard, the ']}' key
+ */
+ US_CLOSE_SQUARE_BRACKET = 89,
+ /**
+ * Used for miscellaneous characters; it can vary by keyboard.
+ * For the US standard keyboard, the ''"' key
+ */
+ US_QUOTE = 90,
+ /**
+ * Used for miscellaneous characters; it can vary by keyboard.
+ */
+ OEM_8 = 91,
+ /**
+ * Either the angle bracket key or the backslash key on the RT 102-key keyboard.
+ */
+ OEM_102 = 92,
+ NUMPAD_0 = 93,
+ NUMPAD_1 = 94,
+ NUMPAD_2 = 95,
+ NUMPAD_3 = 96,
+ NUMPAD_4 = 97,
+ NUMPAD_5 = 98,
+ NUMPAD_6 = 99,
+ NUMPAD_7 = 100,
+ NUMPAD_8 = 101,
+ NUMPAD_9 = 102,
+ NUMPAD_MULTIPLY = 103,
+ NUMPAD_ADD = 104,
+ NUMPAD_SEPARATOR = 105,
+ NUMPAD_SUBTRACT = 106,
+ NUMPAD_DECIMAL = 107,
+ NUMPAD_DIVIDE = 108,
+ /**
+ * Cover all key codes when IME is processing input.
+ */
+ KEY_IN_COMPOSITION = 109,
+ ABNT_C1 = 110,
+ ABNT_C2 = 111,
+ /**
+ * Placed last to cover the length of the enum.
+ * Please do not depend on this value!
+ */
+ MAX_VALUE = 112
+ }
+ export class KeyMod {
+ static readonly CtrlCmd: number;
+ static readonly Shift: number;
+ static readonly Alt: number;
+ static readonly WinCtrl: number;
+ static chord(firstPart: number, secondPart: number): number;
+ }
+
+ export interface IMarkdownString {
+ readonly value: string;
+ readonly isTrusted?: boolean;
+ readonly supportThemeIcons?: boolean;
+ uris?: {
+ [href: string]: UriComponents;
+ };
+ }
+
+ export interface IKeyboardEvent {
+ readonly _standardKeyboardEventBrand: true;
+ readonly browserEvent: KeyboardEvent;
+ readonly target: HTMLElement;
+ readonly ctrlKey: boolean;
+ readonly shiftKey: boolean;
+ readonly altKey: boolean;
+ readonly metaKey: boolean;
+ readonly keyCode: KeyCode;
+ readonly code: string;
+ equals(keybinding: number): boolean;
+ preventDefault(): void;
+ stopPropagation(): void;
+ }
+ export interface IMouseEvent {
+ readonly browserEvent: MouseEvent;
+ readonly leftButton: boolean;
+ readonly middleButton: boolean;
+ readonly rightButton: boolean;
+ readonly buttons: number;
+ readonly target: HTMLElement;
+ readonly detail: number;
+ readonly posx: number;
+ readonly posy: number;
+ readonly ctrlKey: boolean;
+ readonly shiftKey: boolean;
+ readonly altKey: boolean;
+ readonly metaKey: boolean;
+ readonly timestamp: number;
+ preventDefault(): void;
+ stopPropagation(): void;
+ }
+
+ export interface IScrollEvent {
+ readonly scrollTop: number;
+ readonly scrollLeft: number;
+ readonly scrollWidth: number;
+ readonly scrollHeight: number;
+ readonly scrollTopChanged: boolean;
+ readonly scrollLeftChanged: boolean;
+ readonly scrollWidthChanged: boolean;
+ readonly scrollHeightChanged: boolean;
+ }
+ /**
+ * A position in the editor. This interface is suitable for serialization.
+ */
+ export interface IPosition {
+ /**
+ * line number (starts at 1)
+ */
+ readonly lineNumber: number;
+ /**
+ * column (the first character in a line is between column 1 and column 2)
+ */
+ readonly column: number;
+ }
+
+ /**
+ * A position in the editor.
+ */
+ export class Position {
+ /**
+ * line number (starts at 1)
+ */
+ readonly lineNumber: number;
+ /**
+ * column (the first character in a line is between column 1 and column 2)
+ */
+ readonly column: number;
+ constructor(lineNumber: number, column: number);
+ /**
+ * Create a new position from this position.
+ *
+ * @param newLineNumber new line number
+ * @param newColumn new column
+ */
+ with(newLineNumber?: number, newColumn?: number): Position;
+ /**
+ * Derive a new position from this position.
+ *
+ * @param deltaLineNumber line number delta
+ * @param deltaColumn column delta
+ */
+ delta(deltaLineNumber?: number, deltaColumn?: number): Position;
+ /**
+ * Test if this position equals other position
+ */
+ equals(other: IPosition): boolean;
+ /**
+ * Test if position `a` equals position `b`
+ */
+ static equals(a: IPosition | null, b: IPosition | null): boolean;
+ /**
+ * Test if this position is before other position.
+ * If the two positions are equal, the result will be false.
+ */
+ isBefore(other: IPosition): boolean;
+ /**
+ * Test if position `a` is before position `b`.
+ * If the two positions are equal, the result will be false.
+ */
+ static isBefore(a: IPosition, b: IPosition): boolean;
+ /**
+ * Test if this position is before other position.
+ * If the two positions are equal, the result will be true.
+ */
+ isBeforeOrEqual(other: IPosition): boolean;
+ /**
+ * Test if position `a` is before position `b`.
+ * If the two positions are equal, the result will be true.
+ */
+ static isBeforeOrEqual(a: IPosition, b: IPosition): boolean;
+ /**
+ * A function that compares positions, useful for sorting
+ */
+ static compare(a: IPosition, b: IPosition): number;
+ /**
+ * Clone this position.
+ */
+ clone(): Position;
+ /**
+ * Convert to a human-readable representation.
+ */
+ toString(): string;
+ /**
+ * Create a `Position` from an `IPosition`.
+ */
+ static lift(pos: IPosition): Position;
+ /**
+ * Test if `obj` is an `IPosition`.
+ */
+ static isIPosition(obj: any): obj is IPosition;
+ }
+
+ /**
+ * A range in the editor. This interface is suitable for serialization.
+ */
+ export interface IRange {
+ /**
+ * Line number on which the range starts (starts at 1).
+ */
+ readonly startLineNumber: number;
+ /**
+ * Column on which the range starts in line `startLineNumber` (starts at 1).
+ */
+ readonly startColumn: number;
+ /**
+ * Line number on which the range ends.
+ */
+ readonly endLineNumber: number;
+ /**
+ * Column on which the range ends in line `endLineNumber`.
+ */
+ readonly endColumn: number;
+ }
+
+ /**
+ * A range in the editor. (startLineNumber,startColumn) is <= (endLineNumber,endColumn)
+ */
+ export class Range {
+ /**
+ * Line number on which the range starts (starts at 1).
+ */
+ readonly startLineNumber: number;
+ /**
+ * Column on which the range starts in line `startLineNumber` (starts at 1).
+ */
+ readonly startColumn: number;
+ /**
+ * Line number on which the range ends.
+ */
+ readonly endLineNumber: number;
+ /**
+ * Column on which the range ends in line `endLineNumber`.
+ */
+ readonly endColumn: number;
+ constructor(startLineNumber: number, startColumn: number, endLineNumber: number, endColumn: number);
+ /**
+ * Test if this range is empty.
+ */
+ isEmpty(): boolean;
+ /**
+ * Test if `range` is empty.
+ */
+ static isEmpty(range: IRange): boolean;
+ /**
+ * Test if position is in this range. If the position is at the edges, will return true.
+ */
+ containsPosition(position: IPosition): boolean;
+ /**
+ * Test if `position` is in `range`. If the position is at the edges, will return true.
+ */
+ static containsPosition(range: IRange, position: IPosition): boolean;
+ /**
+ * Test if range is in this range. If the range is equal to this range, will return true.
+ */
+ containsRange(range: IRange): boolean;
+ /**
+ * Test if `otherRange` is in `range`. If the ranges are equal, will return true.
+ */
+ static containsRange(range: IRange, otherRange: IRange): boolean;
+ /**
+ * Test if `range` is strictly in this range. `range` must start after and end before this range for the result to be true.
+ */
+ strictContainsRange(range: IRange): boolean;
+ /**
+ * Test if `otherRange` is strinctly in `range` (must start after, and end before). If the ranges are equal, will return false.
+ */
+ static strictContainsRange(range: IRange, otherRange: IRange): boolean;
+ /**
+ * A reunion of the two ranges.
+ * The smallest position will be used as the start point, and the largest one as the end point.
+ */
+ plusRange(range: IRange): Range;
+ /**
+ * A reunion of the two ranges.
+ * The smallest position will be used as the start point, and the largest one as the end point.
+ */
+ static plusRange(a: IRange, b: IRange): Range;
+ /**
+ * A intersection of the two ranges.
+ */
+ intersectRanges(range: IRange): Range | null;
+ /**
+ * A intersection of the two ranges.
+ */
+ static intersectRanges(a: IRange, b: IRange): Range | null;
+ /**
+ * Test if this range equals other.
+ */
+ equalsRange(other: IRange | null): boolean;
+ /**
+ * Test if range `a` equals `b`.
+ */
+ static equalsRange(a: IRange | null, b: IRange | null): boolean;
+ /**
+ * Return the end position (which will be after or equal to the start position)
+ */
+ getEndPosition(): Position;
+ /**
+ * Return the end position (which will be after or equal to the start position)
+ */
+ static getEndPosition(range: IRange): Position;
+ /**
+ * Return the start position (which will be before or equal to the end position)
+ */
+ getStartPosition(): Position;
+ /**
+ * Return the start position (which will be before or equal to the end position)
+ */
+ static getStartPosition(range: IRange): Position;
+ /**
+ * Transform to a user presentable string representation.
+ */
+ toString(): string;
+ /**
+ * Create a new range using this range's start position, and using endLineNumber and endColumn as the end position.
+ */
+ setEndPosition(endLineNumber: number, endColumn: number): Range;
+ /**
+ * Create a new range using this range's end position, and using startLineNumber and startColumn as the start position.
+ */
+ setStartPosition(startLineNumber: number, startColumn: number): Range;
+ /**
+ * Create a new empty range using this range's start position.
+ */
+ collapseToStart(): Range;
+ /**
+ * Create a new empty range using this range's start position.
+ */
+ static collapseToStart(range: IRange): Range;
+ static fromPositions(start: IPosition, end?: IPosition): Range;
+ /**
+ * Create a `Range` from an `IRange`.
+ */
+ static lift(range: undefined | null): null;
+ static lift(range: IRange): Range;
+ /**
+ * Test if `obj` is an `IRange`.
+ */
+ static isIRange(obj: any): obj is IRange;
+ /**
+ * Test if the two ranges are touching in any way.
+ */
+ static areIntersectingOrTouching(a: IRange, b: IRange): boolean;
+ /**
+ * Test if the two ranges are intersecting. If the ranges are touching it returns true.
+ */
+ static areIntersecting(a: IRange, b: IRange): boolean;
+ /**
+ * A function that compares ranges, useful for sorting ranges
+ * It will first compare ranges on the startPosition and then on the endPosition
+ */
+ static compareRangesUsingStarts(a: IRange | null | undefined, b: IRange | null | undefined): number;
+ /**
+ * A function that compares ranges, useful for sorting ranges
+ * It will first compare ranges on the endPosition and then on the startPosition
+ */
+ static compareRangesUsingEnds(a: IRange, b: IRange): number;
+ /**
+ * Test if the range spans multiple lines.
+ */
+ static spansMultipleLines(range: IRange): boolean;
+ }
+
+ /**
+ * A selection in the editor.
+ * The selection is a range that has an orientation.
+ */
+ export interface ISelection {
+ /**
+ * The line number on which the selection has started.
+ */
+ readonly selectionStartLineNumber: number;
+ /**
+ * The column on `selectionStartLineNumber` where the selection has started.
+ */
+ readonly selectionStartColumn: number;
+ /**
+ * The line number on which the selection has ended.
+ */
+ readonly positionLineNumber: number;
+ /**
+ * The column on `positionLineNumber` where the selection has ended.
+ */
+ readonly positionColumn: number;
+ }
+
+ /**
+ * A selection in the editor.
+ * The selection is a range that has an orientation.
+ */
+ export class Selection extends Range {
+ /**
+ * The line number on which the selection has started.
+ */
+ readonly selectionStartLineNumber: number;
+ /**
+ * The column on `selectionStartLineNumber` where the selection has started.
+ */
+ readonly selectionStartColumn: number;
+ /**
+ * The line number on which the selection has ended.
+ */
+ readonly positionLineNumber: number;
+ /**
+ * The column on `positionLineNumber` where the selection has ended.
+ */
+ readonly positionColumn: number;
+ constructor(selectionStartLineNumber: number, selectionStartColumn: number, positionLineNumber: number, positionColumn: number);
+ /**
+ * Transform to a human-readable representation.
+ */
+ toString(): string;
+ /**
+ * Test if equals other selection.
+ */
+ equalsSelection(other: ISelection): boolean;
+ /**
+ * Test if the two selections are equal.
+ */
+ static selectionsEqual(a: ISelection, b: ISelection): boolean;
+ /**
+ * Get directions (LTR or RTL).
+ */
+ getDirection(): SelectionDirection;
+ /**
+ * Create a new selection with a different `positionLineNumber` and `positionColumn`.
+ */
+ setEndPosition(endLineNumber: number, endColumn: number): Selection;
+ /**
+ * Get the position at `positionLineNumber` and `positionColumn`.
+ */
+ getPosition(): Position;
+ /**
+ * Create a new selection with a different `selectionStartLineNumber` and `selectionStartColumn`.
+ */
+ setStartPosition(startLineNumber: number, startColumn: number): Selection;
+ /**
+ * Create a `Selection` from one or two positions
+ */
+ static fromPositions(start: IPosition, end?: IPosition): Selection;
+ /**
+ * Create a `Selection` from an `ISelection`.
+ */
+ static liftSelection(sel: ISelection): Selection;
+ /**
+ * `a` equals `b`.
+ */
+ static selectionsArrEqual(a: ISelection[], b: ISelection[]): boolean;
+ /**
+ * Test if `obj` is an `ISelection`.
+ */
+ static isISelection(obj: any): obj is ISelection;
+ /**
+ * Create with a direction.
+ */
+ static createWithDirection(startLineNumber: number, startColumn: number, endLineNumber: number, endColumn: number, direction: SelectionDirection): Selection;
+ }
+
+ /**
+ * The direction of a selection.
+ */
+ export enum SelectionDirection {
+ /**
+ * The selection starts above where it ends.
+ */
+ LTR = 0,
+ /**
+ * The selection starts below where it ends.
+ */
+ RTL = 1
+ }
+
+ export class Token {
+ _tokenBrand: void;
+ readonly offset: number;
+ readonly type: string;
+ readonly language: string;
+ constructor(offset: number, type: string, language: string);
+ toString(): string;
+ }
+}
+
+declare namespace monaco.editor {
+
+ export interface IDiffNavigator {
+ canNavigate(): boolean;
+ next(): void;
+ previous(): void;
+ dispose(): void;
+ }
+
+ /**
+ * Create a new editor under `domElement`.
+ * `domElement` should be empty (not contain other dom nodes).
+ * The editor will read the size of `domElement`.
+ */
+ export function create(domElement: HTMLElement, options?: IStandaloneEditorConstructionOptions, override?: IEditorOverrideServices): IStandaloneCodeEditor;
+
+ /**
+ * Emitted when an editor is created.
+ * Creating a diff editor might cause this listener to be invoked with the two editors.
+ * @event
+ */
+ export function onDidCreateEditor(listener: (codeEditor: ICodeEditor) => void): IDisposable;
+
+ /**
+ * Create a new diff editor under `domElement`.
+ * `domElement` should be empty (not contain other dom nodes).
+ * The editor will read the size of `domElement`.
+ */
+ export function createDiffEditor(domElement: HTMLElement, options?: IDiffEditorConstructionOptions, override?: IEditorOverrideServices): IStandaloneDiffEditor;
+
+ export interface IDiffNavigatorOptions {
+ readonly followsCaret?: boolean;
+ readonly ignoreCharChanges?: boolean;
+ readonly alwaysRevealFirst?: boolean;
+ }
+
+ export function createDiffNavigator(diffEditor: IStandaloneDiffEditor, opts?: IDiffNavigatorOptions): IDiffNavigator;
+
+ /**
+ * Create a new editor model.
+ * You can specify the language that should be set for this model or let the language be inferred from the `uri`.
+ */
+ export function createModel(value: string, language?: string, uri?: Uri): ITextModel;
+
+ /**
+ * Change the language for a model.
+ */
+ export function setModelLanguage(model: ITextModel, languageId: string): void;
+
+ /**
+ * Set the markers for a model.
+ */
+ export function setModelMarkers(model: ITextModel, owner: string, markers: IMarkerData[]): void;
+
+ /**
+ * Get markers for owner and/or resource
+ *
+ * @returns list of markers
+ */
+ export function getModelMarkers(filter: {
+ owner?: string;
+ resource?: Uri;
+ take?: number;
+ }): IMarker[];
+
+ /**
+ * Emitted when markers change for a model.
+ * @event
+ */
+ export function onDidChangeMarkers(listener: (e: readonly Uri[]) => void): IDisposable;
+
+ /**
+ * Get the model that has `uri` if it exists.
+ */
+ export function getModel(uri: Uri): ITextModel | null;
+
+ /**
+ * Get all the created models.
+ */
+ export function getModels(): ITextModel[];
+
+ /**
+ * Emitted when a model is created.
+ * @event
+ */
+ export function onDidCreateModel(listener: (model: ITextModel) => void): IDisposable;
+
+ /**
+ * Emitted right before a model is disposed.
+ * @event
+ */
+ export function onWillDisposeModel(listener: (model: ITextModel) => void): IDisposable;
+
+ /**
+ * Emitted when a different language is set to a model.
+ * @event
+ */
+ export function onDidChangeModelLanguage(listener: (e: {
+ readonly model: ITextModel;
+ readonly oldLanguage: string;
+ }) => void): IDisposable;
+
+ /**
+ * Create a new web worker that has model syncing capabilities built in.
+ * Specify an AMD module to load that will `create` an object that will be proxied.
+ */
+ export function createWebWorker(opts: IWebWorkerOptions): MonacoWebWorker;
+
+ /**
+ * Colorize the contents of `domNode` using attribute `data-lang`.
+ */
+ export function colorizeElement(domNode: HTMLElement, options: IColorizerElementOptions): Promise;
+
+ /**
+ * Colorize `text` using language `languageId`.
+ */
+ export function colorize(text: string, languageId: string, options: IColorizerOptions): Promise;
+
+ /**
+ * Colorize a line in a model.
+ */
+ export function colorizeModelLine(model: ITextModel, lineNumber: number, tabSize?: number): string;
+
+ /**
+ * Tokenize `text` using language `languageId`
+ */
+ export function tokenize(text: string, languageId: string): Token[][];
+
+ /**
+ * Define a new theme or update an existing theme.
+ */
+ export function defineTheme(themeName: string, themeData: IStandaloneThemeData): void;
+
+ /**
+ * Switches to a theme.
+ */
+ export function setTheme(themeName: string): void;
+
+ /**
+ * Clears all cached font measurements and triggers re-measurement.
+ */
+ export function remeasureFonts(): void;
+
+ /**
+ * Register a command.
+ */
+ export function registerCommand(id: string, handler: (accessor: any, ...args: any[]) => void): IDisposable;
+
+ export type BuiltinTheme = 'vs' | 'vs-dark' | 'hc-black';
+
+ export interface IStandaloneThemeData {
+ base: BuiltinTheme;
+ inherit: boolean;
+ rules: ITokenThemeRule[];
+ encodedTokensColors?: string[];
+ colors: IColors;
+ }
+
+ export type IColors = {
+ [colorId: string]: string;
+ };
+
+ export interface ITokenThemeRule {
+ token: string;
+ foreground?: string;
+ background?: string;
+ fontStyle?: string;
+ }
+
+ /**
+ * A web worker that can provide a proxy to an arbitrary file.
+ */
+ export interface MonacoWebWorker {
+ /**
+ * Terminate the web worker, thus invalidating the returned proxy.
+ */
+ dispose(): void;
+ /**
+ * Get a proxy to the arbitrary loaded code.
+ */
+ getProxy(): Promise;
+ /**
+ * Synchronize (send) the models at `resources` to the web worker,
+ * making them available in the monaco.worker.getMirrorModels().
+ */
+ withSyncedResources(resources: Uri[]): Promise;
+ }
+
+ export interface IWebWorkerOptions {
+ /**
+ * The AMD moduleId to load.
+ * It should export a function `create` that should return the exported proxy.
+ */
+ moduleId: string;
+ /**
+ * The data to send over when calling create on the module.
+ */
+ createData?: any;
+ /**
+ * A label to be used to identify the web worker for debugging purposes.
+ */
+ label?: string;
+ /**
+ * An object that can be used by the web worker to make calls back to the main thread.
+ */
+ host?: any;
+ /**
+ * Keep idle models.
+ * Defaults to false, which means that idle models will stop syncing after a while.
+ */
+ keepIdleModels?: boolean;
+ }
+
+ /**
+ * Description of an action contribution
+ */
+ export interface IActionDescriptor {
+ /**
+ * An unique identifier of the contributed action.
+ */
+ id: string;
+ /**
+ * A label of the action that will be presented to the user.
+ */
+ label: string;
+ /**
+ * Precondition rule.
+ */
+ precondition?: string;
+ /**
+ * An array of keybindings for the action.
+ */
+ keybindings?: number[];
+ /**
+ * The keybinding rule (condition on top of precondition).
+ */
+ keybindingContext?: string;
+ /**
+ * Control if the action should show up in the context menu and where.
+ * The context menu of the editor has these default:
+ * navigation - The navigation group comes first in all cases.
+ * 1_modification - This group comes next and contains commands that modify your code.
+ * 9_cutcopypaste - The last default group with the basic editing commands.
+ * You can also create your own group.
+ * Defaults to null (don't show in context menu).
+ */
+ contextMenuGroupId?: string;
+ /**
+ * Control the order in the context menu group.
+ */
+ contextMenuOrder?: number;
+ /**
+ * Method that will be executed when the action is triggered.
+ * @param editor The editor instance is passed in as a convenience
+ */
+ run(editor: ICodeEditor, ...args: any[]): void | Promise;
+ }
+
+ /**
+ * Options which apply for all editors.
+ */
+ export interface IGlobalEditorOptions {
+ /**
+ * The number of spaces a tab is equal to.
+ * This setting is overridden based on the file contents when `detectIndentation` is on.
+ * Defaults to 4.
+ */
+ tabSize?: number;
+ /**
+ * Insert spaces when pressing `Tab`.
+ * This setting is overridden based on the file contents when `detectIndentation` is on.
+ * Defaults to true.
+ */
+ insertSpaces?: boolean;
+ /**
+ * Controls whether `tabSize` and `insertSpaces` will be automatically detected when a file is opened based on the file contents.
+ * Defaults to true.
+ */
+ detectIndentation?: boolean;
+ /**
+ * Remove trailing auto inserted whitespace.
+ * Defaults to true.
+ */
+ trimAutoWhitespace?: boolean;
+ /**
+ * Special handling for large files to disable certain memory intensive features.
+ * Defaults to true.
+ */
+ largeFileOptimizations?: boolean;
+ /**
+ * Controls whether completions should be computed based on words in the document.
+ * Defaults to true.
+ */
+ wordBasedSuggestions?: boolean;
+ /**
+ * Controls whether word based completions should be included from opened documents of the same language or any language.
+ */
+ wordBasedSuggestionsOnlySameLanguage?: boolean;
+ /**
+ * Controls whether the semanticHighlighting is shown for the languages that support it.
+ * true: semanticHighlighting is enabled for all themes
+ * false: semanticHighlighting is disabled for all themes
+ * 'configuredByTheme': semanticHighlighting is controlled by the current color theme's semanticHighlighting setting.
+ * Defaults to 'byTheme'.
+ */
+ 'semanticHighlighting.enabled'?: true | false | 'configuredByTheme';
+ /**
+ * Keep peek editors open even when double clicking their content or when hitting `Escape`.
+ * Defaults to false.
+ */
+ stablePeek?: boolean;
+ /**
+ * Lines above this length will not be tokenized for performance reasons.
+ * Defaults to 20000.
+ */
+ maxTokenizationLineLength?: number;
+ /**
+ * Theme to be used for rendering.
+ * The current out-of-the-box available themes are: 'vs' (default), 'vs-dark', 'hc-black'.
+ * You can create custom themes via `monaco.editor.defineTheme`.
+ * To switch a theme, use `monaco.editor.setTheme`.
+ * **NOTE**: The theme might be overwritten if the OS is in high contrast mode, unless `autoDetectHighContrast` is set to false.
+ */
+ theme?: string;
+ /**
+ * If enabled, will automatically change to high contrast theme if the OS is using a high contrast theme.
+ * Defaults to true.
+ */
+ autoDetectHighContrast?: boolean;
+ }
+
+ /**
+ * The options to create an editor.
+ */
+ export interface IStandaloneEditorConstructionOptions extends IEditorConstructionOptions, IGlobalEditorOptions {
+ /**
+ * The initial model associated with this code editor.
+ */
+ model?: ITextModel | null;
+ /**
+ * The initial value of the auto created model in the editor.
+ * To not create automatically a model, use `model: null`.
+ */
+ value?: string;
+ /**
+ * The initial language of the auto created model in the editor.
+ * To not create automatically a model, use `model: null`.
+ */
+ language?: string;
+ /**
+ * Initial theme to be used for rendering.
+ * The current out-of-the-box available themes are: 'vs' (default), 'vs-dark', 'hc-black'.
+ * You can create custom themes via `monaco.editor.defineTheme`.
+ * To switch a theme, use `monaco.editor.setTheme`.
+ * **NOTE**: The theme might be overwritten if the OS is in high contrast mode, unless `autoDetectHighContrast` is set to false.
+ */
+ theme?: string;
+ /**
+ * If enabled, will automatically change to high contrast theme if the OS is using a high contrast theme.
+ * Defaults to true.
+ */
+ autoDetectHighContrast?: boolean;
+ /**
+ * An URL to open when Ctrl+H (Windows and Linux) or Cmd+H (OSX) is pressed in
+ * the accessibility help dialog in the editor.
+ *
+ * Defaults to "https://go.microsoft.com/fwlink/?linkid=852450"
+ */
+ accessibilityHelpUrl?: string;
+ }
+
+ /**
+ * The options to create a diff editor.
+ */
+ export interface IDiffEditorConstructionOptions extends IDiffEditorOptions {
+ /**
+ * Initial theme to be used for rendering.
+ * The current out-of-the-box available themes are: 'vs' (default), 'vs-dark', 'hc-black'.
+ * You can create custom themes via `monaco.editor.defineTheme`.
+ * To switch a theme, use `monaco.editor.setTheme`.
+ * **NOTE**: The theme might be overwritten if the OS is in high contrast mode, unless `autoDetectHighContrast` is set to false.
+ */
+ theme?: string;
+ /**
+ * If enabled, will automatically change to high contrast theme if the OS is using a high contrast theme.
+ * Defaults to true.
+ */
+ autoDetectHighContrast?: boolean;
+ }
+
+ export interface IStandaloneCodeEditor extends ICodeEditor {
+ updateOptions(newOptions: IEditorOptions & IGlobalEditorOptions): void;
+ addCommand(keybinding: number, handler: ICommandHandler, context?: string): string | null;
+ createContextKey(key: string, defaultValue: T): IContextKey;
+ addAction(descriptor: IActionDescriptor): IDisposable;
+ }
+
+ export interface IStandaloneDiffEditor extends IDiffEditor {
+ addCommand(keybinding: number, handler: ICommandHandler, context?: string): string | null;
+ createContextKey(key: string, defaultValue: T): IContextKey;
+ addAction(descriptor: IActionDescriptor): IDisposable;
+ getOriginalEditor(): IStandaloneCodeEditor;
+ getModifiedEditor(): IStandaloneCodeEditor;
+ }
+ export interface ICommandHandler {
+ (...args: any[]): void;
+ }
+
+ export interface IContextKey {
+ set(value: T): void;
+ reset(): void;
+ get(): T | undefined;
+ }
+
+ export interface IEditorOverrideServices {
+ [index: string]: any;
+ }
+
+ export interface IMarker {
+ owner: string;
+ resource: Uri;
+ severity: MarkerSeverity;
+ code?: string | {
+ value: string;
+ target: Uri;
+ };
+ message: string;
+ source?: string;
+ startLineNumber: number;
+ startColumn: number;
+ endLineNumber: number;
+ endColumn: number;
+ relatedInformation?: IRelatedInformation[];
+ tags?: MarkerTag[];
+ }
+
+ /**
+ * A structure defining a problem/warning/etc.
+ */
+ export interface IMarkerData {
+ code?: string | {
+ value: string;
+ target: Uri;
+ };
+ severity: MarkerSeverity;
+ message: string;
+ source?: string;
+ startLineNumber: number;
+ startColumn: number;
+ endLineNumber: number;
+ endColumn: number;
+ relatedInformation?: IRelatedInformation[];
+ tags?: MarkerTag[];
+ }
+
+ /**
+ *
+ */
+ export interface IRelatedInformation {
+ resource: Uri;
+ message: string;
+ startLineNumber: number;
+ startColumn: number;
+ endLineNumber: number;
+ endColumn: number;
+ }
+
+ export interface IColorizerOptions {
+ tabSize?: number;
+ }
+
+ export interface IColorizerElementOptions extends IColorizerOptions {
+ theme?: string;
+ mimeType?: string;
+ }
+
+ export enum ScrollbarVisibility {
+ Auto = 1,
+ Hidden = 2,
+ Visible = 3
+ }
+
+ export interface ThemeColor {
+ id: string;
+ }
+
+ /**
+ * Vertical Lane in the overview ruler of the editor.
+ */
+ export enum OverviewRulerLane {
+ Left = 1,
+ Center = 2,
+ Right = 4,
+ Full = 7
+ }
+
+ /**
+ * Position in the minimap to render the decoration.
+ */
+ export enum MinimapPosition {
+ Inline = 1,
+ Gutter = 2
+ }
+
+ export interface IDecorationOptions {
+ /**
+ * CSS color to render.
+ * e.g.: rgba(100, 100, 100, 0.5) or a color from the color registry
+ */
+ color: string | ThemeColor | undefined;
+ /**
+ * CSS color to render.
+ * e.g.: rgba(100, 100, 100, 0.5) or a color from the color registry
+ */
+ darkColor?: string | ThemeColor;
+ }
+
+ /**
+ * Options for rendering a model decoration in the overview ruler.
+ */
+ export interface IModelDecorationOverviewRulerOptions extends IDecorationOptions {
+ /**
+ * The position in the overview ruler.
+ */
+ position: OverviewRulerLane;
+ }
+
+ /**
+ * Options for rendering a model decoration in the overview ruler.
+ */
+ export interface IModelDecorationMinimapOptions extends IDecorationOptions {
+ /**
+ * The position in the overview ruler.
+ */
+ position: MinimapPosition;
+ }
+
+ /**
+ * Options for a model decoration.
+ */
+ export interface IModelDecorationOptions {
+ /**
+ * Customize the growing behavior of the decoration when typing at the edges of the decoration.
+ * Defaults to TrackedRangeStickiness.AlwaysGrowsWhenTypingAtEdges
+ */
+ stickiness?: TrackedRangeStickiness;
+ /**
+ * CSS class name describing the decoration.
+ */
+ className?: string | null;
+ /**
+ * Message to be rendered when hovering over the glyph margin decoration.
+ */
+ glyphMarginHoverMessage?: IMarkdownString | IMarkdownString[] | null;
+ /**
+ * Array of MarkdownString to render as the decoration message.
+ */
+ hoverMessage?: IMarkdownString | IMarkdownString[] | null;
+ /**
+ * Should the decoration expand to encompass a whole line.
+ */
+ isWholeLine?: boolean;
+ /**
+ * Specifies the stack order of a decoration.
+ * A decoration with greater stack order is always in front of a decoration with a lower stack order.
+ */
+ zIndex?: number;
+ /**
+ * If set, render this decoration in the overview ruler.
+ */
+ overviewRuler?: IModelDecorationOverviewRulerOptions | null;
+ /**
+ * If set, render this decoration in the minimap.
+ */
+ minimap?: IModelDecorationMinimapOptions | null;
+ /**
+ * If set, the decoration will be rendered in the glyph margin with this CSS class name.
+ */
+ glyphMarginClassName?: string | null;
+ /**
+ * If set, the decoration will be rendered in the lines decorations with this CSS class name.
+ */
+ linesDecorationsClassName?: string | null;
+ /**
+ * If set, the decoration will be rendered in the lines decorations with this CSS class name, but only for the first line in case of line wrapping.
+ */
+ firstLineDecorationClassName?: string | null;
+ /**
+ * If set, the decoration will be rendered in the margin (covering its full width) with this CSS class name.
+ */
+ marginClassName?: string | null;
+ /**
+ * If set, the decoration will be rendered inline with the text with this CSS class name.
+ * Please use this only for CSS rules that must impact the text. For example, use `className`
+ * to have a background color decoration.
+ */
+ inlineClassName?: string | null;
+ /**
+ * If there is an `inlineClassName` which affects letter spacing.
+ */
+ inlineClassNameAffectsLetterSpacing?: boolean;
+ /**
+ * If set, the decoration will be rendered before the text with this CSS class name.
+ */
+ beforeContentClassName?: string | null;
+ /**
+ * If set, the decoration will be rendered after the text with this CSS class name.
+ */
+ afterContentClassName?: string | null;
+ /**
+ * If set, text will be injected in the view after the range.
+ */
+ after?: InjectedTextOptions | null;
+ /**
+ * If set, text will be injected in the view before the range.
+ */
+ before?: InjectedTextOptions | null;
+ }
+
+ /**
+ * Configures text that is injected into the view without changing the underlying document.
+ */
+ export interface InjectedTextOptions {
+ /**
+ * Sets the text to inject. Must be a single line.
+ */
+ readonly content: string;
+ /**
+ * If set, the decoration will be rendered inline with the text with this CSS class name.
+ */
+ readonly inlineClassName?: string | null;
+ /**
+ * If there is an `inlineClassName` which affects letter spacing.
+ */
+ readonly inlineClassNameAffectsLetterSpacing?: boolean;
+ }
+
+ /**
+ * New model decorations.
+ */
+ export interface IModelDeltaDecoration {
+ /**
+ * Range that this decoration covers.
+ */
+ range: IRange;
+ /**
+ * Options associated with this decoration.
+ */
+ options: IModelDecorationOptions;
+ }
+
+ /**
+ * A decoration in the model.
+ */
+ export interface IModelDecoration {
+ /**
+ * Identifier for a decoration.
+ */
+ readonly id: string;
+ /**
+ * Identifier for a decoration's owner.
+ */
+ readonly ownerId: number;
+ /**
+ * Range that this decoration covers.
+ */
+ readonly range: Range;
+ /**
+ * Options associated with this decoration.
+ */
+ readonly options: IModelDecorationOptions;
+ }
+
+ /**
+ * Word inside a model.
+ */
+ export interface IWordAtPosition {
+ /**
+ * The word.
+ */
+ readonly word: string;
+ /**
+ * The column where the word starts.
+ */
+ readonly startColumn: number;
+ /**
+ * The column where the word ends.
+ */
+ readonly endColumn: number;
+ }
+
+ /**
+ * End of line character preference.
+ */
+ export enum EndOfLinePreference {
+ /**
+ * Use the end of line character identified in the text buffer.
+ */
+ TextDefined = 0,
+ /**
+ * Use line feed (\n) as the end of line character.
+ */
+ LF = 1,
+ /**
+ * Use carriage return and line feed (\r\n) as the end of line character.
+ */
+ CRLF = 2
+ }
+
+ /**
+ * The default end of line to use when instantiating models.
+ */
+ export enum DefaultEndOfLine {
+ /**
+ * Use line feed (\n) as the end of line character.
+ */
+ LF = 1,
+ /**
+ * Use carriage return and line feed (\r\n) as the end of line character.
+ */
+ CRLF = 2
+ }
+
+ /**
+ * End of line character preference.
+ */
+ export enum EndOfLineSequence {
+ /**
+ * Use line feed (\n) as the end of line character.
+ */
+ LF = 0,
+ /**
+ * Use carriage return and line feed (\r\n) as the end of line character.
+ */
+ CRLF = 1
+ }
+
+ /**
+ * A single edit operation, that acts as a simple replace.
+ * i.e. Replace text at `range` with `text` in model.
+ */
+ export interface ISingleEditOperation {
+ /**
+ * The range to replace. This can be empty to emulate a simple insert.
+ */
+ range: IRange;
+ /**
+ * The text to replace with. This can be null to emulate a simple delete.
+ */
+ text: string | null;
+ /**
+ * This indicates that this operation has "insert" semantics.
+ * i.e. forceMoveMarkers = true => if `range` is collapsed, all markers at the position will be moved.
+ */
+ forceMoveMarkers?: boolean;
+ }
+
+ /**
+ * A single edit operation, that has an identifier.
+ */
+ export interface IIdentifiedSingleEditOperation {
+ /**
+ * The range to replace. This can be empty to emulate a simple insert.
+ */
+ range: IRange;
+ /**
+ * The text to replace with. This can be null to emulate a simple delete.
+ */
+ text: string | null;
+ /**
+ * This indicates that this operation has "insert" semantics.
+ * i.e. forceMoveMarkers = true => if `range` is collapsed, all markers at the position will be moved.
+ */
+ forceMoveMarkers?: boolean;
+ }
+
+ export interface IValidEditOperation {
+ /**
+ * The range to replace. This can be empty to emulate a simple insert.
+ */
+ range: Range;
+ /**
+ * The text to replace with. This can be empty to emulate a simple delete.
+ */
+ text: string;
+ }
+
+ /**
+ * A callback that can compute the cursor state after applying a series of edit operations.
+ */
+ export interface ICursorStateComputer {
+ /**
+ * A callback that can compute the resulting cursors state after some edit operations have been executed.
+ */
+ (inverseEditOperations: IValidEditOperation[]): Selection[] | null;
+ }
+
+ export class TextModelResolvedOptions {
+ _textModelResolvedOptionsBrand: void;
+ readonly tabSize: number;
+ readonly indentSize: number;
+ readonly insertSpaces: boolean;
+ readonly defaultEOL: DefaultEndOfLine;
+ readonly trimAutoWhitespace: boolean;
+ }
+
+ export interface ITextModelUpdateOptions {
+ tabSize?: number;
+ indentSize?: number;
+ insertSpaces?: boolean;
+ trimAutoWhitespace?: boolean;
+ }
+
+ export class FindMatch {
+ _findMatchBrand: void;
+ readonly range: Range;
+ readonly matches: string[] | null;
+ }
+
+ /**
+ * Describes the behavior of decorations when typing/editing near their edges.
+ * Note: Please do not edit the values, as they very carefully match `DecorationRangeBehavior`
+ */
+ export enum TrackedRangeStickiness {
+ AlwaysGrowsWhenTypingAtEdges = 0,
+ NeverGrowsWhenTypingAtEdges = 1,
+ GrowsOnlyWhenTypingBefore = 2,
+ GrowsOnlyWhenTypingAfter = 3
+ }
+
+ /**
+ * A model.
+ */
+ export interface ITextModel {
+ /**
+ * Gets the resource associated with this editor model.
+ */
+ readonly uri: Uri;
+ /**
+ * A unique identifier associated with this model.
+ */
+ readonly id: string;
+ /**
+ * Get the resolved options for this model.
+ */
+ getOptions(): TextModelResolvedOptions;
+ /**
+ * Get the current version id of the model.
+ * Anytime a change happens to the model (even undo/redo),
+ * the version id is incremented.
+ */
+ getVersionId(): number;
+ /**
+ * Get the alternative version id of the model.
+ * This alternative version id is not always incremented,
+ * it will return the same values in the case of undo-redo.
+ */
+ getAlternativeVersionId(): number;
+ /**
+ * Replace the entire text buffer value contained in this model.
+ */
+ setValue(newValue: string): void;
+ /**
+ * Get the text stored in this model.
+ * @param eol The end of line character preference. Defaults to `EndOfLinePreference.TextDefined`.
+ * @param preserverBOM Preserve a BOM character if it was detected when the model was constructed.
+ * @return The text.
+ */
+ getValue(eol?: EndOfLinePreference, preserveBOM?: boolean): string;
+ /**
+ * Get the length of the text stored in this model.
+ */
+ getValueLength(eol?: EndOfLinePreference, preserveBOM?: boolean): number;
+ /**
+ * Get the text in a certain range.
+ * @param range The range describing what text to get.
+ * @param eol The end of line character preference. This will only be used for multiline ranges. Defaults to `EndOfLinePreference.TextDefined`.
+ * @return The text.
+ */
+ getValueInRange(range: IRange, eol?: EndOfLinePreference): string;
+ /**
+ * Get the length of text in a certain range.
+ * @param range The range describing what text length to get.
+ * @return The text length.
+ */
+ getValueLengthInRange(range: IRange): number;
+ /**
+ * Get the character count of text in a certain range.
+ * @param range The range describing what text length to get.
+ */
+ getCharacterCountInRange(range: IRange): number;
+ /**
+ * Get the number of lines in the model.
+ */
+ getLineCount(): number;
+ /**
+ * Get the text for a certain line.
+ */
+ getLineContent(lineNumber: number): string;
+ /**
+ * Get the text length for a certain line.
+ */
+ getLineLength(lineNumber: number): number;
+ /**
+ * Get the text for all lines.
+ */
+ getLinesContent(): string[];
+ /**
+ * Get the end of line sequence predominantly used in the text buffer.
+ * @return EOL char sequence (e.g.: '\n' or '\r\n').
+ */
+ getEOL(): string;
+ /**
+ * Get the end of line sequence predominantly used in the text buffer.
+ */
+ getEndOfLineSequence(): EndOfLineSequence;
+ /**
+ * Get the minimum legal column for line at `lineNumber`
+ */
+ getLineMinColumn(lineNumber: number): number;
+ /**
+ * Get the maximum legal column for line at `lineNumber`
+ */
+ getLineMaxColumn(lineNumber: number): number;
+ /**
+ * Returns the column before the first non whitespace character for line at `lineNumber`.
+ * Returns 0 if line is empty or contains only whitespace.
+ */
+ getLineFirstNonWhitespaceColumn(lineNumber: number): number;
+ /**
+ * Returns the column after the last non whitespace character for line at `lineNumber`.
+ * Returns 0 if line is empty or contains only whitespace.
+ */
+ getLineLastNonWhitespaceColumn(lineNumber: number): number;
+ /**
+ * Create a valid position,
+ */
+ validatePosition(position: IPosition): Position;
+ /**
+ * Advances the given position by the given offset (negative offsets are also accepted)
+ * and returns it as a new valid position.
+ *
+ * If the offset and position are such that their combination goes beyond the beginning or
+ * end of the model, throws an exception.
+ *
+ * If the offset is such that the new position would be in the middle of a multi-byte
+ * line terminator, throws an exception.
+ */
+ modifyPosition(position: IPosition, offset: number): Position;
+ /**
+ * Create a valid range.
+ */
+ validateRange(range: IRange): Range;
+ /**
+ * Converts the position to a zero-based offset.
+ *
+ * The position will be [adjusted](#TextDocument.validatePosition).
+ *
+ * @param position A position.
+ * @return A valid zero-based offset.
+ */
+ getOffsetAt(position: IPosition): number;
+ /**
+ * Converts a zero-based offset to a position.
+ *
+ * @param offset A zero-based offset.
+ * @return A valid [position](#Position).
+ */
+ getPositionAt(offset: number): Position;
+ /**
+ * Get a range covering the entire model
+ */
+ getFullModelRange(): Range;
+ /**
+ * Returns if the model was disposed or not.
+ */
+ isDisposed(): boolean;
+ /**
+ * Search the model.
+ * @param searchString The string used to search. If it is a regular expression, set `isRegex` to true.
+ * @param searchOnlyEditableRange Limit the searching to only search inside the editable range of the model.
+ * @param isRegex Used to indicate that `searchString` is a regular expression.
+ * @param matchCase Force the matching to match lower/upper case exactly.
+ * @param wordSeparators Force the matching to match entire words only. Pass null otherwise.
+ * @param captureMatches The result will contain the captured groups.
+ * @param limitResultCount Limit the number of results
+ * @return The ranges where the matches are. It is empty if not matches have been found.
+ */
+ findMatches(searchString: string, searchOnlyEditableRange: boolean, isRegex: boolean, matchCase: boolean, wordSeparators: string | null, captureMatches: boolean, limitResultCount?: number): FindMatch[];
+ /**
+ * Search the model.
+ * @param searchString The string used to search. If it is a regular expression, set `isRegex` to true.
+ * @param searchScope Limit the searching to only search inside these ranges.
+ * @param isRegex Used to indicate that `searchString` is a regular expression.
+ * @param matchCase Force the matching to match lower/upper case exactly.
+ * @param wordSeparators Force the matching to match entire words only. Pass null otherwise.
+ * @param captureMatches The result will contain the captured groups.
+ * @param limitResultCount Limit the number of results
+ * @return The ranges where the matches are. It is empty if no matches have been found.
+ */
+ findMatches(searchString: string, searchScope: IRange | IRange[], isRegex: boolean, matchCase: boolean, wordSeparators: string | null, captureMatches: boolean, limitResultCount?: number): FindMatch[];
+ /**
+ * Search the model for the next match. Loops to the beginning of the model if needed.
+ * @param searchString The string used to search. If it is a regular expression, set `isRegex` to true.
+ * @param searchStart Start the searching at the specified position.
+ * @param isRegex Used to indicate that `searchString` is a regular expression.
+ * @param matchCase Force the matching to match lower/upper case exactly.
+ * @param wordSeparators Force the matching to match entire words only. Pass null otherwise.
+ * @param captureMatches The result will contain the captured groups.
+ * @return The range where the next match is. It is null if no next match has been found.
+ */
+ findNextMatch(searchString: string, searchStart: IPosition, isRegex: boolean, matchCase: boolean, wordSeparators: string | null, captureMatches: boolean): FindMatch | null;
+ /**
+ * Search the model for the previous match. Loops to the end of the model if needed.
+ * @param searchString The string used to search. If it is a regular expression, set `isRegex` to true.
+ * @param searchStart Start the searching at the specified position.
+ * @param isRegex Used to indicate that `searchString` is a regular expression.
+ * @param matchCase Force the matching to match lower/upper case exactly.
+ * @param wordSeparators Force the matching to match entire words only. Pass null otherwise.
+ * @param captureMatches The result will contain the captured groups.
+ * @return The range where the previous match is. It is null if no previous match has been found.
+ */
+ findPreviousMatch(searchString: string, searchStart: IPosition, isRegex: boolean, matchCase: boolean, wordSeparators: string | null, captureMatches: boolean): FindMatch | null;
+ /**
+ * Get the language associated with this model.
+ */
+ getModeId(): string;
+ /**
+ * Get the word under or besides `position`.
+ * @param position The position to look for a word.
+ * @return The word under or besides `position`. Might be null.
+ */
+ getWordAtPosition(position: IPosition): IWordAtPosition | null;
+ /**
+ * Get the word under or besides `position` trimmed to `position`.column
+ * @param position The position to look for a word.
+ * @return The word under or besides `position`. Will never be null.
+ */
+ getWordUntilPosition(position: IPosition): IWordAtPosition;
+ /**
+ * Perform a minimum amount of operations, in order to transform the decorations
+ * identified by `oldDecorations` to the decorations described by `newDecorations`
+ * and returns the new identifiers associated with the resulting decorations.
+ *
+ * @param oldDecorations Array containing previous decorations identifiers.
+ * @param newDecorations Array describing what decorations should result after the call.
+ * @param ownerId Identifies the editor id in which these decorations should appear. If no `ownerId` is provided, the decorations will appear in all editors that attach this model.
+ * @return An array containing the new decorations identifiers.
+ */
+ deltaDecorations(oldDecorations: string[], newDecorations: IModelDeltaDecoration[], ownerId?: number): string[];
+ /**
+ * Get the options associated with a decoration.
+ * @param id The decoration id.
+ * @return The decoration options or null if the decoration was not found.
+ */
+ getDecorationOptions(id: string): IModelDecorationOptions | null;
+ /**
+ * Get the range associated with a decoration.
+ * @param id The decoration id.
+ * @return The decoration range or null if the decoration was not found.
+ */
+ getDecorationRange(id: string): Range | null;
+ /**
+ * Gets all the decorations for the line `lineNumber` as an array.
+ * @param lineNumber The line number
+ * @param ownerId If set, it will ignore decorations belonging to other owners.
+ * @param filterOutValidation If set, it will ignore decorations specific to validation (i.e. warnings, errors).
+ * @return An array with the decorations
+ */
+ getLineDecorations(lineNumber: number, ownerId?: number, filterOutValidation?: boolean): IModelDecoration[];
+ /**
+ * Gets all the decorations for the lines between `startLineNumber` and `endLineNumber` as an array.
+ * @param startLineNumber The start line number
+ * @param endLineNumber The end line number
+ * @param ownerId If set, it will ignore decorations belonging to other owners.
+ * @param filterOutValidation If set, it will ignore decorations specific to validation (i.e. warnings, errors).
+ * @return An array with the decorations
+ */
+ getLinesDecorations(startLineNumber: number, endLineNumber: number, ownerId?: number, filterOutValidation?: boolean): IModelDecoration[];
+ /**
+ * Gets all the decorations in a range as an array. Only `startLineNumber` and `endLineNumber` from `range` are used for filtering.
+ * So for now it returns all the decorations on the same line as `range`.
+ * @param range The range to search in
+ * @param ownerId If set, it will ignore decorations belonging to other owners.
+ * @param filterOutValidation If set, it will ignore decorations specific to validation (i.e. warnings, errors).
+ * @return An array with the decorations
+ */
+ getDecorationsInRange(range: IRange, ownerId?: number, filterOutValidation?: boolean): IModelDecoration[];
+ /**
+ * Gets all the decorations as an array.
+ * @param ownerId If set, it will ignore decorations belonging to other owners.
+ * @param filterOutValidation If set, it will ignore decorations specific to validation (i.e. warnings, errors).
+ */
+ getAllDecorations(ownerId?: number, filterOutValidation?: boolean): IModelDecoration[];
+ /**
+ * Gets all the decorations that should be rendered in the overview ruler as an array.
+ * @param ownerId If set, it will ignore decorations belonging to other owners.
+ * @param filterOutValidation If set, it will ignore decorations specific to validation (i.e. warnings, errors).
+ */
+ getOverviewRulerDecorations(ownerId?: number, filterOutValidation?: boolean): IModelDecoration[];
+ /**
+ * Gets all the decorations that contain injected text.
+ * @param ownerId If set, it will ignore decorations belonging to other owners.
+ */
+ getInjectedTextDecorations(ownerId?: number): IModelDecoration[];
+ /**
+ * Normalize a string containing whitespace according to indentation rules (converts to spaces or to tabs).
+ */
+ normalizeIndentation(str: string): string;
+ /**
+ * Change the options of this model.
+ */
+ updateOptions(newOpts: ITextModelUpdateOptions): void;
+ /**
+ * Detect the indentation options for this model from its content.
+ */
+ detectIndentation(defaultInsertSpaces: boolean, defaultTabSize: number): void;
+ /**
+ * Close the current undo-redo element.
+ * This offers a way to create an undo/redo stop point.
+ */
+ pushStackElement(): void;
+ /**
+ * Open the current undo-redo element.
+ * This offers a way to remove the current undo/redo stop point.
+ */
+ popStackElement(): void;
+ /**
+ * Push edit operations, basically editing the model. This is the preferred way
+ * of editing the model. The edit operations will land on the undo stack.
+ * @param beforeCursorState The cursor state before the edit operations. This cursor state will be returned when `undo` or `redo` are invoked.
+ * @param editOperations The edit operations.
+ * @param cursorStateComputer A callback that can compute the resulting cursors state after the edit operations have been executed.
+ * @return The cursor state returned by the `cursorStateComputer`.
+ */
+ pushEditOperations(beforeCursorState: Selection[] | null, editOperations: IIdentifiedSingleEditOperation[], cursorStateComputer: ICursorStateComputer): Selection[] | null;
+ /**
+ * Change the end of line sequence. This is the preferred way of
+ * changing the eol sequence. This will land on the undo stack.
+ */
+ pushEOL(eol: EndOfLineSequence): void;
+ /**
+ * Edit the model without adding the edits to the undo stack.
+ * This can have dire consequences on the undo stack! See @pushEditOperations for the preferred way.
+ * @param operations The edit operations.
+ * @return If desired, the inverse edit operations, that, when applied, will bring the model back to the previous state.
+ */
+ applyEdits(operations: IIdentifiedSingleEditOperation[]): void;
+ applyEdits(operations: IIdentifiedSingleEditOperation[], computeUndoEdits: false): void;
+ applyEdits(operations: IIdentifiedSingleEditOperation[], computeUndoEdits: true): IValidEditOperation[];
+ /**
+ * Change the end of line sequence without recording in the undo stack.
+ * This can have dire consequences on the undo stack! See @pushEOL for the preferred way.
+ */
+ setEOL(eol: EndOfLineSequence): void;
+ /**
+ * An event emitted when the contents of the model have changed.
+ * @event
+ */
+ onDidChangeContent(listener: (e: IModelContentChangedEvent) => void): IDisposable;
+ /**
+ * An event emitted when decorations of the model have changed.
+ * @event
+ */
+ onDidChangeDecorations(listener: (e: IModelDecorationsChangedEvent) => void): IDisposable;
+ /**
+ * An event emitted when the model options have changed.
+ * @event
+ */
+ onDidChangeOptions(listener: (e: IModelOptionsChangedEvent) => void): IDisposable;
+ /**
+ * An event emitted when the language associated with the model has changed.
+ * @event
+ */
+ onDidChangeLanguage(listener: (e: IModelLanguageChangedEvent) => void): IDisposable;
+ /**
+ * An event emitted when the language configuration associated with the model has changed.
+ * @event
+ */
+ onDidChangeLanguageConfiguration(listener: (e: IModelLanguageConfigurationChangedEvent) => void): IDisposable;
+ /**
+ * An event emitted when the model has been attached to the first editor or detached from the last editor.
+ * @event
+ */
+ onDidChangeAttached(listener: () => void): IDisposable;
+ /**
+ * An event emitted right before disposing the model.
+ * @event
+ */
+ onWillDispose(listener: () => void): IDisposable;
+ /**
+ * Destroy this model. This will unbind the model from the mode
+ * and make all necessary clean-up to release this object to the GC.
+ */
+ dispose(): void;
+ /**
+ * Returns if this model is attached to an editor or not.
+ */
+ isAttachedToEditor(): boolean;
+ }
+
+ /**
+ * A builder and helper for edit operations for a command.
+ */
+ export interface IEditOperationBuilder {
+ /**
+ * Add a new edit operation (a replace operation).
+ * @param range The range to replace (delete). May be empty to represent a simple insert.
+ * @param text The text to replace with. May be null to represent a simple delete.
+ */
+ addEditOperation(range: IRange, text: string | null, forceMoveMarkers?: boolean): void;
+ /**
+ * Add a new edit operation (a replace operation).
+ * The inverse edits will be accessible in `ICursorStateComputerData.getInverseEditOperations()`
+ * @param range The range to replace (delete). May be empty to represent a simple insert.
+ * @param text The text to replace with. May be null to represent a simple delete.
+ */
+ addTrackedEditOperation(range: IRange, text: string | null, forceMoveMarkers?: boolean): void;
+ /**
+ * Track `selection` when applying edit operations.
+ * A best effort will be made to not grow/expand the selection.
+ * An empty selection will clamp to a nearby character.
+ * @param selection The selection to track.
+ * @param trackPreviousOnEmpty If set, and the selection is empty, indicates whether the selection
+ * should clamp to the previous or the next character.
+ * @return A unique identifier.
+ */
+ trackSelection(selection: Selection, trackPreviousOnEmpty?: boolean): string;
+ }
+
+ /**
+ * A helper for computing cursor state after a command.
+ */
+ export interface ICursorStateComputerData {
+ /**
+ * Get the inverse edit operations of the added edit operations.
+ */
+ getInverseEditOperations(): IValidEditOperation[];
+ /**
+ * Get a previously tracked selection.
+ * @param id The unique identifier returned by `trackSelection`.
+ * @return The selection.
+ */
+ getTrackedSelection(id: string): Selection;
+ }
+
+ /**
+ * A command that modifies text / cursor state on a model.
+ */
+ export interface ICommand {
+ /**
+ * Get the edit operations needed to execute this command.
+ * @param model The model the command will execute on.
+ * @param builder A helper to collect the needed edit operations and to track selections.
+ */
+ getEditOperations(model: ITextModel, builder: IEditOperationBuilder): void;
+ /**
+ * Compute the cursor state after the edit operations were applied.
+ * @param model The model the command has executed on.
+ * @param helper A helper to get inverse edit operations and to get previously tracked selections.
+ * @return The cursor state after the command executed.
+ */
+ computeCursorState(model: ITextModel, helper: ICursorStateComputerData): Selection;
+ }
+
+ /**
+ * A model for the diff editor.
+ */
+ export interface IDiffEditorModel {
+ /**
+ * Original model.
+ */
+ original: ITextModel;
+ /**
+ * Modified model.
+ */
+ modified: ITextModel;
+ }
+
+ /**
+ * An event describing that an editor has had its model reset (i.e. `editor.setModel()`).
+ */
+ export interface IModelChangedEvent {
+ /**
+ * The `uri` of the previous model or null.
+ */
+ readonly oldModelUrl: Uri | null;
+ /**
+ * The `uri` of the new model or null.
+ */
+ readonly newModelUrl: Uri | null;
+ }
+
+ export interface IDimension {
+ width: number;
+ height: number;
+ }
+
+ /**
+ * A change
+ */
+ export interface IChange {
+ readonly originalStartLineNumber: number;
+ readonly originalEndLineNumber: number;
+ readonly modifiedStartLineNumber: number;
+ readonly modifiedEndLineNumber: number;
+ }
+
+ /**
+ * A character level change.
+ */
+ export interface ICharChange extends IChange {
+ readonly originalStartColumn: number;
+ readonly originalEndColumn: number;
+ readonly modifiedStartColumn: number;
+ readonly modifiedEndColumn: number;
+ }
+
+ /**
+ * A line change
+ */
+ export interface ILineChange extends IChange {
+ readonly charChanges: ICharChange[] | undefined;
+ }
+
+ export interface IContentSizeChangedEvent {
+ readonly contentWidth: number;
+ readonly contentHeight: number;
+ readonly contentWidthChanged: boolean;
+ readonly contentHeightChanged: boolean;
+ }
+
+ export interface INewScrollPosition {
+ scrollLeft?: number;
+ scrollTop?: number;
+ }
+
+ export interface IEditorAction {
+ readonly id: string;
+ readonly label: string;
+ readonly alias: string;
+ isSupported(): boolean;
+ run(): Promise;
+ }
+
+ export type IEditorModel = ITextModel | IDiffEditorModel;
+
+ /**
+ * A (serializable) state of the cursors.
+ */
+ export interface ICursorState {
+ inSelectionMode: boolean;
+ selectionStart: IPosition;
+ position: IPosition;
+ }
+
+ /**
+ * A (serializable) state of the view.
+ */
+ export interface IViewState {
+ /** written by previous versions */
+ scrollTop?: number;
+ /** written by previous versions */
+ scrollTopWithoutViewZones?: number;
+ scrollLeft: number;
+ firstPosition: IPosition;
+ firstPositionDeltaTop: number;
+ }
+
+ /**
+ * A (serializable) state of the code editor.
+ */
+ export interface ICodeEditorViewState {
+ cursorState: ICursorState[];
+ viewState: IViewState;
+ contributionsState: {
+ [id: string]: any;
+ };
+ }
+
+ /**
+ * (Serializable) View state for the diff editor.
+ */
+ export interface IDiffEditorViewState {
+ original: ICodeEditorViewState | null;
+ modified: ICodeEditorViewState | null;
+ }
+
+ /**
+ * An editor view state.
+ */
+ export type IEditorViewState = ICodeEditorViewState | IDiffEditorViewState;
+
+ export enum ScrollType {
+ Smooth = 0,
+ Immediate = 1
+ }
+
+ /**
+ * An editor.
+ */
+ export interface IEditor {
+ /**
+ * An event emitted when the editor has been disposed.
+ * @event
+ */
+ onDidDispose(listener: () => void): IDisposable;
+ /**
+ * Dispose the editor.
+ */
+ dispose(): void;
+ /**
+ * Get a unique id for this editor instance.
+ */
+ getId(): string;
+ /**
+ * Get the editor type. Please see `EditorType`.
+ * This is to avoid an instanceof check
+ */
+ getEditorType(): string;
+ /**
+ * Update the editor's options after the editor has been created.
+ */
+ updateOptions(newOptions: IEditorOptions): void;
+ /**
+ * Instructs the editor to remeasure its container. This method should
+ * be called when the container of the editor gets resized.
+ *
+ * If a dimension is passed in, the passed in value will be used.
+ */
+ layout(dimension?: IDimension): void;
+ /**
+ * Brings browser focus to the editor text
+ */
+ focus(): void;
+ /**
+ * Returns true if the text inside this editor is focused (i.e. cursor is blinking).
+ */
+ hasTextFocus(): boolean;
+ /**
+ * Returns all actions associated with this editor.
+ */
+ getSupportedActions(): IEditorAction[];
+ /**
+ * Saves current view state of the editor in a serializable object.
+ */
+ saveViewState(): IEditorViewState | null;
+ /**
+ * Restores the view state of the editor from a serializable object generated by `saveViewState`.
+ */
+ restoreViewState(state: IEditorViewState): void;
+ /**
+ * Given a position, returns a column number that takes tab-widths into account.
+ */
+ getVisibleColumnFromPosition(position: IPosition): number;
+ /**
+ * Returns the primary position of the cursor.
+ */
+ getPosition(): Position | null;
+ /**
+ * Set the primary position of the cursor. This will remove any secondary cursors.
+ * @param position New primary cursor's position
+ */
+ setPosition(position: IPosition): void;
+ /**
+ * Scroll vertically as necessary and reveal a line.
+ */
+ revealLine(lineNumber: number, scrollType?: ScrollType): void;
+ /**
+ * Scroll vertically as necessary and reveal a line centered vertically.
+ */
+ revealLineInCenter(lineNumber: number, scrollType?: ScrollType): void;
+ /**
+ * Scroll vertically as necessary and reveal a line centered vertically only if it lies outside the viewport.
+ */
+ revealLineInCenterIfOutsideViewport(lineNumber: number, scrollType?: ScrollType): void;
+ /**
+ * Scroll vertically as necessary and reveal a line close to the top of the viewport,
+ * optimized for viewing a code definition.
+ */
+ revealLineNearTop(lineNumber: number, scrollType?: ScrollType): void;
+ /**
+ * Scroll vertically or horizontally as necessary and reveal a position.
+ */
+ revealPosition(position: IPosition, scrollType?: ScrollType): void;
+ /**
+ * Scroll vertically or horizontally as necessary and reveal a position centered vertically.
+ */
+ revealPositionInCenter(position: IPosition, scrollType?: ScrollType): void;
+ /**
+ * Scroll vertically or horizontally as necessary and reveal a position centered vertically only if it lies outside the viewport.
+ */
+ revealPositionInCenterIfOutsideViewport(position: IPosition, scrollType?: ScrollType): void;
+ /**
+ * Scroll vertically or horizontally as necessary and reveal a position close to the top of the viewport,
+ * optimized for viewing a code definition.
+ */
+ revealPositionNearTop(position: IPosition, scrollType?: ScrollType): void;
+ /**
+ * Returns the primary selection of the editor.
+ */
+ getSelection(): Selection | null;
+ /**
+ * Returns all the selections of the editor.
+ */
+ getSelections(): Selection[] | null;
+ /**
+ * Set the primary selection of the editor. This will remove any secondary cursors.
+ * @param selection The new selection
+ */
+ setSelection(selection: IRange): void;
+ /**
+ * Set the primary selection of the editor. This will remove any secondary cursors.
+ * @param selection The new selection
+ */
+ setSelection(selection: Range): void;
+ /**
+ * Set the primary selection of the editor. This will remove any secondary cursors.
+ * @param selection The new selection
+ */
+ setSelection(selection: ISelection): void;
+ /**
+ * Set the primary selection of the editor. This will remove any secondary cursors.
+ * @param selection The new selection
+ */
+ setSelection(selection: Selection): void;
+ /**
+ * Set the selections for all the cursors of the editor.
+ * Cursors will be removed or added, as necessary.
+ */
+ setSelections(selections: readonly ISelection[]): void;
+ /**
+ * Scroll vertically as necessary and reveal lines.
+ */
+ revealLines(startLineNumber: number, endLineNumber: number, scrollType?: ScrollType): void;
+ /**
+ * Scroll vertically as necessary and reveal lines centered vertically.
+ */
+ revealLinesInCenter(lineNumber: number, endLineNumber: number, scrollType?: ScrollType): void;
+ /**
+ * Scroll vertically as necessary and reveal lines centered vertically only if it lies outside the viewport.
+ */
+ revealLinesInCenterIfOutsideViewport(lineNumber: number, endLineNumber: number, scrollType?: ScrollType): void;
+ /**
+ * Scroll vertically as necessary and reveal lines close to the top of the viewport,
+ * optimized for viewing a code definition.
+ */
+ revealLinesNearTop(lineNumber: number, endLineNumber: number, scrollType?: ScrollType): void;
+ /**
+ * Scroll vertically or horizontally as necessary and reveal a range.
+ */
+ revealRange(range: IRange, scrollType?: ScrollType): void;
+ /**
+ * Scroll vertically or horizontally as necessary and reveal a range centered vertically.
+ */
+ revealRangeInCenter(range: IRange, scrollType?: ScrollType): void;
+ /**
+ * Scroll vertically or horizontally as necessary and reveal a range at the top of the viewport.
+ */
+ revealRangeAtTop(range: IRange, scrollType?: ScrollType): void;
+ /**
+ * Scroll vertically or horizontally as necessary and reveal a range centered vertically only if it lies outside the viewport.
+ */
+ revealRangeInCenterIfOutsideViewport(range: IRange, scrollType?: ScrollType): void;
+ /**
+ * Scroll vertically or horizontally as necessary and reveal a range close to the top of the viewport,
+ * optimized for viewing a code definition.
+ */
+ revealRangeNearTop(range: IRange, scrollType?: ScrollType): void;
+ /**
+ * Scroll vertically or horizontally as necessary and reveal a range close to the top of the viewport,
+ * optimized for viewing a code definition. Only if it lies outside the viewport.
+ */
+ revealRangeNearTopIfOutsideViewport(range: IRange, scrollType?: ScrollType): void;
+ /**
+ * Directly trigger a handler or an editor action.
+ * @param source The source of the call.
+ * @param handlerId The id of the handler or the id of a contribution.
+ * @param payload Extra data to be sent to the handler.
+ */
+ trigger(source: string | null | undefined, handlerId: string, payload: any): void;
+ /**
+ * Gets the current model attached to this editor.
+ */
+ getModel(): IEditorModel | null;
+ /**
+ * Sets the current model attached to this editor.
+ * If the previous model was created by the editor via the value key in the options
+ * literal object, it will be destroyed. Otherwise, if the previous model was set
+ * via setModel, or the model key in the options literal object, the previous model
+ * will not be destroyed.
+ * It is safe to call setModel(null) to simply detach the current model from the editor.
+ */
+ setModel(model: IEditorModel | null): void;
+ }
+
+ /**
+ * An editor contribution that gets created every time a new editor gets created and gets disposed when the editor gets disposed.
+ */
+ export interface IEditorContribution {
+ /**
+ * Dispose this contribution.
+ */
+ dispose(): void;
+ /**
+ * Store view state.
+ */
+ saveViewState?(): any;
+ /**
+ * Restore view state.
+ */
+ restoreViewState?(state: any): void;
+ }
+
+ /**
+ * The type of the `IEditor`.
+ */
+ export const EditorType: {
+ ICodeEditor: string;
+ IDiffEditor: string;
+ };
+
+ /**
+ * An event describing that the current mode associated with a model has changed.
+ */
+ export interface IModelLanguageChangedEvent {
+ /**
+ * Previous language
+ */
+ readonly oldLanguage: string;
+ /**
+ * New language
+ */
+ readonly newLanguage: string;
+ }
+
+ /**
+ * An event describing that the language configuration associated with a model has changed.
+ */
+ export interface IModelLanguageConfigurationChangedEvent {
+ }
+
+ export interface IModelContentChange {
+ /**
+ * The range that got replaced.
+ */
+ readonly range: IRange;
+ /**
+ * The offset of the range that got replaced.
+ */
+ readonly rangeOffset: number;
+ /**
+ * The length of the range that got replaced.
+ */
+ readonly rangeLength: number;
+ /**
+ * The new text for the range.
+ */
+ readonly text: string;
+ }
+
+ /**
+ * An event describing a change in the text of a model.
+ */
+ export interface IModelContentChangedEvent {
+ readonly changes: IModelContentChange[];
+ /**
+ * The (new) end-of-line character.
+ */
+ readonly eol: string;
+ /**
+ * The new version id the model has transitioned to.
+ */
+ readonly versionId: number;
+ /**
+ * Flag that indicates that this event was generated while undoing.
+ */
+ readonly isUndoing: boolean;
+ /**
+ * Flag that indicates that this event was generated while redoing.
+ */
+ readonly isRedoing: boolean;
+ /**
+ * Flag that indicates that all decorations were lost with this edit.
+ * The model has been reset to a new value.
+ */
+ readonly isFlush: boolean;
+ }
+
+ /**
+ * An event describing that model decorations have changed.
+ */
+ export interface IModelDecorationsChangedEvent {
+ readonly affectsMinimap: boolean;
+ readonly affectsOverviewRuler: boolean;
+ }
+
+ export interface IModelOptionsChangedEvent {
+ readonly tabSize: boolean;
+ readonly indentSize: boolean;
+ readonly insertSpaces: boolean;
+ readonly trimAutoWhitespace: boolean;
+ }
+
+ /**
+ * Describes the reason the cursor has changed its position.
+ */
+ export enum CursorChangeReason {
+ /**
+ * Unknown or not set.
+ */
+ NotSet = 0,
+ /**
+ * A `model.setValue()` was called.
+ */
+ ContentFlush = 1,
+ /**
+ * The `model` has been changed outside of this cursor and the cursor recovers its position from associated markers.
+ */
+ RecoverFromMarkers = 2,
+ /**
+ * There was an explicit user gesture.
+ */
+ Explicit = 3,
+ /**
+ * There was a Paste.
+ */
+ Paste = 4,
+ /**
+ * There was an Undo.
+ */
+ Undo = 5,
+ /**
+ * There was a Redo.
+ */
+ Redo = 6
+ }
+
+ /**
+ * An event describing that the cursor position has changed.
+ */
+ export interface ICursorPositionChangedEvent {
+ /**
+ * Primary cursor's position.
+ */
+ readonly position: Position;
+ /**
+ * Secondary cursors' position.
+ */
+ readonly secondaryPositions: Position[];
+ /**
+ * Reason.
+ */
+ readonly reason: CursorChangeReason;
+ /**
+ * Source of the call that caused the event.
+ */
+ readonly source: string;
+ }
+
+ /**
+ * An event describing that the cursor selection has changed.
+ */
+ export interface ICursorSelectionChangedEvent {
+ /**
+ * The primary selection.
+ */
+ readonly selection: Selection;
+ /**
+ * The secondary selections.
+ */
+ readonly secondarySelections: Selection[];
+ /**
+ * The model version id.
+ */
+ readonly modelVersionId: number;
+ /**
+ * The old selections.
+ */
+ readonly oldSelections: Selection[] | null;
+ /**
+ * The model version id the that `oldSelections` refer to.
+ */
+ readonly oldModelVersionId: number;
+ /**
+ * Source of the call that caused the event.
+ */
+ readonly source: string;
+ /**
+ * Reason.
+ */
+ readonly reason: CursorChangeReason;
+ }
+
+ export enum AccessibilitySupport {
+ /**
+ * This should be the browser case where it is not known if a screen reader is attached or no.
+ */
+ Unknown = 0,
+ Disabled = 1,
+ Enabled = 2
+ }
+
+ /**
+ * Configuration options for auto closing quotes and brackets
+ */
+ export type EditorAutoClosingStrategy = 'always' | 'languageDefined' | 'beforeWhitespace' | 'never';
+
+ /**
+ * Configuration options for auto wrapping quotes and brackets
+ */
+ export type EditorAutoSurroundStrategy = 'languageDefined' | 'quotes' | 'brackets' | 'never';
+
+ /**
+ * Configuration options for typing over closing quotes or brackets
+ */
+ export type EditorAutoClosingEditStrategy = 'always' | 'auto' | 'never';
+
+ /**
+ * Configuration options for auto indentation in the editor
+ */
+ export enum EditorAutoIndentStrategy {
+ None = 0,
+ Keep = 1,
+ Brackets = 2,
+ Advanced = 3,
+ Full = 4
+ }
+
+ /**
+ * Configuration options for the editor.
+ */
+ export interface IEditorOptions {
+ /**
+ * This editor is used inside a diff editor.
+ */
+ inDiffEditor?: boolean;
+ /**
+ * The aria label for the editor's textarea (when it is focused).
+ */
+ ariaLabel?: string;
+ /**
+ * The `tabindex` property of the editor's textarea
+ */
+ tabIndex?: number;
+ /**
+ * Render vertical lines at the specified columns.
+ * Defaults to empty array.
+ */
+ rulers?: (number | IRulerOption)[];
+ /**
+ * A string containing the word separators used when doing word navigation.
+ * Defaults to `~!@#$%^&*()-=+[{]}\\|;:\'",.<>/?
+ */
+ wordSeparators?: string;
+ /**
+ * Enable Linux primary clipboard.
+ * Defaults to true.
+ */
+ selectionClipboard?: boolean;
+ /**
+ * Control the rendering of line numbers.
+ * If it is a function, it will be invoked when rendering a line number and the return value will be rendered.
+ * Otherwise, if it is a truey, line numbers will be rendered normally (equivalent of using an identity function).
+ * Otherwise, line numbers will not be rendered.
+ * Defaults to `on`.
+ */
+ lineNumbers?: LineNumbersType;
+ /**
+ * Controls the minimal number of visible leading and trailing lines surrounding the cursor.
+ * Defaults to 0.
+ */
+ cursorSurroundingLines?: number;
+ /**
+ * Controls when `cursorSurroundingLines` should be enforced
+ * Defaults to `default`, `cursorSurroundingLines` is not enforced when cursor position is changed
+ * by mouse.
+ */
+ cursorSurroundingLinesStyle?: 'default' | 'all';
+ /**
+ * Render last line number when the file ends with a newline.
+ * Defaults to true.
+ */
+ renderFinalNewline?: boolean;
+ /**
+ * Remove unusual line terminators like LINE SEPARATOR (LS), PARAGRAPH SEPARATOR (PS).
+ * Defaults to 'prompt'.
+ */
+ unusualLineTerminators?: 'auto' | 'off' | 'prompt';
+ /**
+ * Should the corresponding line be selected when clicking on the line number?
+ * Defaults to true.
+ */
+ selectOnLineNumbers?: boolean;
+ /**
+ * Control the width of line numbers, by reserving horizontal space for rendering at least an amount of digits.
+ * Defaults to 5.
+ */
+ lineNumbersMinChars?: number;
+ /**
+ * Enable the rendering of the glyph margin.
+ * Defaults to true in vscode and to false in monaco-editor.
+ */
+ glyphMargin?: boolean;
+ /**
+ * The width reserved for line decorations (in px).
+ * Line decorations are placed between line numbers and the editor content.
+ * You can pass in a string in the format floating point followed by "ch". e.g. 1.3ch.
+ * Defaults to 10.
+ */
+ lineDecorationsWidth?: number | string;
+ /**
+ * When revealing the cursor, a virtual padding (px) is added to the cursor, turning it into a rectangle.
+ * This virtual padding ensures that the cursor gets revealed before hitting the edge of the viewport.
+ * Defaults to 30 (px).
+ */
+ revealHorizontalRightPadding?: number;
+ /**
+ * Render the editor selection with rounded borders.
+ * Defaults to true.
+ */
+ roundedSelection?: boolean;
+ /**
+ * Class name to be added to the editor.
+ */
+ extraEditorClassName?: string;
+ /**
+ * Should the editor be read only. See also `domReadOnly`.
+ * Defaults to false.
+ */
+ readOnly?: boolean;
+ /**
+ * Should the textarea used for input use the DOM `readonly` attribute.
+ * Defaults to false.
+ */
+ domReadOnly?: boolean;
+ /**
+ * Enable linked editing.
+ * Defaults to false.
+ */
+ linkedEditing?: boolean;
+ /**
+ * deprecated, use linkedEditing instead
+ */
+ renameOnType?: boolean;
+ /**
+ * Should the editor render validation decorations.
+ * Defaults to editable.
+ */
+ renderValidationDecorations?: 'editable' | 'on' | 'off';
+ /**
+ * Control the behavior and rendering of the scrollbars.
+ */
+ scrollbar?: IEditorScrollbarOptions;
+ /**
+ * Control the behavior and rendering of the minimap.
+ */
+ minimap?: IEditorMinimapOptions;
+ /**
+ * Control the behavior of the find widget.
+ */
+ find?: IEditorFindOptions;
+ /**
+ * Display overflow widgets as `fixed`.
+ * Defaults to `false`.
+ */
+ fixedOverflowWidgets?: boolean;
+ /**
+ * The number of vertical lanes the overview ruler should render.
+ * Defaults to 3.
+ */
+ overviewRulerLanes?: number;
+ /**
+ * Controls if a border should be drawn around the overview ruler.
+ * Defaults to `true`.
+ */
+ overviewRulerBorder?: boolean;
+ /**
+ * Control the cursor animation style, possible values are 'blink', 'smooth', 'phase', 'expand' and 'solid'.
+ * Defaults to 'blink'.
+ */
+ cursorBlinking?: 'blink' | 'smooth' | 'phase' | 'expand' | 'solid';
+ /**
+ * Zoom the font in the editor when using the mouse wheel in combination with holding Ctrl.
+ * Defaults to false.
+ */
+ mouseWheelZoom?: boolean;
+ /**
+ * Control the mouse pointer style, either 'text' or 'default' or 'copy'
+ * Defaults to 'text'
+ */
+ mouseStyle?: 'text' | 'default' | 'copy';
+ /**
+ * Enable smooth caret animation.
+ * Defaults to false.
+ */
+ cursorSmoothCaretAnimation?: boolean;
+ /**
+ * Control the cursor style, either 'block' or 'line'.
+ * Defaults to 'line'.
+ */
+ cursorStyle?: 'line' | 'block' | 'underline' | 'line-thin' | 'block-outline' | 'underline-thin';
+ /**
+ * Control the width of the cursor when cursorStyle is set to 'line'
+ */
+ cursorWidth?: number;
+ /**
+ * Enable font ligatures.
+ * Defaults to false.
+ */
+ fontLigatures?: boolean | string;
+ /**
+ * Disable the use of `transform: translate3d(0px, 0px, 0px)` for the editor margin and lines layers.
+ * The usage of `transform: translate3d(0px, 0px, 0px)` acts as a hint for browsers to create an extra layer.
+ * Defaults to false.
+ */
+ disableLayerHinting?: boolean;
+ /**
+ * Disable the optimizations for monospace fonts.
+ * Defaults to false.
+ */
+ disableMonospaceOptimizations?: boolean;
+ /**
+ * Should the cursor be hidden in the overview ruler.
+ * Defaults to false.
+ */
+ hideCursorInOverviewRuler?: boolean;
+ /**
+ * Enable that scrolling can go one screen size after the last line.
+ * Defaults to true.
+ */
+ scrollBeyondLastLine?: boolean;
+ /**
+ * Enable that scrolling can go beyond the last column by a number of columns.
+ * Defaults to 5.
+ */
+ scrollBeyondLastColumn?: number;
+ /**
+ * Enable that the editor animates scrolling to a position.
+ * Defaults to false.
+ */
+ smoothScrolling?: boolean;
+ /**
+ * Enable that the editor will install an interval to check if its container dom node size has changed.
+ * Enabling this might have a severe performance impact.
+ * Defaults to false.
+ */
+ automaticLayout?: boolean;
+ /**
+ * Control the wrapping of the editor.
+ * When `wordWrap` = "off", the lines will never wrap.
+ * When `wordWrap` = "on", the lines will wrap at the viewport width.
+ * When `wordWrap` = "wordWrapColumn", the lines will wrap at `wordWrapColumn`.
+ * When `wordWrap` = "bounded", the lines will wrap at min(viewport width, wordWrapColumn).
+ * Defaults to "off".
+ */
+ wordWrap?: 'off' | 'on' | 'wordWrapColumn' | 'bounded';
+ /**
+ * Override the `wordWrap` setting.
+ */
+ wordWrapOverride1?: 'off' | 'on' | 'inherit';
+ /**
+ * Override the `wordWrapOverride1` setting.
+ */
+ wordWrapOverride2?: 'off' | 'on' | 'inherit';
+ /**
+ * Control the wrapping of the editor.
+ * When `wordWrap` = "off", the lines will never wrap.
+ * When `wordWrap` = "on", the lines will wrap at the viewport width.
+ * When `wordWrap` = "wordWrapColumn", the lines will wrap at `wordWrapColumn`.
+ * When `wordWrap` = "bounded", the lines will wrap at min(viewport width, wordWrapColumn).
+ * Defaults to 80.
+ */
+ wordWrapColumn?: number;
+ /**
+ * Control indentation of wrapped lines. Can be: 'none', 'same', 'indent' or 'deepIndent'.
+ * Defaults to 'same' in vscode and to 'none' in monaco-editor.
+ */
+ wrappingIndent?: 'none' | 'same' | 'indent' | 'deepIndent';
+ /**
+ * Controls the wrapping strategy to use.
+ * Defaults to 'simple'.
+ */
+ wrappingStrategy?: 'simple' | 'advanced';
+ /**
+ * Configure word wrapping characters. A break will be introduced before these characters.
+ * Defaults to '([{‘“〈《「『【〔([{「£¥$£¥++'.
+ */
+ wordWrapBreakBeforeCharacters?: string;
+ /**
+ * Configure word wrapping characters. A break will be introduced after these characters.
+ * Defaults to ' \t})]?|/&.,;¢°′″‰℃、。。、¢,.:;?!%・・ゝゞヽヾーァィゥェォッャュョヮヵヶぁぃぅぇぉっゃゅょゎゕゖㇰㇱㇲㇳㇴㇵㇶㇷㇸㇹㇺㇻㇼㇽㇾㇿ々〻ァィゥェォャュョッー”〉》」』】〕)]}」'.
+ */
+ wordWrapBreakAfterCharacters?: string;
+ /**
+ * Performance guard: Stop rendering a line after x characters.
+ * Defaults to 10000.
+ * Use -1 to never stop rendering
+ */
+ stopRenderingLineAfter?: number;
+ /**
+ * Configure the editor's hover.
+ */
+ hover?: IEditorHoverOptions;
+ /**
+ * Enable detecting links and making them clickable.
+ * Defaults to true.
+ */
+ links?: boolean;
+ /**
+ * Enable inline color decorators and color picker rendering.
+ */
+ colorDecorators?: boolean;
+ /**
+ * Control the behaviour of comments in the editor.
+ */
+ comments?: IEditorCommentsOptions;
+ /**
+ * Enable custom contextmenu.
+ * Defaults to true.
+ */
+ contextmenu?: boolean;
+ /**
+ * A multiplier to be used on the `deltaX` and `deltaY` of mouse wheel scroll events.
+ * Defaults to 1.
+ */
+ mouseWheelScrollSensitivity?: number;
+ /**
+ * FastScrolling mulitplier speed when pressing `Alt`
+ * Defaults to 5.
+ */
+ fastScrollSensitivity?: number;
+ /**
+ * Enable that the editor scrolls only the predominant axis. Prevents horizontal drift when scrolling vertically on a trackpad.
+ * Defaults to true.
+ */
+ scrollPredominantAxis?: boolean;
+ /**
+ * Enable that the selection with the mouse and keys is doing column selection.
+ * Defaults to false.
+ */
+ columnSelection?: boolean;
+ /**
+ * The modifier to be used to add multiple cursors with the mouse.
+ * Defaults to 'alt'
+ */
+ multiCursorModifier?: 'ctrlCmd' | 'alt';
+ /**
+ * Merge overlapping selections.
+ * Defaults to true
+ */
+ multiCursorMergeOverlapping?: boolean;
+ /**
+ * Configure the behaviour when pasting a text with the line count equal to the cursor count.
+ * Defaults to 'spread'.
+ */
+ multiCursorPaste?: 'spread' | 'full';
+ /**
+ * Configure the editor's accessibility support.
+ * Defaults to 'auto'. It is best to leave this to 'auto'.
+ */
+ accessibilitySupport?: 'auto' | 'off' | 'on';
+ /**
+ * Controls the number of lines in the editor that can be read out by a screen reader
+ */
+ accessibilityPageSize?: number;
+ /**
+ * Suggest options.
+ */
+ suggest?: ISuggestOptions;
+ inlineSuggest?: IInlineSuggestOptions;
+ /**
+ * Smart select options.
+ */
+ smartSelect?: ISmartSelectOptions;
+ /**
+ *
+ */
+ gotoLocation?: IGotoLocationOptions;
+ /**
+ * Enable quick suggestions (shadow suggestions)
+ * Defaults to true.
+ */
+ quickSuggestions?: boolean | IQuickSuggestionsOptions;
+ /**
+ * Quick suggestions show delay (in ms)
+ * Defaults to 10 (ms)
+ */
+ quickSuggestionsDelay?: number;
+ /**
+ * Controls the spacing around the editor.
+ */
+ padding?: IEditorPaddingOptions;
+ /**
+ * Parameter hint options.
+ */
+ parameterHints?: IEditorParameterHintOptions;
+ /**
+ * Options for auto closing brackets.
+ * Defaults to language defined behavior.
+ */
+ autoClosingBrackets?: EditorAutoClosingStrategy;
+ /**
+ * Options for auto closing quotes.
+ * Defaults to language defined behavior.
+ */
+ autoClosingQuotes?: EditorAutoClosingStrategy;
+ /**
+ * Options for pressing backspace near quotes or bracket pairs.
+ */
+ autoClosingDelete?: EditorAutoClosingEditStrategy;
+ /**
+ * Options for typing over closing quotes or brackets.
+ */
+ autoClosingOvertype?: EditorAutoClosingEditStrategy;
+ /**
+ * Options for auto surrounding.
+ * Defaults to always allowing auto surrounding.
+ */
+ autoSurround?: EditorAutoSurroundStrategy;
+ /**
+ * Controls whether the editor should automatically adjust the indentation when users type, paste, move or indent lines.
+ * Defaults to advanced.
+ */
+ autoIndent?: 'none' | 'keep' | 'brackets' | 'advanced' | 'full';
+ /**
+ * Emulate selection behaviour of tab characters when using spaces for indentation.
+ * This means selection will stick to tab stops.
+ */
+ stickyTabStops?: boolean;
+ /**
+ * Enable format on type.
+ * Defaults to false.
+ */
+ formatOnType?: boolean;
+ /**
+ * Enable format on paste.
+ * Defaults to false.
+ */
+ formatOnPaste?: boolean;
+ /**
+ * Controls if the editor should allow to move selections via drag and drop.
+ * Defaults to false.
+ */
+ dragAndDrop?: boolean;
+ /**
+ * Enable the suggestion box to pop-up on trigger characters.
+ * Defaults to true.
+ */
+ suggestOnTriggerCharacters?: boolean;
+ /**
+ * Accept suggestions on ENTER.
+ * Defaults to 'on'.
+ */
+ acceptSuggestionOnEnter?: 'on' | 'smart' | 'off';
+ /**
+ * Accept suggestions on provider defined characters.
+ * Defaults to true.
+ */
+ acceptSuggestionOnCommitCharacter?: boolean;
+ /**
+ * Enable snippet suggestions. Default to 'true'.
+ */
+ snippetSuggestions?: 'top' | 'bottom' | 'inline' | 'none';
+ /**
+ * Copying without a selection copies the current line.
+ */
+ emptySelectionClipboard?: boolean;
+ /**
+ * Syntax highlighting is copied.
+ */
+ copyWithSyntaxHighlighting?: boolean;
+ /**
+ * The history mode for suggestions.
+ */
+ suggestSelection?: 'first' | 'recentlyUsed' | 'recentlyUsedByPrefix';
+ /**
+ * The font size for the suggest widget.
+ * Defaults to the editor font size.
+ */
+ suggestFontSize?: number;
+ /**
+ * The line height for the suggest widget.
+ * Defaults to the editor line height.
+ */
+ suggestLineHeight?: number;
+ /**
+ * Enable tab completion.
+ */
+ tabCompletion?: 'on' | 'off' | 'onlySnippets';
+ /**
+ * Enable selection highlight.
+ * Defaults to true.
+ */
+ selectionHighlight?: boolean;
+ /**
+ * Enable semantic occurrences highlight.
+ * Defaults to true.
+ */
+ occurrencesHighlight?: boolean;
+ /**
+ * Show code lens
+ * Defaults to true.
+ */
+ codeLens?: boolean;
+ /**
+ * Code lens font family. Defaults to editor font family.
+ */
+ codeLensFontFamily?: string;
+ /**
+ * Code lens font size. Default to 90% of the editor font size
+ */
+ codeLensFontSize?: number;
+ /**
+ * Control the behavior and rendering of the code action lightbulb.
+ */
+ lightbulb?: IEditorLightbulbOptions;
+ /**
+ * Timeout for running code actions on save.
+ */
+ codeActionsOnSaveTimeout?: number;
+ /**
+ * Enable code folding.
+ * Defaults to true.
+ */
+ folding?: boolean;
+ /**
+ * Selects the folding strategy. 'auto' uses the strategies contributed for the current document, 'indentation' uses the indentation based folding strategy.
+ * Defaults to 'auto'.
+ */
+ foldingStrategy?: 'auto' | 'indentation';
+ /**
+ * Enable highlight for folded regions.
+ * Defaults to true.
+ */
+ foldingHighlight?: boolean;
+ /**
+ * Auto fold imports folding regions.
+ * Defaults to true.
+ */
+ foldingImportsByDefault?: boolean;
+ /**
+ * Controls whether the fold actions in the gutter stay always visible or hide unless the mouse is over the gutter.
+ * Defaults to 'mouseover'.
+ */
+ showFoldingControls?: 'always' | 'mouseover';
+ /**
+ * Controls whether clicking on the empty content after a folded line will unfold the line.
+ * Defaults to false.
+ */
+ unfoldOnClickAfterEndOfLine?: boolean;
+ /**
+ * Enable highlighting of matching brackets.
+ * Defaults to 'always'.
+ */
+ matchBrackets?: 'never' | 'near' | 'always';
+ /**
+ * Enable rendering of whitespace.
+ * Defaults to 'selection'.
+ */
+ renderWhitespace?: 'none' | 'boundary' | 'selection' | 'trailing' | 'all';
+ /**
+ * Enable rendering of control characters.
+ * Defaults to false.
+ */
+ renderControlCharacters?: boolean;
+ /**
+ * Enable rendering of indent guides.
+ * Defaults to true.
+ */
+ renderIndentGuides?: boolean;
+ /**
+ * Enable highlighting of the active indent guide.
+ * Defaults to true.
+ */
+ highlightActiveIndentGuide?: boolean;
+ /**
+ * Enable rendering of current line highlight.
+ * Defaults to all.
+ */
+ renderLineHighlight?: 'none' | 'gutter' | 'line' | 'all';
+ /**
+ * Control if the current line highlight should be rendered only the editor is focused.
+ * Defaults to false.
+ */
+ renderLineHighlightOnlyWhenFocus?: boolean;
+ /**
+ * Inserting and deleting whitespace follows tab stops.
+ */
+ useTabStops?: boolean;
+ /**
+ * The font family
+ */
+ fontFamily?: string;
+ /**
+ * The font weight
+ */
+ fontWeight?: string;
+ /**
+ * The font size
+ */
+ fontSize?: number;
+ /**
+ * The line height
+ */
+ lineHeight?: number;
+ /**
+ * The letter spacing
+ */
+ letterSpacing?: number;
+ /**
+ * Controls fading out of unused variables.
+ */
+ showUnused?: boolean;
+ /**
+ * Controls whether to focus the inline editor in the peek widget by default.
+ * Defaults to false.
+ */
+ peekWidgetDefaultFocus?: 'tree' | 'editor';
+ /**
+ * Controls whether the definition link opens element in the peek widget.
+ * Defaults to false.
+ */
+ definitionLinkOpensInPeek?: boolean;
+ /**
+ * Controls strikethrough deprecated variables.
+ */
+ showDeprecated?: boolean;
+ /**
+ * Control the behavior and rendering of the inline hints.
+ */
+ inlayHints?: IEditorInlayHintsOptions;
+ /**
+ * Control if the editor should use shadow DOM.
+ */
+ useShadowDOM?: boolean;
+ }
+
+ /**
+ * Configuration options for the diff editor.
+ */
+ export interface IDiffEditorOptions extends IEditorOptions {
+ /**
+ * Allow the user to resize the diff editor split view.
+ * Defaults to true.
+ */
+ enableSplitViewResizing?: boolean;
+ /**
+ * Render the differences in two side-by-side editors.
+ * Defaults to true.
+ */
+ renderSideBySide?: boolean;
+ /**
+ * Timeout in milliseconds after which diff computation is cancelled.
+ * Defaults to 5000.
+ */
+ maxComputationTime?: number;
+ /**
+ * Compute the diff by ignoring leading/trailing whitespace
+ * Defaults to true.
+ */
+ ignoreTrimWhitespace?: boolean;
+ /**
+ * Render +/- indicators for added/deleted changes.
+ * Defaults to true.
+ */
+ renderIndicators?: boolean;
+ /**
+ * Original model should be editable?
+ * Defaults to false.
+ */
+ originalEditable?: boolean;
+ /**
+ * Should the diff editor enable code lens?
+ * Defaults to false.
+ */
+ diffCodeLens?: boolean;
+ /**
+ * Is the diff editor inside another editor
+ * Defaults to false
+ */
+ isInEmbeddedEditor?: boolean;
+ /**
+ * Is the diff editor should render overview ruler
+ * Defaults to true
+ */
+ renderOverviewRuler?: boolean;
+ /**
+ * Control the wrapping of the diff editor.
+ */
+ diffWordWrap?: 'off' | 'on' | 'inherit';
+ /**
+ * Aria label for original editor.
+ */
+ originalAriaLabel?: string;
+ /**
+ * Aria label for modifed editor.
+ */
+ modifiedAriaLabel?: string;
+ }
+
+ /**
+ * An event describing that the configuration of the editor has changed.
+ */
+ export class ConfigurationChangedEvent {
+ hasChanged(id: EditorOption): boolean;
+ }
+
+ /**
+ * All computed editor options.
+ */
+ export interface IComputedEditorOptions {
+ get(id: T): FindComputedEditorOptionValueById;
+ }
+
+ export interface IEditorOption {
+ readonly id: K1;
+ readonly name: string;
+ defaultValue: V;
+ }
+
+ /**
+ * Configuration options for editor comments
+ */
+ export interface IEditorCommentsOptions {
+ /**
+ * Insert a space after the line comment token and inside the block comments tokens.
+ * Defaults to true.
+ */
+ insertSpace?: boolean;
+ /**
+ * Ignore empty lines when inserting line comments.
+ * Defaults to true.
+ */
+ ignoreEmptyLines?: boolean;
+ }
+
+ export type EditorCommentsOptions = Readonly>;
+
+ /**
+ * The kind of animation in which the editor's cursor should be rendered.
+ */
+ export enum TextEditorCursorBlinkingStyle {
+ /**
+ * Hidden
+ */
+ Hidden = 0,
+ /**
+ * Blinking
+ */
+ Blink = 1,
+ /**
+ * Blinking with smooth fading
+ */
+ Smooth = 2,
+ /**
+ * Blinking with prolonged filled state and smooth fading
+ */
+ Phase = 3,
+ /**
+ * Expand collapse animation on the y axis
+ */
+ Expand = 4,
+ /**
+ * No-Blinking
+ */
+ Solid = 5
+ }
+
+ /**
+ * The style in which the editor's cursor should be rendered.
+ */
+ export enum TextEditorCursorStyle {
+ /**
+ * As a vertical line (sitting between two characters).
+ */
+ Line = 1,
+ /**
+ * As a block (sitting on top of a character).
+ */
+ Block = 2,
+ /**
+ * As a horizontal line (sitting under a character).
+ */
+ Underline = 3,
+ /**
+ * As a thin vertical line (sitting between two characters).
+ */
+ LineThin = 4,
+ /**
+ * As an outlined block (sitting on top of a character).
+ */
+ BlockOutline = 5,
+ /**
+ * As a thin horizontal line (sitting under a character).
+ */
+ UnderlineThin = 6
+ }
+
+ /**
+ * Configuration options for editor find widget
+ */
+ export interface IEditorFindOptions {
+ /**
+ * Controls whether the cursor should move to find matches while typing.
+ */
+ cursorMoveOnType?: boolean;
+ /**
+ * Controls if we seed search string in the Find Widget with editor selection.
+ */
+ seedSearchStringFromSelection?: 'never' | 'always' | 'selection';
+ /**
+ * Controls if Find in Selection flag is turned on in the editor.
+ */
+ autoFindInSelection?: 'never' | 'always' | 'multiline';
+ addExtraSpaceOnTop?: boolean;
+ /**
+ * Controls whether the search automatically restarts from the beginning (or the end) when no further matches can be found
+ */
+ loop?: boolean;
+ }
+
+ export type EditorFindOptions = Readonly>;
+
+ export type GoToLocationValues = 'peek' | 'gotoAndPeek' | 'goto';
+
+ /**
+ * Configuration options for go to location
+ */
+ export interface IGotoLocationOptions {
+ multiple?: GoToLocationValues;
+ multipleDefinitions?: GoToLocationValues;
+ multipleTypeDefinitions?: GoToLocationValues;
+ multipleDeclarations?: GoToLocationValues;
+ multipleImplementations?: GoToLocationValues;
+ multipleReferences?: GoToLocationValues;
+ alternativeDefinitionCommand?: string;
+ alternativeTypeDefinitionCommand?: string;
+ alternativeDeclarationCommand?: string;
+ alternativeImplementationCommand?: string;
+ alternativeReferenceCommand?: string;
+ }
+
+ export type GoToLocationOptions = Readonly>;
+
+ /**
+ * Configuration options for editor hover
+ */
+ export interface IEditorHoverOptions {
+ /**
+ * Enable the hover.
+ * Defaults to true.
+ */
+ enabled?: boolean;
+ /**
+ * Delay for showing the hover.
+ * Defaults to 300.
+ */
+ delay?: number;
+ /**
+ * Is the hover sticky such that it can be clicked and its contents selected?
+ * Defaults to true.
+ */
+ sticky?: boolean;
+ }
+
+ export type EditorHoverOptions = Readonly>;
+
+ /**
+ * A description for the overview ruler position.
+ */
+ export interface OverviewRulerPosition {
+ /**
+ * Width of the overview ruler
+ */
+ readonly width: number;
+ /**
+ * Height of the overview ruler
+ */
+ readonly height: number;
+ /**
+ * Top position for the overview ruler
+ */
+ readonly top: number;
+ /**
+ * Right position for the overview ruler
+ */
+ readonly right: number;
+ }
+
+ export enum RenderMinimap {
+ None = 0,
+ Text = 1,
+ Blocks = 2
+ }
+
+ /**
+ * The internal layout details of the editor.
+ */
+ export interface EditorLayoutInfo {
+ /**
+ * Full editor width.
+ */
+ readonly width: number;
+ /**
+ * Full editor height.
+ */
+ readonly height: number;
+ /**
+ * Left position for the glyph margin.
+ */
+ readonly glyphMarginLeft: number;
+ /**
+ * The width of the glyph margin.
+ */
+ readonly glyphMarginWidth: number;
+ /**
+ * Left position for the line numbers.
+ */
+ readonly lineNumbersLeft: number;
+ /**
+ * The width of the line numbers.
+ */
+ readonly lineNumbersWidth: number;
+ /**
+ * Left position for the line decorations.
+ */
+ readonly decorationsLeft: number;
+ /**
+ * The width of the line decorations.
+ */
+ readonly decorationsWidth: number;
+ /**
+ * Left position for the content (actual text)
+ */
+ readonly contentLeft: number;
+ /**
+ * The width of the content (actual text)
+ */
+ readonly contentWidth: number;
+ /**
+ * Layout information for the minimap
+ */
+ readonly minimap: EditorMinimapLayoutInfo;
+ /**
+ * The number of columns (of typical characters) fitting on a viewport line.
+ */
+ readonly viewportColumn: number;
+ readonly isWordWrapMinified: boolean;
+ readonly isViewportWrapping: boolean;
+ readonly wrappingColumn: number;
+ /**
+ * The width of the vertical scrollbar.
+ */
+ readonly verticalScrollbarWidth: number;
+ /**
+ * The height of the horizontal scrollbar.
+ */
+ readonly horizontalScrollbarHeight: number;
+ /**
+ * The position of the overview ruler.
+ */
+ readonly overviewRuler: OverviewRulerPosition;
+ }
+
+ /**
+ * The internal layout details of the editor.
+ */
+ export interface EditorMinimapLayoutInfo {
+ readonly renderMinimap: RenderMinimap;
+ readonly minimapLeft: number;
+ readonly minimapWidth: number;
+ readonly minimapHeightIsEditorHeight: boolean;
+ readonly minimapIsSampling: boolean;
+ readonly minimapScale: number;
+ readonly minimapLineHeight: number;
+ readonly minimapCanvasInnerWidth: number;
+ readonly minimapCanvasInnerHeight: number;
+ readonly minimapCanvasOuterWidth: number;
+ readonly minimapCanvasOuterHeight: number;
+ }
+
+ /**
+ * Configuration options for editor lightbulb
+ */
+ export interface IEditorLightbulbOptions {
+ /**
+ * Enable the lightbulb code action.
+ * Defaults to true.
+ */
+ enabled?: boolean;
+ }
+
+ export type EditorLightbulbOptions = Readonly>;
+
+ /**
+ * Configuration options for editor inlayHints
+ */
+ export interface IEditorInlayHintsOptions {
+ /**
+ * Enable the inline hints.
+ * Defaults to true.
+ */
+ enabled?: boolean;
+ /**
+ * Font size of inline hints.
+ * Default to 90% of the editor font size.
+ */
+ fontSize?: number;
+ /**
+ * Font family of inline hints.
+ * Defaults to editor font family.
+ */
+ fontFamily?: string;
+ }
+
+ export type EditorInlayHintsOptions = Readonly>;
+
+ /**
+ * Configuration options for editor minimap
+ */
+ export interface IEditorMinimapOptions {
+ /**
+ * Enable the rendering of the minimap.
+ * Defaults to true.
+ */
+ enabled?: boolean;
+ /**
+ * Control the side of the minimap in editor.
+ * Defaults to 'right'.
+ */
+ side?: 'right' | 'left';
+ /**
+ * Control the minimap rendering mode.
+ * Defaults to 'actual'.
+ */
+ size?: 'proportional' | 'fill' | 'fit';
+ /**
+ * Control the rendering of the minimap slider.
+ * Defaults to 'mouseover'.
+ */
+ showSlider?: 'always' | 'mouseover';
+ /**
+ * Render the actual text on a line (as opposed to color blocks).
+ * Defaults to true.
+ */
+ renderCharacters?: boolean;
+ /**
+ * Limit the width of the minimap to render at most a certain number of columns.
+ * Defaults to 120.
+ */
+ maxColumn?: number;
+ /**
+ * Relative size of the font in the minimap. Defaults to 1.
+ */
+ scale?: number;
+ }
+
+ export type EditorMinimapOptions = Readonly>;
+
+ /**
+ * Configuration options for editor padding
+ */
+ export interface IEditorPaddingOptions {
+ /**
+ * Spacing between top edge of editor and first line.
+ */
+ top?: number;
+ /**
+ * Spacing between bottom edge of editor and last line.
+ */
+ bottom?: number;
+ }
+
+ export interface InternalEditorPaddingOptions {
+ readonly top: number;
+ readonly bottom: number;
+ }
+
+ /**
+ * Configuration options for parameter hints
+ */
+ export interface IEditorParameterHintOptions {
+ /**
+ * Enable parameter hints.
+ * Defaults to true.
+ */
+ enabled?: boolean;
+ /**
+ * Enable cycling of parameter hints.
+ * Defaults to false.
+ */
+ cycle?: boolean;
+ }
+
+ export type InternalParameterHintOptions = Readonly>;
+
+ /**
+ * Configuration options for quick suggestions
+ */
+ export interface IQuickSuggestionsOptions {
+ other?: boolean;
+ comments?: boolean;
+ strings?: boolean;
+ }
+
+ export type ValidQuickSuggestionsOptions = boolean | Readonly>;
+
+ export type LineNumbersType = 'on' | 'off' | 'relative' | 'interval' | ((lineNumber: number) => string);
+
+ export enum RenderLineNumbersType {
+ Off = 0,
+ On = 1,
+ Relative = 2,
+ Interval = 3,
+ Custom = 4
+ }
+
+ export interface InternalEditorRenderLineNumbersOptions {
+ readonly renderType: RenderLineNumbersType;
+ readonly renderFn: ((lineNumber: number) => string) | null;
+ }
+
+ export interface IRulerOption {
+ readonly column: number;
+ readonly color: string | null;
+ }
+
+ /**
+ * Configuration options for editor scrollbars
+ */
+ export interface IEditorScrollbarOptions {
+ /**
+ * The size of arrows (if displayed).
+ * Defaults to 11.
+ * **NOTE**: This option cannot be updated using `updateOptions()`
+ */
+ arrowSize?: number;
+ /**
+ * Render vertical scrollbar.
+ * Defaults to 'auto'.
+ */
+ vertical?: 'auto' | 'visible' | 'hidden';
+ /**
+ * Render horizontal scrollbar.
+ * Defaults to 'auto'.
+ */
+ horizontal?: 'auto' | 'visible' | 'hidden';
+ /**
+ * Cast horizontal and vertical shadows when the content is scrolled.
+ * Defaults to true.
+ * **NOTE**: This option cannot be updated using `updateOptions()`
+ */
+ useShadows?: boolean;
+ /**
+ * Render arrows at the top and bottom of the vertical scrollbar.
+ * Defaults to false.
+ * **NOTE**: This option cannot be updated using `updateOptions()`
+ */
+ verticalHasArrows?: boolean;
+ /**
+ * Render arrows at the left and right of the horizontal scrollbar.
+ * Defaults to false.
+ * **NOTE**: This option cannot be updated using `updateOptions()`
+ */
+ horizontalHasArrows?: boolean;
+ /**
+ * Listen to mouse wheel events and react to them by scrolling.
+ * Defaults to true.
+ */
+ handleMouseWheel?: boolean;
+ /**
+ * Always consume mouse wheel events (always call preventDefault() and stopPropagation() on the browser events).
+ * Defaults to true.
+ * **NOTE**: This option cannot be updated using `updateOptions()`
+ */
+ alwaysConsumeMouseWheel?: boolean;
+ /**
+ * Height in pixels for the horizontal scrollbar.
+ * Defaults to 10 (px).
+ */
+ horizontalScrollbarSize?: number;
+ /**
+ * Width in pixels for the vertical scrollbar.
+ * Defaults to 10 (px).
+ */
+ verticalScrollbarSize?: number;
+ /**
+ * Width in pixels for the vertical slider.
+ * Defaults to `verticalScrollbarSize`.
+ * **NOTE**: This option cannot be updated using `updateOptions()`
+ */
+ verticalSliderSize?: number;
+ /**
+ * Height in pixels for the horizontal slider.
+ * Defaults to `horizontalScrollbarSize`.
+ * **NOTE**: This option cannot be updated using `updateOptions()`
+ */
+ horizontalSliderSize?: number;
+ /**
+ * Scroll gutter clicks move by page vs jump to position.
+ * Defaults to false.
+ */
+ scrollByPage?: boolean;
+ }
+
+ export interface InternalEditorScrollbarOptions {
+ readonly arrowSize: number;
+ readonly vertical: ScrollbarVisibility;
+ readonly horizontal: ScrollbarVisibility;
+ readonly useShadows: boolean;
+ readonly verticalHasArrows: boolean;
+ readonly horizontalHasArrows: boolean;
+ readonly handleMouseWheel: boolean;
+ readonly alwaysConsumeMouseWheel: boolean;
+ readonly horizontalScrollbarSize: number;
+ readonly horizontalSliderSize: number;
+ readonly verticalScrollbarSize: number;
+ readonly verticalSliderSize: number;
+ readonly scrollByPage: boolean;
+ }
+
+ export interface IInlineSuggestOptions {
+ /**
+ * Enable or disable the rendering of automatic inline completions.
+ */
+ enabled?: boolean;
+ /**
+ * Configures the mode.
+ * Use `prefix` to only show ghost text if the text to replace is a prefix of the suggestion text.
+ * Use `subword` to only show ghost text if the replace text is a subword of the suggestion text.
+ * Use `subwordSmart` to only show ghost text if the replace text is a subword of the suggestion text, but the subword must start after the cursor position.
+ * Defaults to `prefix`.
+ */
+ mode?: 'prefix' | 'subword' | 'subwordSmart';
+ }
+
+ export type InternalInlineSuggestOptions = Readonly>;
+
+ /**
+ * Configuration options for editor suggest widget
+ */
+ export interface ISuggestOptions {
+ /**
+ * Overwrite word ends on accept. Default to false.
+ */
+ insertMode?: 'insert' | 'replace';
+ /**
+ * Enable graceful matching. Defaults to true.
+ */
+ filterGraceful?: boolean;
+ /**
+ * Prevent quick suggestions when a snippet is active. Defaults to true.
+ */
+ snippetsPreventQuickSuggestions?: boolean;
+ /**
+ * Favors words that appear close to the cursor.
+ */
+ localityBonus?: boolean;
+ /**
+ * Enable using global storage for remembering suggestions.
+ */
+ shareSuggestSelections?: boolean;
+ /**
+ * Enable or disable icons in suggestions. Defaults to true.
+ */
+ showIcons?: boolean;
+ /**
+ * Enable or disable the suggest status bar.
+ */
+ showStatusBar?: boolean;
+ /**
+ * Enable or disable the rendering of the suggestion preview.
+ */
+ preview?: boolean;
+ /**
+ * Configures the mode of the preview.
+ */
+ previewMode?: 'prefix' | 'subword' | 'subwordSmart';
+ /**
+ * Show details inline with the label. Defaults to true.
+ */
+ showInlineDetails?: boolean;
+ /**
+ * Show method-suggestions.
+ */
+ showMethods?: boolean;
+ /**
+ * Show function-suggestions.
+ */
+ showFunctions?: boolean;
+ /**
+ * Show constructor-suggestions.
+ */
+ showConstructors?: boolean;
+ /**
+ * Show deprecated-suggestions.
+ */
+ showDeprecated?: boolean;
+ /**
+ * Show field-suggestions.
+ */
+ showFields?: boolean;
+ /**
+ * Show variable-suggestions.
+ */
+ showVariables?: boolean;
+ /**
+ * Show class-suggestions.
+ */
+ showClasses?: boolean;
+ /**
+ * Show struct-suggestions.
+ */
+ showStructs?: boolean;
+ /**
+ * Show interface-suggestions.
+ */
+ showInterfaces?: boolean;
+ /**
+ * Show module-suggestions.
+ */
+ showModules?: boolean;
+ /**
+ * Show property-suggestions.
+ */
+ showProperties?: boolean;
+ /**
+ * Show event-suggestions.
+ */
+ showEvents?: boolean;
+ /**
+ * Show operator-suggestions.
+ */
+ showOperators?: boolean;
+ /**
+ * Show unit-suggestions.
+ */
+ showUnits?: boolean;
+ /**
+ * Show value-suggestions.
+ */
+ showValues?: boolean;
+ /**
+ * Show constant-suggestions.
+ */
+ showConstants?: boolean;
+ /**
+ * Show enum-suggestions.
+ */
+ showEnums?: boolean;
+ /**
+ * Show enumMember-suggestions.
+ */
+ showEnumMembers?: boolean;
+ /**
+ * Show keyword-suggestions.
+ */
+ showKeywords?: boolean;
+ /**
+ * Show text-suggestions.
+ */
+ showWords?: boolean;
+ /**
+ * Show color-suggestions.
+ */
+ showColors?: boolean;
+ /**
+ * Show file-suggestions.
+ */
+ showFiles?: boolean;
+ /**
+ * Show reference-suggestions.
+ */
+ showReferences?: boolean;
+ /**
+ * Show folder-suggestions.
+ */
+ showFolders?: boolean;
+ /**
+ * Show typeParameter-suggestions.
+ */
+ showTypeParameters?: boolean;
+ /**
+ * Show issue-suggestions.
+ */
+ showIssues?: boolean;
+ /**
+ * Show user-suggestions.
+ */
+ showUsers?: boolean;
+ /**
+ * Show snippet-suggestions.
+ */
+ showSnippets?: boolean;
+ }
+
+ export type InternalSuggestOptions = Readonly>;
+
+ export interface ISmartSelectOptions {
+ selectLeadingAndTrailingWhitespace?: boolean;
+ }
+
+ export type SmartSelectOptions = Readonly>;
+
+ /**
+ * Describes how to indent wrapped lines.
+ */
+ export enum WrappingIndent {
+ /**
+ * No indentation => wrapped lines begin at column 1.
+ */
+ None = 0,
+ /**
+ * Same => wrapped lines get the same indentation as the parent.
+ */
+ Same = 1,
+ /**
+ * Indent => wrapped lines get +1 indentation toward the parent.
+ */
+ Indent = 2,
+ /**
+ * DeepIndent => wrapped lines get +2 indentation toward the parent.
+ */
+ DeepIndent = 3
+ }
+
+ export interface EditorWrappingInfo {
+ readonly isDominatedByLongLines: boolean;
+ readonly isWordWrapMinified: boolean;
+ readonly isViewportWrapping: boolean;
+ readonly wrappingColumn: number;
+ }
+
+ export enum EditorOption {
+ acceptSuggestionOnCommitCharacter = 0,
+ acceptSuggestionOnEnter = 1,
+ accessibilitySupport = 2,
+ accessibilityPageSize = 3,
+ ariaLabel = 4,
+ autoClosingBrackets = 5,
+ autoClosingDelete = 6,
+ autoClosingOvertype = 7,
+ autoClosingQuotes = 8,
+ autoIndent = 9,
+ automaticLayout = 10,
+ autoSurround = 11,
+ codeLens = 12,
+ codeLensFontFamily = 13,
+ codeLensFontSize = 14,
+ colorDecorators = 15,
+ columnSelection = 16,
+ comments = 17,
+ contextmenu = 18,
+ copyWithSyntaxHighlighting = 19,
+ cursorBlinking = 20,
+ cursorSmoothCaretAnimation = 21,
+ cursorStyle = 22,
+ cursorSurroundingLines = 23,
+ cursorSurroundingLinesStyle = 24,
+ cursorWidth = 25,
+ disableLayerHinting = 26,
+ disableMonospaceOptimizations = 27,
+ domReadOnly = 28,
+ dragAndDrop = 29,
+ emptySelectionClipboard = 30,
+ extraEditorClassName = 31,
+ fastScrollSensitivity = 32,
+ find = 33,
+ fixedOverflowWidgets = 34,
+ folding = 35,
+ foldingStrategy = 36,
+ foldingHighlight = 37,
+ foldingImportsByDefault = 38,
+ unfoldOnClickAfterEndOfLine = 39,
+ fontFamily = 40,
+ fontInfo = 41,
+ fontLigatures = 42,
+ fontSize = 43,
+ fontWeight = 44,
+ formatOnPaste = 45,
+ formatOnType = 46,
+ glyphMargin = 47,
+ gotoLocation = 48,
+ hideCursorInOverviewRuler = 49,
+ highlightActiveIndentGuide = 50,
+ hover = 51,
+ inDiffEditor = 52,
+ inlineSuggest = 53,
+ letterSpacing = 54,
+ lightbulb = 55,
+ lineDecorationsWidth = 56,
+ lineHeight = 57,
+ lineNumbers = 58,
+ lineNumbersMinChars = 59,
+ linkedEditing = 60,
+ links = 61,
+ matchBrackets = 62,
+ minimap = 63,
+ mouseStyle = 64,
+ mouseWheelScrollSensitivity = 65,
+ mouseWheelZoom = 66,
+ multiCursorMergeOverlapping = 67,
+ multiCursorModifier = 68,
+ multiCursorPaste = 69,
+ occurrencesHighlight = 70,
+ overviewRulerBorder = 71,
+ overviewRulerLanes = 72,
+ padding = 73,
+ parameterHints = 74,
+ peekWidgetDefaultFocus = 75,
+ definitionLinkOpensInPeek = 76,
+ quickSuggestions = 77,
+ quickSuggestionsDelay = 78,
+ readOnly = 79,
+ renameOnType = 80,
+ renderControlCharacters = 81,
+ renderIndentGuides = 82,
+ renderFinalNewline = 83,
+ renderLineHighlight = 84,
+ renderLineHighlightOnlyWhenFocus = 85,
+ renderValidationDecorations = 86,
+ renderWhitespace = 87,
+ revealHorizontalRightPadding = 88,
+ roundedSelection = 89,
+ rulers = 90,
+ scrollbar = 91,
+ scrollBeyondLastColumn = 92,
+ scrollBeyondLastLine = 93,
+ scrollPredominantAxis = 94,
+ selectionClipboard = 95,
+ selectionHighlight = 96,
+ selectOnLineNumbers = 97,
+ showFoldingControls = 98,
+ showUnused = 99,
+ snippetSuggestions = 100,
+ smartSelect = 101,
+ smoothScrolling = 102,
+ stickyTabStops = 103,
+ stopRenderingLineAfter = 104,
+ suggest = 105,
+ suggestFontSize = 106,
+ suggestLineHeight = 107,
+ suggestOnTriggerCharacters = 108,
+ suggestSelection = 109,
+ tabCompletion = 110,
+ tabIndex = 111,
+ unusualLineTerminators = 112,
+ useShadowDOM = 113,
+ useTabStops = 114,
+ wordSeparators = 115,
+ wordWrap = 116,
+ wordWrapBreakAfterCharacters = 117,
+ wordWrapBreakBeforeCharacters = 118,
+ wordWrapColumn = 119,
+ wordWrapOverride1 = 120,
+ wordWrapOverride2 = 121,
+ wrappingIndent = 122,
+ wrappingStrategy = 123,
+ showDeprecated = 124,
+ inlayHints = 125,
+ editorClassName = 126,
+ pixelRatio = 127,
+ tabFocusMode = 128,
+ layoutInfo = 129,
+ wrappingInfo = 130
+ }
+ export const EditorOptions: {
+ acceptSuggestionOnCommitCharacter: IEditorOption;
+ acceptSuggestionOnEnter: IEditorOption;
+ accessibilitySupport: IEditorOption;
+ accessibilityPageSize: IEditorOption;
+ ariaLabel: IEditorOption;
+ autoClosingBrackets: IEditorOption;
+ autoClosingDelete: IEditorOption;
+ autoClosingOvertype: IEditorOption;
+ autoClosingQuotes: IEditorOption;
+ autoIndent: IEditorOption;
+ automaticLayout: IEditorOption;
+ autoSurround: IEditorOption;
+ stickyTabStops: IEditorOption;
+ codeLens: IEditorOption;
+ codeLensFontFamily: IEditorOption;
+ codeLensFontSize: IEditorOption;
+ colorDecorators: IEditorOption;
+ columnSelection: IEditorOption;
+ comments: IEditorOption;
+ contextmenu: IEditorOption;
+ copyWithSyntaxHighlighting: IEditorOption;
+ cursorBlinking: IEditorOption;
+ cursorSmoothCaretAnimation: IEditorOption;
+ cursorStyle: IEditorOption;
+ cursorSurroundingLines: IEditorOption;
+ cursorSurroundingLinesStyle: IEditorOption;
+ cursorWidth: IEditorOption;
+ disableLayerHinting: IEditorOption;
+ disableMonospaceOptimizations: IEditorOption;
+ domReadOnly: IEditorOption;
+ dragAndDrop: IEditorOption;
+ emptySelectionClipboard: IEditorOption;
+ extraEditorClassName: IEditorOption;
+ fastScrollSensitivity: IEditorOption;
+ find: IEditorOption;
+ fixedOverflowWidgets: IEditorOption;
+ folding: IEditorOption;
+ foldingStrategy: IEditorOption;
+ foldingHighlight: IEditorOption;
+ foldingImportsByDefault: IEditorOption;
+ unfoldOnClickAfterEndOfLine: IEditorOption;
+ fontFamily: IEditorOption;
+ fontInfo: IEditorOption;
+ fontLigatures2: IEditorOption;
+ fontSize: IEditorOption;
+ fontWeight: IEditorOption;
+ formatOnPaste: IEditorOption;
+ formatOnType: IEditorOption;
+ glyphMargin: IEditorOption;
+ gotoLocation: IEditorOption;
+ hideCursorInOverviewRuler: IEditorOption;
+ highlightActiveIndentGuide: IEditorOption;
+ hover: IEditorOption;
+ inDiffEditor: IEditorOption;
+ letterSpacing: IEditorOption;
+ lightbulb: IEditorOption;
+ lineDecorationsWidth: IEditorOption;
+ lineHeight: IEditorOption;
+ lineNumbers: IEditorOption;
+ lineNumbersMinChars: IEditorOption;
+ linkedEditing: IEditorOption;
+ links: IEditorOption;
+ matchBrackets: IEditorOption;
+ minimap: IEditorOption;
+ mouseStyle: IEditorOption;
+ mouseWheelScrollSensitivity: IEditorOption;
+ mouseWheelZoom: IEditorOption;
+ multiCursorMergeOverlapping: IEditorOption;
+ multiCursorModifier: IEditorOption;
+ multiCursorPaste: IEditorOption;
+ occurrencesHighlight: IEditorOption;
+ overviewRulerBorder: IEditorOption;
+ overviewRulerLanes: IEditorOption;
+ padding: IEditorOption;
+ parameterHints: IEditorOption;
+ peekWidgetDefaultFocus: IEditorOption;
+ definitionLinkOpensInPeek: IEditorOption;
+ quickSuggestions: IEditorOption;
+ quickSuggestionsDelay: IEditorOption;
+ readOnly: IEditorOption;
+ renameOnType: IEditorOption;
+ renderControlCharacters: IEditorOption;
+ renderIndentGuides: IEditorOption;
+ renderFinalNewline: IEditorOption;
+ renderLineHighlight: IEditorOption;
+ renderLineHighlightOnlyWhenFocus: IEditorOption;
+ renderValidationDecorations: IEditorOption;
+ renderWhitespace: IEditorOption;
+ revealHorizontalRightPadding: IEditorOption;
+ roundedSelection: IEditorOption;
+ rulers: IEditorOption;
+ scrollbar: IEditorOption;
+ scrollBeyondLastColumn: IEditorOption;
+ scrollBeyondLastLine: IEditorOption;
+ scrollPredominantAxis: IEditorOption;
+ selectionClipboard: IEditorOption;
+ selectionHighlight: IEditorOption;
+ selectOnLineNumbers: IEditorOption;
+ showFoldingControls: IEditorOption;
+ showUnused: IEditorOption;
+ showDeprecated: IEditorOption;
+ inlayHints: IEditorOption;
+ snippetSuggestions: IEditorOption;
+ smartSelect: IEditorOption;
+ smoothScrolling: IEditorOption;
+ stopRenderingLineAfter: IEditorOption;
+ suggest: IEditorOption;
+ inlineSuggest: IEditorOption;
+ suggestFontSize: IEditorOption;
+ suggestLineHeight: IEditorOption;
+ suggestOnTriggerCharacters: IEditorOption;
+ suggestSelection: IEditorOption;
+ tabCompletion: IEditorOption;
+ tabIndex: IEditorOption;
+ unusualLineTerminators: IEditorOption;
+ useShadowDOM: IEditorOption;
+ useTabStops: IEditorOption;
+ wordSeparators: IEditorOption;
+ wordWrap: IEditorOption;
+ wordWrapBreakAfterCharacters: IEditorOption;
+ wordWrapBreakBeforeCharacters: IEditorOption;
+ wordWrapColumn: IEditorOption;
+ wordWrapOverride1: IEditorOption;
+ wordWrapOverride2: IEditorOption;
+ wrappingIndent: IEditorOption;
+ wrappingStrategy: IEditorOption;
+ editorClassName: IEditorOption;
+ pixelRatio: IEditorOption;
+ tabFocusMode: IEditorOption;
+ layoutInfo: IEditorOption;
+ wrappingInfo: IEditorOption;
+ };
+
+ type EditorOptionsType = typeof EditorOptions;
+
+ type FindEditorOptionsKeyById = {
+ [K in keyof EditorOptionsType]: EditorOptionsType[K]['id'] extends T ? K : never;
+ }[keyof EditorOptionsType];
+
+ type ComputedEditorOptionValue> = T extends IEditorOption ? R : never;
+
+ export type FindComputedEditorOptionValueById = NonNullable]>>;
+
+ /**
+ * A view zone is a full horizontal rectangle that 'pushes' text down.
+ * The editor reserves space for view zones when rendering.
+ */
+ export interface IViewZone {
+ /**
+ * The line number after which this zone should appear.
+ * Use 0 to place a view zone before the first line number.
+ */
+ afterLineNumber: number;
+ /**
+ * The column after which this zone should appear.
+ * If not set, the maxLineColumn of `afterLineNumber` will be used.
+ */
+ afterColumn?: number;
+ /**
+ * Suppress mouse down events.
+ * If set, the editor will attach a mouse down listener to the view zone and .preventDefault on it.
+ * Defaults to false
+ */
+ suppressMouseDown?: boolean;
+ /**
+ * The height in lines of the view zone.
+ * If specified, `heightInPx` will be used instead of this.
+ * If neither `heightInPx` nor `heightInLines` is specified, a default of `heightInLines` = 1 will be chosen.
+ */
+ heightInLines?: number;
+ /**
+ * The height in px of the view zone.
+ * If this is set, the editor will give preference to it rather than `heightInLines` above.
+ * If neither `heightInPx` nor `heightInLines` is specified, a default of `heightInLines` = 1 will be chosen.
+ */
+ heightInPx?: number;
+ /**
+ * The minimum width in px of the view zone.
+ * If this is set, the editor will ensure that the scroll width is >= than this value.
+ */
+ minWidthInPx?: number;
+ /**
+ * The dom node of the view zone
+ */
+ domNode: HTMLElement;
+ /**
+ * An optional dom node for the view zone that will be placed in the margin area.
+ */
+ marginDomNode?: HTMLElement | null;
+ /**
+ * Callback which gives the relative top of the view zone as it appears (taking scrolling into account).
+ */
+ onDomNodeTop?: (top: number) => void;
+ /**
+ * Callback which gives the height in pixels of the view zone.
+ */
+ onComputedHeight?: (height: number) => void;
+ }
+
+ /**
+ * An accessor that allows for zones to be added or removed.
+ */
+ export interface IViewZoneChangeAccessor {
+ /**
+ * Create a new view zone.
+ * @param zone Zone to create
+ * @return A unique identifier to the view zone.
+ */
+ addZone(zone: IViewZone): string;
+ /**
+ * Remove a zone
+ * @param id A unique identifier to the view zone, as returned by the `addZone` call.
+ */
+ removeZone(id: string): void;
+ /**
+ * Change a zone's position.
+ * The editor will rescan the `afterLineNumber` and `afterColumn` properties of a view zone.
+ */
+ layoutZone(id: string): void;
+ }
+
+ /**
+ * A positioning preference for rendering content widgets.
+ */
+ export enum ContentWidgetPositionPreference {
+ /**
+ * Place the content widget exactly at a position
+ */
+ EXACT = 0,
+ /**
+ * Place the content widget above a position
+ */
+ ABOVE = 1,
+ /**
+ * Place the content widget below a position
+ */
+ BELOW = 2
+ }
+
+ /**
+ * A position for rendering content widgets.
+ */
+ export interface IContentWidgetPosition {
+ /**
+ * Desired position for the content widget.
+ * `preference` will also affect the placement.
+ */
+ position: IPosition | null;
+ /**
+ * Optionally, a range can be provided to further
+ * define the position of the content widget.
+ */
+ range?: IRange | null;
+ /**
+ * Placement preference for position, in order of preference.
+ */
+ preference: ContentWidgetPositionPreference[];
+ }
+
+ /**
+ * A content widget renders inline with the text and can be easily placed 'near' an editor position.
+ */
+ export interface IContentWidget {
+ /**
+ * Render this content widget in a location where it could overflow the editor's view dom node.
+ */
+ allowEditorOverflow?: boolean;
+ suppressMouseDown?: boolean;
+ /**
+ * Get a unique identifier of the content widget.
+ */
+ getId(): string;
+ /**
+ * Get the dom node of the content widget.
+ */
+ getDomNode(): HTMLElement;
+ /**
+ * Get the placement of the content widget.
+ * If null is returned, the content widget will be placed off screen.
+ */
+ getPosition(): IContentWidgetPosition | null;
+ /**
+ * Optional function that is invoked before rendering
+ * the content widget. If a dimension is returned the editor will
+ * attempt to use it.
+ */
+ beforeRender?(): IDimension | null;
+ /**
+ * Optional function that is invoked after rendering the content
+ * widget. Is being invoked with the selected position preference
+ * or `null` if not rendered.
+ */
+ afterRender?(position: ContentWidgetPositionPreference | null): void;
+ }
+
+ /**
+ * A positioning preference for rendering overlay widgets.
+ */
+ export enum OverlayWidgetPositionPreference {
+ /**
+ * Position the overlay widget in the top right corner
+ */
+ TOP_RIGHT_CORNER = 0,
+ /**
+ * Position the overlay widget in the bottom right corner
+ */
+ BOTTOM_RIGHT_CORNER = 1,
+ /**
+ * Position the overlay widget in the top center
+ */
+ TOP_CENTER = 2
+ }
+
+ /**
+ * A position for rendering overlay widgets.
+ */
+ export interface IOverlayWidgetPosition {
+ /**
+ * The position preference for the overlay widget.
+ */
+ preference: OverlayWidgetPositionPreference | null;
+ }
+
+ /**
+ * An overlay widgets renders on top of the text.
+ */
+ export interface IOverlayWidget {
+ /**
+ * Get a unique identifier of the overlay widget.
+ */
+ getId(): string;
+ /**
+ * Get the dom node of the overlay widget.
+ */
+ getDomNode(): HTMLElement;
+ /**
+ * Get the placement of the overlay widget.
+ * If null is returned, the overlay widget is responsible to place itself.
+ */
+ getPosition(): IOverlayWidgetPosition | null;
+ }
+
+ /**
+ * Type of hit element with the mouse in the editor.
+ */
+ export enum MouseTargetType {
+ /**
+ * Mouse is on top of an unknown element.
+ */
+ UNKNOWN = 0,
+ /**
+ * Mouse is on top of the textarea used for input.
+ */
+ TEXTAREA = 1,
+ /**
+ * Mouse is on top of the glyph margin
+ */
+ GUTTER_GLYPH_MARGIN = 2,
+ /**
+ * Mouse is on top of the line numbers
+ */
+ GUTTER_LINE_NUMBERS = 3,
+ /**
+ * Mouse is on top of the line decorations
+ */
+ GUTTER_LINE_DECORATIONS = 4,
+ /**
+ * Mouse is on top of the whitespace left in the gutter by a view zone.
+ */
+ GUTTER_VIEW_ZONE = 5,
+ /**
+ * Mouse is on top of text in the content.
+ */
+ CONTENT_TEXT = 6,
+ /**
+ * Mouse is on top of empty space in the content (e.g. after line text or below last line)
+ */
+ CONTENT_EMPTY = 7,
+ /**
+ * Mouse is on top of a view zone in the content.
+ */
+ CONTENT_VIEW_ZONE = 8,
+ /**
+ * Mouse is on top of a content widget.
+ */
+ CONTENT_WIDGET = 9,
+ /**
+ * Mouse is on top of the decorations overview ruler.
+ */
+ OVERVIEW_RULER = 10,
+ /**
+ * Mouse is on top of a scrollbar.
+ */
+ SCROLLBAR = 11,
+ /**
+ * Mouse is on top of an overlay widget.
+ */
+ OVERLAY_WIDGET = 12,
+ /**
+ * Mouse is outside of the editor.
+ */
+ OUTSIDE_EDITOR = 13
+ }
+
+ /**
+ * Target hit with the mouse in the editor.
+ */
+ export interface IMouseTarget {
+ /**
+ * The target element
+ */
+ readonly element: Element | null;
+ /**
+ * The target type
+ */
+ readonly type: MouseTargetType;
+ /**
+ * The 'approximate' editor position
+ */
+ readonly position: Position | null;
+ /**
+ * Desired mouse column (e.g. when position.column gets clamped to text length -- clicking after text on a line).
+ */
+ readonly mouseColumn: number;
+ /**
+ * The 'approximate' editor range
+ */
+ readonly range: Range | null;
+ /**
+ * Some extra detail.
+ */
+ readonly detail: any;
+ }
+
+ /**
+ * A mouse event originating from the editor.
+ */
+ export interface IEditorMouseEvent {
+ readonly event: IMouseEvent;
+ readonly target: IMouseTarget;
+ }
+
+ export interface IPartialEditorMouseEvent {
+ readonly event: IMouseEvent;
+ readonly target: IMouseTarget | null;
+ }
+
+ /**
+ * A paste event originating from the editor.
+ */
+ export interface IPasteEvent {
+ readonly range: Range;
+ readonly mode: string | null;
+ }
+
+ export interface IEditorConstructionOptions extends IEditorOptions {
+ /**
+ * The initial editor dimension (to avoid measuring the container).
+ */
+ dimension?: IDimension;
+ /**
+ * Place overflow widgets inside an external DOM node.
+ * Defaults to an internal DOM node.
+ */
+ overflowWidgetsDomNode?: HTMLElement;
+ }
+
+ export interface IDiffEditorConstructionOptions extends IDiffEditorOptions {
+ /**
+ * The initial editor dimension (to avoid measuring the container).
+ */
+ dimension?: IDimension;
+ /**
+ * Place overflow widgets inside an external DOM node.
+ * Defaults to an internal DOM node.
+ */
+ overflowWidgetsDomNode?: HTMLElement;
+ }
+
+ /**
+ * A rich code editor.
+ */
+ export interface ICodeEditor extends IEditor {
+ /**
+ * An event emitted when the content of the current model has changed.
+ * @event
+ */
+ onDidChangeModelContent(listener: (e: IModelContentChangedEvent) => void): IDisposable;
+ /**
+ * An event emitted when the language of the current model has changed.
+ * @event
+ */
+ onDidChangeModelLanguage(listener: (e: IModelLanguageChangedEvent) => void): IDisposable;
+ /**
+ * An event emitted when the language configuration of the current model has changed.
+ * @event
+ */
+ onDidChangeModelLanguageConfiguration(listener: (e: IModelLanguageConfigurationChangedEvent) => void): IDisposable;
+ /**
+ * An event emitted when the options of the current model has changed.
+ * @event
+ */
+ onDidChangeModelOptions(listener: (e: IModelOptionsChangedEvent) => void): IDisposable;
+ /**
+ * An event emitted when the configuration of the editor has changed. (e.g. `editor.updateOptions()`)
+ * @event
+ */
+ onDidChangeConfiguration(listener: (e: ConfigurationChangedEvent) => void): IDisposable;
+ /**
+ * An event emitted when the cursor position has changed.
+ * @event
+ */
+ onDidChangeCursorPosition(listener: (e: ICursorPositionChangedEvent) => void): IDisposable;
+ /**
+ * An event emitted when the cursor selection has changed.
+ * @event
+ */
+ onDidChangeCursorSelection(listener: (e: ICursorSelectionChangedEvent) => void): IDisposable;
+ /**
+ * An event emitted when the model of this editor has changed (e.g. `editor.setModel()`).
+ * @event
+ */
+ onDidChangeModel(listener: (e: IModelChangedEvent) => void): IDisposable;
+ /**
+ * An event emitted when the decorations of the current model have changed.
+ * @event
+ */
+ onDidChangeModelDecorations(listener: (e: IModelDecorationsChangedEvent) => void): IDisposable;
+ /**
+ * An event emitted when the text inside this editor gained focus (i.e. cursor starts blinking).
+ * @event
+ */
+ onDidFocusEditorText(listener: () => void): IDisposable;
+ /**
+ * An event emitted when the text inside this editor lost focus (i.e. cursor stops blinking).
+ * @event
+ */
+ onDidBlurEditorText(listener: () => void): IDisposable;
+ /**
+ * An event emitted when the text inside this editor or an editor widget gained focus.
+ * @event
+ */
+ onDidFocusEditorWidget(listener: () => void): IDisposable;
+ /**
+ * An event emitted when the text inside this editor or an editor widget lost focus.
+ * @event
+ */
+ onDidBlurEditorWidget(listener: () => void): IDisposable;
+ /**
+ * An event emitted after composition has started.
+ */
+ onDidCompositionStart(listener: () => void): IDisposable;
+ /**
+ * An event emitted after composition has ended.
+ */
+ onDidCompositionEnd(listener: () => void): IDisposable;
+ /**
+ * An event emitted when editing failed because the editor is read-only.
+ * @event
+ */
+ onDidAttemptReadOnlyEdit(listener: () => void): IDisposable;
+ /**
+ * An event emitted when users paste text in the editor.
+ * @event
+ */
+ onDidPaste(listener: (e: IPasteEvent) => void): IDisposable;
+ /**
+ * An event emitted on a "mouseup".
+ * @event
+ */
+ onMouseUp(listener: (e: IEditorMouseEvent) => void): IDisposable;
+ /**
+ * An event emitted on a "mousedown".
+ * @event
+ */
+ onMouseDown(listener: (e: IEditorMouseEvent) => void): IDisposable;
+ /**
+ * An event emitted on a "contextmenu".
+ * @event
+ */
+ onContextMenu(listener: (e: IEditorMouseEvent) => void): IDisposable;
+ /**
+ * An event emitted on a "mousemove".
+ * @event
+ */
+ onMouseMove(listener: (e: IEditorMouseEvent) => void): IDisposable;
+ /**
+ * An event emitted on a "mouseleave".
+ * @event
+ */
+ onMouseLeave(listener: (e: IPartialEditorMouseEvent) => void): IDisposable;
+ /**
+ * An event emitted on a "keyup".
+ * @event
+ */
+ onKeyUp(listener: (e: IKeyboardEvent) => void): IDisposable;
+ /**
+ * An event emitted on a "keydown".
+ * @event
+ */
+ onKeyDown(listener: (e: IKeyboardEvent) => void): IDisposable;
+ /**
+ * An event emitted when the layout of the editor has changed.
+ * @event
+ */
+ onDidLayoutChange(listener: (e: EditorLayoutInfo) => void): IDisposable;
+ /**
+ * An event emitted when the content width or content height in the editor has changed.
+ * @event
+ */
+ onDidContentSizeChange(listener: (e: IContentSizeChangedEvent) => void): IDisposable;
+ /**
+ * An event emitted when the scroll in the editor has changed.
+ * @event
+ */
+ onDidScrollChange(listener: (e: IScrollEvent) => void): IDisposable;
+ /**
+ * Saves current view state of the editor in a serializable object.
+ */
+ saveViewState(): ICodeEditorViewState | null;
+ /**
+ * Restores the view state of the editor from a serializable object generated by `saveViewState`.
+ */
+ restoreViewState(state: ICodeEditorViewState): void;
+ /**
+ * Returns true if the text inside this editor or an editor widget has focus.
+ */
+ hasWidgetFocus(): boolean;
+ /**
+ * Get a contribution of this editor.
+ * @id Unique identifier of the contribution.
+ * @return The contribution or null if contribution not found.
+ */
+ getContribution(id: string): T;
+ /**
+ * Type the getModel() of IEditor.
+ */
+ getModel(): ITextModel | null;
+ /**
+ * Sets the current model attached to this editor.
+ * If the previous model was created by the editor via the value key in the options
+ * literal object, it will be destroyed. Otherwise, if the previous model was set
+ * via setModel, or the model key in the options literal object, the previous model
+ * will not be destroyed.
+ * It is safe to call setModel(null) to simply detach the current model from the editor.
+ */
+ setModel(model: ITextModel | null): void;
+ /**
+ * Gets all the editor computed options.
+ */
+ getOptions(): IComputedEditorOptions;
+ /**
+ * Gets a specific editor option.
+ */
+ getOption(id: T): FindComputedEditorOptionValueById;
+ /**
+ * Returns the editor's configuration (without any validation or defaults).
+ */
+ getRawOptions(): IEditorOptions;
+ /**
+ * Get value of the current model attached to this editor.
+ * @see {@link ITextModel.getValue}
+ */
+ getValue(options?: {
+ preserveBOM: boolean;
+ lineEnding: string;
+ }): string;
+ /**
+ * Set the value of the current model attached to this editor.
+ * @see {@link ITextModel.setValue}
+ */
+ setValue(newValue: string): void;
+ /**
+ * Get the width of the editor's content.
+ * This is information that is "erased" when computing `scrollWidth = Math.max(contentWidth, width)`
+ */
+ getContentWidth(): number;
+ /**
+ * Get the scrollWidth of the editor's viewport.
+ */
+ getScrollWidth(): number;
+ /**
+ * Get the scrollLeft of the editor's viewport.
+ */
+ getScrollLeft(): number;
+ /**
+ * Get the height of the editor's content.
+ * This is information that is "erased" when computing `scrollHeight = Math.max(contentHeight, height)`
+ */
+ getContentHeight(): number;
+ /**
+ * Get the scrollHeight of the editor's viewport.
+ */
+ getScrollHeight(): number;
+ /**
+ * Get the scrollTop of the editor's viewport.
+ */
+ getScrollTop(): number;
+ /**
+ * Change the scrollLeft of the editor's viewport.
+ */
+ setScrollLeft(newScrollLeft: number, scrollType?: ScrollType): void;
+ /**
+ * Change the scrollTop of the editor's viewport.
+ */
+ setScrollTop(newScrollTop: number, scrollType?: ScrollType): void;
+ /**
+ * Change the scroll position of the editor's viewport.
+ */
+ setScrollPosition(position: INewScrollPosition, scrollType?: ScrollType): void;
+ /**
+ * Get an action that is a contribution to this editor.
+ * @id Unique identifier of the contribution.
+ * @return The action or null if action not found.
+ */
+ getAction(id: string): IEditorAction;
+ /**
+ * Execute a command on the editor.
+ * The edits will land on the undo-redo stack, but no "undo stop" will be pushed.
+ * @param source The source of the call.
+ * @param command The command to execute
+ */
+ executeCommand(source: string | null | undefined, command: ICommand): void;
+ /**
+ * Create an "undo stop" in the undo-redo stack.
+ */
+ pushUndoStop(): boolean;
+ /**
+ * Remove the "undo stop" in the undo-redo stack.
+ */
+ popUndoStop(): boolean;
+ /**
+ * Execute edits on the editor.
+ * The edits will land on the undo-redo stack, but no "undo stop" will be pushed.
+ * @param source The source of the call.
+ * @param edits The edits to execute.
+ * @param endCursorState Cursor state after the edits were applied.
+ */
+ executeEdits(source: string | null | undefined, edits: IIdentifiedSingleEditOperation[], endCursorState?: ICursorStateComputer | Selection[]): boolean;
+ /**
+ * Execute multiple (concomitant) commands on the editor.
+ * @param source The source of the call.
+ * @param command The commands to execute
+ */
+ executeCommands(source: string | null | undefined, commands: (ICommand | null)[]): void;
+ /**
+ * Get all the decorations on a line (filtering out decorations from other editors).
+ */
+ getLineDecorations(lineNumber: number): IModelDecoration[] | null;
+ /**
+ * All decorations added through this call will get the ownerId of this editor.
+ * @see {@link ITextModel.deltaDecorations}
+ */
+ deltaDecorations(oldDecorations: string[], newDecorations: IModelDeltaDecoration[]): string[];
+ /**
+ * Get the layout info for the editor.
+ */
+ getLayoutInfo(): EditorLayoutInfo;
+ /**
+ * Returns the ranges that are currently visible.
+ * Does not account for horizontal scrolling.
+ */
+ getVisibleRanges(): Range[];
+ /**
+ * Get the vertical position (top offset) for the line w.r.t. to the first line.
+ */
+ getTopForLineNumber(lineNumber: number): number;
+ /**
+ * Get the vertical position (top offset) for the position w.r.t. to the first line.
+ */
+ getTopForPosition(lineNumber: number, column: number): number;
+ /**
+ * Returns the editor's container dom node
+ */
+ getContainerDomNode(): HTMLElement;
+ /**
+ * Returns the editor's dom node
+ */
+ getDomNode(): HTMLElement | null;
+ /**
+ * Add a content widget. Widgets must have unique ids, otherwise they will be overwritten.
+ */
+ addContentWidget(widget: IContentWidget): void;
+ /**
+ * Layout/Reposition a content widget. This is a ping to the editor to call widget.getPosition()
+ * and update appropriately.
+ */
+ layoutContentWidget(widget: IContentWidget): void;
+ /**
+ * Remove a content widget.
+ */
+ removeContentWidget(widget: IContentWidget): void;
+ /**
+ * Add an overlay widget. Widgets must have unique ids, otherwise they will be overwritten.
+ */
+ addOverlayWidget(widget: IOverlayWidget): void;
+ /**
+ * Layout/Reposition an overlay widget. This is a ping to the editor to call widget.getPosition()
+ * and update appropriately.
+ */
+ layoutOverlayWidget(widget: IOverlayWidget): void;
+ /**
+ * Remove an overlay widget.
+ */
+ removeOverlayWidget(widget: IOverlayWidget): void;
+ /**
+ * Change the view zones. View zones are lost when a new model is attached to the editor.
+ */
+ changeViewZones(callback: (accessor: IViewZoneChangeAccessor) => void): void;
+ /**
+ * Get the horizontal position (left offset) for the column w.r.t to the beginning of the line.
+ * This method works only if the line `lineNumber` is currently rendered (in the editor's viewport).
+ * Use this method with caution.
+ */
+ getOffsetForColumn(lineNumber: number, column: number): number;
+ /**
+ * Force an editor render now.
+ */
+ render(forceRedraw?: boolean): void;
+ /**
+ * Get the hit test target at coordinates `clientX` and `clientY`.
+ * The coordinates are relative to the top-left of the viewport.
+ *
+ * @returns Hit test target or null if the coordinates fall outside the editor or the editor has no model.
+ */
+ getTargetAtClientPoint(clientX: number, clientY: number): IMouseTarget | null;
+ /**
+ * Get the visible position for `position`.
+ * The result position takes scrolling into account and is relative to the top left corner of the editor.
+ * Explanation 1: the results of this method will change for the same `position` if the user scrolls the editor.
+ * Explanation 2: the results of this method will not change if the container of the editor gets repositioned.
+ * Warning: the results of this method are inaccurate for positions that are outside the current editor viewport.
+ */
+ getScrolledVisiblePosition(position: IPosition): {
+ top: number;
+ left: number;
+ height: number;
+ } | null;
+ /**
+ * Apply the same font settings as the editor to `target`.
+ */
+ applyFontInfo(target: HTMLElement): void;
+ }
+
+ /**
+ * Information about a line in the diff editor
+ */
+ export interface IDiffLineInformation {
+ readonly equivalentLineNumber: number;
+ }
+
+ /**
+ * A rich diff editor.
+ */
+ export interface IDiffEditor extends IEditor {
+ /**
+ * @see {@link ICodeEditor.getDomNode}
+ */
+ getDomNode(): HTMLElement;
+ /**
+ * An event emitted when the diff information computed by this diff editor has been updated.
+ * @event
+ */
+ onDidUpdateDiff(listener: () => void): IDisposable;
+ /**
+ * Saves current view state of the editor in a serializable object.
+ */
+ saveViewState(): IDiffEditorViewState | null;
+ /**
+ * Restores the view state of the editor from a serializable object generated by `saveViewState`.
+ */
+ restoreViewState(state: IDiffEditorViewState): void;
+ /**
+ * Type the getModel() of IEditor.
+ */
+ getModel(): IDiffEditorModel | null;
+ /**
+ * Sets the current model attached to this editor.
+ * If the previous model was created by the editor via the value key in the options
+ * literal object, it will be destroyed. Otherwise, if the previous model was set
+ * via setModel, or the model key in the options literal object, the previous model
+ * will not be destroyed.
+ * It is safe to call setModel(null) to simply detach the current model from the editor.
+ */
+ setModel(model: IDiffEditorModel | null): void;
+ /**
+ * Get the `original` editor.
+ */
+ getOriginalEditor(): ICodeEditor;
+ /**
+ * Get the `modified` editor.
+ */
+ getModifiedEditor(): ICodeEditor;
+ /**
+ * Get the computed diff information.
+ */
+ getLineChanges(): ILineChange[] | null;
+ /**
+ * Get information based on computed diff about a line number from the original model.
+ * If the diff computation is not finished or the model is missing, will return null.
+ */
+ getDiffLineInformationForOriginal(lineNumber: number): IDiffLineInformation | null;
+ /**
+ * Get information based on computed diff about a line number from the modified model.
+ * If the diff computation is not finished or the model is missing, will return null.
+ */
+ getDiffLineInformationForModified(lineNumber: number): IDiffLineInformation | null;
+ /**
+ * Update the editor's options after the editor has been created.
+ */
+ updateOptions(newOptions: IDiffEditorOptions): void;
+ }
+
+ export class FontInfo extends BareFontInfo {
+ readonly _editorStylingBrand: void;
+ readonly version: number;
+ readonly isTrusted: boolean;
+ readonly isMonospace: boolean;
+ readonly typicalHalfwidthCharacterWidth: number;
+ readonly typicalFullwidthCharacterWidth: number;
+ readonly canUseHalfwidthRightwardsArrow: boolean;
+ readonly spaceWidth: number;
+ readonly middotWidth: number;
+ readonly wsmiddotWidth: number;
+ readonly maxDigitWidth: number;
+ }
+
+ export class BareFontInfo {
+ readonly _bareFontInfoBrand: void;
+ readonly zoomLevel: number;
+ readonly pixelRatio: number;
+ readonly fontFamily: string;
+ readonly fontWeight: string;
+ readonly fontSize: number;
+ readonly fontFeatureSettings: string;
+ readonly lineHeight: number;
+ readonly letterSpacing: number;
+ }
+
+ //compatibility:
+ export type IReadOnlyModel = ITextModel;
+ export type IModel = ITextModel;
+}
+
+declare namespace monaco.languages {
+
+
+ /**
+ * Register information about a new language.
+ */
+ export function register(language: ILanguageExtensionPoint): void;
+
+ /**
+ * Get the information of all the registered languages.
+ */
+ export function getLanguages(): ILanguageExtensionPoint[];
+
+ export function getEncodedLanguageId(languageId: string): number;
+
+ /**
+ * An event emitted when a language is first time needed (e.g. a model has it set).
+ * @event
+ */
+ export function onLanguage(languageId: string, callback: () => void): IDisposable;
+
+ /**
+ * Set the editing configuration for a language.
+ */
+ export function setLanguageConfiguration(languageId: string, configuration: LanguageConfiguration): IDisposable;
+
+ /**
+ * A token.
+ */
+ export interface IToken {
+ startIndex: number;
+ scopes: string;
+ }
+
+ /**
+ * The result of a line tokenization.
+ */
+ export interface ILineTokens {
+ /**
+ * The list of tokens on the line.
+ */
+ tokens: IToken[];
+ /**
+ * The tokenization end state.
+ * A pointer will be held to this and the object should not be modified by the tokenizer after the pointer is returned.
+ */
+ endState: IState;
+ }
+
+ /**
+ * The result of a line tokenization.
+ */
+ export interface IEncodedLineTokens {
+ /**
+ * The tokens on the line in a binary, encoded format. Each token occupies two array indices. For token i:
+ * - at offset 2*i => startIndex
+ * - at offset 2*i + 1 => metadata
+ * Meta data is in binary format:
+ * - -------------------------------------------
+ * 3322 2222 2222 1111 1111 1100 0000 0000
+ * 1098 7654 3210 9876 5432 1098 7654 3210
+ * - -------------------------------------------
+ * bbbb bbbb bfff ffff ffFF FTTT LLLL LLLL
+ * - -------------------------------------------
+ * - L = EncodedLanguageId (8 bits): Use `getEncodedLanguageId` to get the encoded ID of a language.
+ * - T = StandardTokenType (3 bits): Other = 0, Comment = 1, String = 2, RegEx = 4.
+ * - F = FontStyle (3 bits): None = 0, Italic = 1, Bold = 2, Underline = 4.
+ * - f = foreground ColorId (9 bits)
+ * - b = background ColorId (9 bits)
+ * - The color value for each colorId is defined in IStandaloneThemeData.customTokenColors:
+ * e.g. colorId = 1 is stored in IStandaloneThemeData.customTokenColors[1]. Color id = 0 means no color,
+ * id = 1 is for the default foreground color, id = 2 for the default background.
+ */
+ tokens: Uint32Array;
+ /**
+ * The tokenization end state.
+ * A pointer will be held to this and the object should not be modified by the tokenizer after the pointer is returned.
+ */
+ endState: IState;
+ }
+
+ /**
+ * A "manual" provider of tokens.
+ */
+ export interface TokensProvider {
+ /**
+ * The initial state of a language. Will be the state passed in to tokenize the first line.
+ */
+ getInitialState(): IState;
+ /**
+ * Tokenize a line given the state at the beginning of the line.
+ */
+ tokenize(line: string, state: IState): ILineTokens;
+ }
+
+ /**
+ * A "manual" provider of tokens, returning tokens in a binary form.
+ */
+ export interface EncodedTokensProvider {
+ /**
+ * The initial state of a language. Will be the state passed in to tokenize the first line.
+ */
+ getInitialState(): IState;
+ /**
+ * Tokenize a line given the state at the beginning of the line.
+ */
+ tokenizeEncoded(line: string, state: IState): IEncodedLineTokens;
+ /**
+ * Tokenize a line given the state at the beginning of the line.
+ */
+ tokenize?(line: string, state: IState): ILineTokens;
+ }
+
+ /**
+ * Change the color map that is used for token colors.
+ * Supported formats (hex): #RRGGBB, $RRGGBBAA, #RGB, #RGBA
+ */
+ export function setColorMap(colorMap: string[] | null): void;
+
+ /**
+ * Set the tokens provider for a language (manual implementation).
+ */
+ export function setTokensProvider(languageId: string, provider: TokensProvider | EncodedTokensProvider | Thenable): IDisposable;
+
+ /**
+ * Set the tokens provider for a language (monarch implementation).
+ */
+ export function setMonarchTokensProvider(languageId: string, languageDef: IMonarchLanguage | Thenable): IDisposable;
+
+ /**
+ * Register a reference provider (used by e.g. reference search).
+ */
+ export function registerReferenceProvider(languageId: string, provider: ReferenceProvider): IDisposable;
+
+ /**
+ * Register a rename provider (used by e.g. rename symbol).
+ */
+ export function registerRenameProvider(languageId: string, provider: RenameProvider): IDisposable;
+
+ /**
+ * Register a signature help provider (used by e.g. parameter hints).
+ */
+ export function registerSignatureHelpProvider(languageId: string, provider: SignatureHelpProvider): IDisposable;
+
+ /**
+ * Register a hover provider (used by e.g. editor hover).
+ */
+ export function registerHoverProvider(languageId: string, provider: HoverProvider): IDisposable;
+
+ /**
+ * Register a document symbol provider (used by e.g. outline).
+ */
+ export function registerDocumentSymbolProvider(languageId: string, provider: DocumentSymbolProvider): IDisposable;
+
+ /**
+ * Register a document highlight provider (used by e.g. highlight occurrences).
+ */
+ export function registerDocumentHighlightProvider(languageId: string, provider: DocumentHighlightProvider): IDisposable;
+
+ /**
+ * Register an linked editing range provider.
+ */
+ export function registerLinkedEditingRangeProvider(languageId: string, provider: LinkedEditingRangeProvider): IDisposable;
+
+ /**
+ * Register a definition provider (used by e.g. go to definition).
+ */
+ export function registerDefinitionProvider(languageId: string, provider: DefinitionProvider): IDisposable;
+
+ /**
+ * Register a implementation provider (used by e.g. go to implementation).
+ */
+ export function registerImplementationProvider(languageId: string, provider: ImplementationProvider): IDisposable;
+
+ /**
+ * Register a type definition provider (used by e.g. go to type definition).
+ */
+ export function registerTypeDefinitionProvider(languageId: string, provider: TypeDefinitionProvider): IDisposable;
+
+ /**
+ * Register a code lens provider (used by e.g. inline code lenses).
+ */
+ export function registerCodeLensProvider(languageId: string, provider: CodeLensProvider): IDisposable;
+
+ /**
+ * Register a code action provider (used by e.g. quick fix).
+ */
+ export function registerCodeActionProvider(languageId: string, provider: CodeActionProvider): IDisposable;
+
+ /**
+ * Register a formatter that can handle only entire models.
+ */
+ export function registerDocumentFormattingEditProvider(languageId: string, provider: DocumentFormattingEditProvider): IDisposable;
+
+ /**
+ * Register a formatter that can handle a range inside a model.
+ */
+ export function registerDocumentRangeFormattingEditProvider(languageId: string, provider: DocumentRangeFormattingEditProvider): IDisposable;
+
+ /**
+ * Register a formatter than can do formatting as the user types.
+ */
+ export function registerOnTypeFormattingEditProvider(languageId: string, provider: OnTypeFormattingEditProvider): IDisposable;
+
+ /**
+ * Register a link provider that can find links in text.
+ */
+ export function registerLinkProvider(languageId: string, provider: LinkProvider): IDisposable;
+
+ /**
+ * Register a completion item provider (use by e.g. suggestions).
+ */
+ export function registerCompletionItemProvider(languageId: string, provider: CompletionItemProvider): IDisposable;
+
+ /**
+ * Register a document color provider (used by Color Picker, Color Decorator).
+ */
+ export function registerColorProvider(languageId: string, provider: DocumentColorProvider): IDisposable;
+
+ /**
+ * Register a folding range provider
+ */
+ export function registerFoldingRangeProvider(languageId: string, provider: FoldingRangeProvider): IDisposable;
+
+ /**
+ * Register a declaration provider
+ */
+ export function registerDeclarationProvider(languageId: string, provider: DeclarationProvider): IDisposable;
+
+ /**
+ * Register a selection range provider
+ */
+ export function registerSelectionRangeProvider(languageId: string, provider: SelectionRangeProvider): IDisposable;
+
+ /**
+ * Register a document semantic tokens provider
+ */
+ export function registerDocumentSemanticTokensProvider(languageId: string, provider: DocumentSemanticTokensProvider): IDisposable;
+
+ /**
+ * Register a document range semantic tokens provider
+ */
+ export function registerDocumentRangeSemanticTokensProvider(languageId: string, provider: DocumentRangeSemanticTokensProvider): IDisposable;
+
+ /**
+ * Register an inline completions provider.
+ */
+ export function registerInlineCompletionsProvider(languageId: string, provider: InlineCompletionsProvider): IDisposable;
+
+ /**
+ * Register an inlay hints provider.
+ */
+ export function registerInlayHintsProvider(languageId: string, provider: InlayHintsProvider): IDisposable;
+
+ /**
+ * Contains additional diagnostic information about the context in which
+ * a [code action](#CodeActionProvider.provideCodeActions) is run.
+ */
+ export interface CodeActionContext {
+ /**
+ * An array of diagnostics.
+ */
+ readonly markers: editor.IMarkerData[];
+ /**
+ * Requested kind of actions to return.
+ */
+ readonly only?: string;
+ }
+
+ /**
+ * The code action interface defines the contract between extensions and
+ * the [light bulb](https://code.visualstudio.com/docs/editor/editingevolved#_code-action) feature.
+ */
+ export interface CodeActionProvider {
+ /**
+ * Provide commands for the given document and range.
+ */
+ provideCodeActions(model: editor.ITextModel, range: Range, context: CodeActionContext, token: CancellationToken): ProviderResult;
+ }
+
+ /**
+ * Describes how comments for a language work.
+ */
+ export interface CommentRule {
+ /**
+ * The line comment token, like `// this is a comment`
+ */
+ lineComment?: string | null;
+ /**
+ * The block comment character pair, like `/* block comment */`
+ */
+ blockComment?: CharacterPair | null;
+ }
+
+ /**
+ * The language configuration interface defines the contract between extensions and
+ * various editor features, like automatic bracket insertion, automatic indentation etc.
+ */
+ export interface LanguageConfiguration {
+ /**
+ * The language's comment settings.
+ */
+ comments?: CommentRule;
+ /**
+ * The language's brackets.
+ * This configuration implicitly affects pressing Enter around these brackets.
+ */
+ brackets?: CharacterPair[];
+ /**
+ * The language's word definition.
+ * If the language supports Unicode identifiers (e.g. JavaScript), it is preferable
+ * to provide a word definition that uses exclusion of known separators.
+ * e.g.: A regex that matches anything except known separators (and dot is allowed to occur in a floating point number):
+ * /(-?\d*\.\d\w*)|([^\`\~\!\@\#\%\^\&\*\(\)\-\=\+\[\{\]\}\\\|\;\:\'\"\,\.\<\>\/\?\s]+)/g
+ */
+ wordPattern?: RegExp;
+ /**
+ * The language's indentation settings.
+ */
+ indentationRules?: IndentationRule;
+ /**
+ * The language's rules to be evaluated when pressing Enter.
+ */
+ onEnterRules?: OnEnterRule[];
+ /**
+ * The language's auto closing pairs. The 'close' character is automatically inserted with the
+ * 'open' character is typed. If not set, the configured brackets will be used.
+ */
+ autoClosingPairs?: IAutoClosingPairConditional[];
+ /**
+ * The language's surrounding pairs. When the 'open' character is typed on a selection, the
+ * selected string is surrounded by the open and close characters. If not set, the autoclosing pairs
+ * settings will be used.
+ */
+ surroundingPairs?: IAutoClosingPair[];
+ /**
+ * Defines what characters must be after the cursor for bracket or quote autoclosing to occur when using the \'languageDefined\' autoclosing setting.
+ *
+ * This is typically the set of characters which can not start an expression, such as whitespace, closing brackets, non-unary operators, etc.
+ */
+ autoCloseBefore?: string;
+ /**
+ * The language's folding rules.
+ */
+ folding?: FoldingRules;
+ /**
+ * **Deprecated** Do not use.
+ *
+ * @deprecated Will be replaced by a better API soon.
+ */
+ __electricCharacterSupport?: {
+ docComment?: IDocComment;
+ };
+ }
+
+ /**
+ * Describes indentation rules for a language.
+ */
+ export interface IndentationRule {
+ /**
+ * If a line matches this pattern, then all the lines after it should be unindented once (until another rule matches).
+ */
+ decreaseIndentPattern: RegExp;
+ /**
+ * If a line matches this pattern, then all the lines after it should be indented once (until another rule matches).
+ */
+ increaseIndentPattern: RegExp;
+ /**
+ * If a line matches this pattern, then **only the next line** after it should be indented once.
+ */
+ indentNextLinePattern?: RegExp | null;
+ /**
+ * If a line matches this pattern, then its indentation should not be changed and it should not be evaluated against the other rules.
+ */
+ unIndentedLinePattern?: RegExp | null;
+ }
+
+ /**
+ * Describes language specific folding markers such as '#region' and '#endregion'.
+ * The start and end regexes will be tested against the contents of all lines and must be designed efficiently:
+ * - the regex should start with '^'
+ * - regexp flags (i, g) are ignored
+ */
+ export interface FoldingMarkers {
+ start: RegExp;
+ end: RegExp;
+ }
+
+ /**
+ * Describes folding rules for a language.
+ */
+ export interface FoldingRules {
+ /**
+ * Used by the indentation based strategy to decide whether empty lines belong to the previous or the next block.
+ * A language adheres to the off-side rule if blocks in that language are expressed by their indentation.
+ * See [wikipedia](https://en.wikipedia.org/wiki/Off-side_rule) for more information.
+ * If not set, `false` is used and empty lines belong to the previous block.
+ */
+ offSide?: boolean;
+ /**
+ * Region markers used by the language.
+ */
+ markers?: FoldingMarkers;
+ }
+
+ /**
+ * Describes a rule to be evaluated when pressing Enter.
+ */
+ export interface OnEnterRule {
+ /**
+ * This rule will only execute if the text before the cursor matches this regular expression.
+ */
+ beforeText: RegExp;
+ /**
+ * This rule will only execute if the text after the cursor matches this regular expression.
+ */
+ afterText?: RegExp;
+ /**
+ * This rule will only execute if the text above the this line matches this regular expression.
+ */
+ previousLineText?: RegExp;
+ /**
+ * The action to execute.
+ */
+ action: EnterAction;
+ }
+
+ /**
+ * Definition of documentation comments (e.g. Javadoc/JSdoc)
+ */
+ export interface IDocComment {
+ /**
+ * The string that starts a doc comment (e.g. '/**')
+ */
+ open: string;
+ /**
+ * The string that appears on the last line and closes the doc comment (e.g. ' * /').
+ */
+ close?: string;
+ }
+
+ /**
+ * A tuple of two characters, like a pair of
+ * opening and closing brackets.
+ */
+ export type CharacterPair = [string, string];
+
+ export interface IAutoClosingPair {
+ open: string;
+ close: string;
+ }
+
+ export interface IAutoClosingPairConditional extends IAutoClosingPair {
+ notIn?: string[];
+ }
+
+ /**
+ * Describes what to do with the indentation when pressing Enter.
+ */
+ export enum IndentAction {
+ /**
+ * Insert new line and copy the previous line's indentation.
+ */
+ None = 0,
+ /**
+ * Insert new line and indent once (relative to the previous line's indentation).
+ */
+ Indent = 1,
+ /**
+ * Insert two new lines:
+ * - the first one indented which will hold the cursor
+ * - the second one at the same indentation level
+ */
+ IndentOutdent = 2,
+ /**
+ * Insert new line and outdent once (relative to the previous line's indentation).
+ */
+ Outdent = 3
+ }
+
+ /**
+ * Describes what to do when pressing Enter.
+ */
+ export interface EnterAction {
+ /**
+ * Describe what to do with the indentation.
+ */
+ indentAction: IndentAction;
+ /**
+ * Describes text to be appended after the new line and after the indentation.
+ */
+ appendText?: string;
+ /**
+ * Describes the number of characters to remove from the new line's indentation.
+ */
+ removeText?: number;
+ }
+
+ /**
+ * The state of the tokenizer between two lines.
+ * It is useful to store flags such as in multiline comment, etc.
+ * The model will clone the previous line's state and pass it in to tokenize the next line.
+ */
+ export interface IState {
+ clone(): IState;
+ equals(other: IState): boolean;
+ }
+
+ /**
+ * A provider result represents the values a provider, like the {@link HoverProvider},
+ * may return. For once this is the actual result type `T`, like `Hover`, or a thenable that resolves
+ * to that type `T`. In addition, `null` and `undefined` can be returned - either directly or from a
+ * thenable.
+ */
+ export type ProviderResult = T | undefined | null | Thenable;
+
+ /**
+ * A hover represents additional information for a symbol or word. Hovers are
+ * rendered in a tooltip-like widget.
+ */
+ export interface Hover {
+ /**
+ * The contents of this hover.
+ */
+ contents: IMarkdownString[];
+ /**
+ * The range to which this hover applies. When missing, the
+ * editor will use the range at the current position or the
+ * current position itself.
+ */
+ range?: IRange;
+ }
+
+ /**
+ * The hover provider interface defines the contract between extensions and
+ * the [hover](https://code.visualstudio.com/docs/editor/intellisense)-feature.
+ */
+ export interface HoverProvider {
+ /**
+ * Provide a hover for the given position and document. Multiple hovers at the same
+ * position will be merged by the editor. A hover can have a range which defaults
+ * to the word range at the position when omitted.
+ */
+ provideHover(model: editor.ITextModel, position: Position, token: CancellationToken): ProviderResult;
+ }
+
+ export enum CompletionItemKind {
+ Method = 0,
+ Function = 1,
+ Constructor = 2,
+ Field = 3,
+ Variable = 4,
+ Class = 5,
+ Struct = 6,
+ Interface = 7,
+ Module = 8,
+ Property = 9,
+ Event = 10,
+ Operator = 11,
+ Unit = 12,
+ Value = 13,
+ Constant = 14,
+ Enum = 15,
+ EnumMember = 16,
+ Keyword = 17,
+ Text = 18,
+ Color = 19,
+ File = 20,
+ Reference = 21,
+ Customcolor = 22,
+ Folder = 23,
+ TypeParameter = 24,
+ User = 25,
+ Issue = 26,
+ Snippet = 27
+ }
+
+ export interface CompletionItemLabel {
+ label: string;
+ detail?: string;
+ description?: string;
+ }
+
+ export enum CompletionItemTag {
+ Deprecated = 1
+ }
+
+ export enum CompletionItemInsertTextRule {
+ /**
+ * Adjust whitespace/indentation of multiline insert texts to
+ * match the current line indentation.
+ */
+ KeepWhitespace = 1,
+ /**
+ * `insertText` is a snippet.
+ */
+ InsertAsSnippet = 4
+ }
+
+ /**
+ * A completion item represents a text snippet that is
+ * proposed to complete text that is being typed.
+ */
+ export interface CompletionItem {
+ /**
+ * The label of this completion item. By default
+ * this is also the text that is inserted when selecting
+ * this completion.
+ */
+ label: string | CompletionItemLabel;
+ /**
+ * The kind of this completion item. Based on the kind
+ * an icon is chosen by the editor.
+ */
+ kind: CompletionItemKind;
+ /**
+ * A modifier to the `kind` which affect how the item
+ * is rendered, e.g. Deprecated is rendered with a strikeout
+ */
+ tags?: ReadonlyArray;
+ /**
+ * A human-readable string with additional information
+ * about this item, like type or symbol information.
+ */
+ detail?: string;
+ /**
+ * A human-readable string that represents a doc-comment.
+ */
+ documentation?: string | IMarkdownString;
+ /**
+ * A string that should be used when comparing this item
+ * with other items. When `falsy` the {@link CompletionItem.label label}
+ * is used.
+ */
+ sortText?: string;
+ /**
+ * A string that should be used when filtering a set of
+ * completion items. When `falsy` the {@link CompletionItem.label label}
+ * is used.
+ */
+ filterText?: string;
+ /**
+ * Select this item when showing. *Note* that only one completion item can be selected and
+ * that the editor decides which item that is. The rule is that the *first* item of those
+ * that match best is selected.
+ */
+ preselect?: boolean;
+ /**
+ * A string or snippet that should be inserted in a document when selecting
+ * this completion.
+ * is used.
+ */
+ insertText: string;
+ /**
+ * Addition rules (as bitmask) that should be applied when inserting
+ * this completion.
+ */
+ insertTextRules?: CompletionItemInsertTextRule;
+ /**
+ * A range of text that should be replaced by this completion item.
+ *
+ * Defaults to a range from the start of the {@link TextDocument.getWordRangeAtPosition current word} to the
+ * current position.
+ *
+ * *Note:* The range must be a {@link Range.isSingleLine single line} and it must
+ * {@link Range.contains contain} the position at which completion has been {@link CompletionItemProvider.provideCompletionItems requested}.
+ */
+ range: IRange | {
+ insert: IRange;
+ replace: IRange;
+ };
+ /**
+ * An optional set of characters that when pressed while this completion is active will accept it first and
+ * then type that character. *Note* that all commit characters should have `length=1` and that superfluous
+ * characters will be ignored.
+ */
+ commitCharacters?: string[];
+ /**
+ * An optional array of additional text edits that are applied when
+ * selecting this completion. Edits must not overlap with the main edit
+ * nor with themselves.
+ */
+ additionalTextEdits?: editor.ISingleEditOperation[];
+ /**
+ * A command that should be run upon acceptance of this item.
+ */
+ command?: Command;
+ }
+
+ export interface CompletionList {
+ suggestions: CompletionItem[];
+ incomplete?: boolean;
+ dispose?(): void;
+ }
+
+ /**
+ * How a suggest provider was triggered.
+ */
+ export enum CompletionTriggerKind {
+ Invoke = 0,
+ TriggerCharacter = 1,
+ TriggerForIncompleteCompletions = 2
+ }
+
+ /**
+ * Contains additional information about the context in which
+ * {@link CompletionItemProvider.provideCompletionItems completion provider} is triggered.
+ */
+ export interface CompletionContext {
+ /**
+ * How the completion was triggered.
+ */
+ triggerKind: CompletionTriggerKind;
+ /**
+ * Character that triggered the completion item provider.
+ *
+ * `undefined` if provider was not triggered by a character.
+ */
+ triggerCharacter?: string;
+ }
+
+ /**
+ * The completion item provider interface defines the contract between extensions and
+ * the [IntelliSense](https://code.visualstudio.com/docs/editor/intellisense).
+ *
+ * When computing *complete* completion items is expensive, providers can optionally implement
+ * the `resolveCompletionItem`-function. In that case it is enough to return completion
+ * items with a {@link CompletionItem.label label} from the
+ * {@link CompletionItemProvider.provideCompletionItems provideCompletionItems}-function. Subsequently,
+ * when a completion item is shown in the UI and gains focus this provider is asked to resolve
+ * the item, like adding {@link CompletionItem.documentation doc-comment} or {@link CompletionItem.detail details}.
+ */
+ export interface CompletionItemProvider {
+ triggerCharacters?: string[];
+ /**
+ * Provide completion items for the given position and document.
+ */
+ provideCompletionItems(model: editor.ITextModel, position: Position, context: CompletionContext, token: CancellationToken): ProviderResult;
+ /**
+ * Given a completion item fill in more data, like {@link CompletionItem.documentation doc-comment}
+ * or {@link CompletionItem.detail details}.
+ *
+ * The editor will only resolve a completion item once.
+ */
+ resolveCompletionItem?(item: CompletionItem, token: CancellationToken): ProviderResult;
+ }
+
+ /**
+ * How an {@link InlineCompletionsProvider inline completion provider} was triggered.
+ */
+ export enum InlineCompletionTriggerKind {
+ /**
+ * Completion was triggered automatically while editing.
+ * It is sufficient to return a single completion item in this case.
+ */
+ Automatic = 0,
+ /**
+ * Completion was triggered explicitly by a user gesture.
+ * Return multiple completion items to enable cycling through them.
+ */
+ Explicit = 1
+ }
+
+ export interface InlineCompletionContext {
+ /**
+ * How the completion was triggered.
+ */
+ readonly triggerKind: InlineCompletionTriggerKind;
+ }
+
+ export interface InlineCompletion {
+ /**
+ * The text to insert.
+ * If the text contains a line break, the range must end at the end of a line.
+ * If existing text should be replaced, the existing text must be a prefix of the text to insert.
+ */
+ readonly text: string;
+ /**
+ * The range to replace.
+ * Must begin and end on the same line.
+ */
+ readonly range?: IRange;
+ readonly command?: Command;
+ }
+
+ export interface InlineCompletions {
+ readonly items: readonly TItem[];
+ }
+
+ export interface InlineCompletionsProvider {
+ provideInlineCompletions(model: editor.ITextModel, position: Position, context: InlineCompletionContext, token: CancellationToken): ProviderResult;
+ /**
+ * Will be called when an item is shown.
+ */
+ handleItemDidShow?(completions: T, item: T['items'][number]): void;
+ /**
+ * Will be called when a completions list is no longer in use and can be garbage-collected.
+ */
+ freeInlineCompletions(completions: T): void;
+ }
+
+ export interface CodeAction {
+ title: string;
+ command?: Command;
+ edit?: WorkspaceEdit;
+ diagnostics?: editor.IMarkerData[];
+ kind?: string;
+ isPreferred?: boolean;
+ disabled?: string;
+ }
+
+ export interface CodeActionList extends IDisposable {
+ readonly actions: ReadonlyArray;
+ }
+
+ /**
+ * Represents a parameter of a callable-signature. A parameter can
+ * have a label and a doc-comment.
+ */
+ export interface ParameterInformation {
+ /**
+ * The label of this signature. Will be shown in
+ * the UI.
+ */
+ label: string | [number, number];
+ /**
+ * The human-readable doc-comment of this signature. Will be shown
+ * in the UI but can be omitted.
+ */
+ documentation?: string | IMarkdownString;
+ }
+
+ /**
+ * Represents the signature of something callable. A signature
+ * can have a label, like a function-name, a doc-comment, and
+ * a set of parameters.
+ */
+ export interface SignatureInformation {
+ /**
+ * The label of this signature. Will be shown in
+ * the UI.
+ */
+ label: string;
+ /**
+ * The human-readable doc-comment of this signature. Will be shown
+ * in the UI but can be omitted.
+ */
+ documentation?: string | IMarkdownString;
+ /**
+ * The parameters of this signature.
+ */
+ parameters: ParameterInformation[];
+ /**
+ * Index of the active parameter.
+ *
+ * If provided, this is used in place of `SignatureHelp.activeSignature`.
+ */
+ activeParameter?: number;
+ }
+
+ /**
+ * Signature help represents the signature of something
+ * callable. There can be multiple signatures but only one
+ * active and only one active parameter.
+ */
+ export interface SignatureHelp {
+ /**
+ * One or more signatures.
+ */
+ signatures: SignatureInformation[];
+ /**
+ * The active signature.
+ */
+ activeSignature: number;
+ /**
+ * The active parameter of the active signature.
+ */
+ activeParameter: number;
+ }
+
+ export interface SignatureHelpResult extends IDisposable {
+ value: SignatureHelp;
+ }
+
+ export enum SignatureHelpTriggerKind {
+ Invoke = 1,
+ TriggerCharacter = 2,
+ ContentChange = 3
+ }
+
+ export interface SignatureHelpContext {
+ readonly triggerKind: SignatureHelpTriggerKind;
+ readonly triggerCharacter?: string;
+ readonly isRetrigger: boolean;
+ readonly activeSignatureHelp?: SignatureHelp;
+ }
+
+ /**
+ * The signature help provider interface defines the contract between extensions and
+ * the [parameter hints](https://code.visualstudio.com/docs/editor/intellisense)-feature.
+ */
+ export interface SignatureHelpProvider {
+ readonly signatureHelpTriggerCharacters?: ReadonlyArray;
+ readonly signatureHelpRetriggerCharacters?: ReadonlyArray;
+ /**
+ * Provide help for the signature at the given position and document.
+ */
+ provideSignatureHelp(model: editor.ITextModel, position: Position, token: CancellationToken, context: SignatureHelpContext): ProviderResult;
+ }
+
+ /**
+ * A document highlight kind.
+ */
+ export enum DocumentHighlightKind {
+ /**
+ * A textual occurrence.
+ */
+ Text = 0,
+ /**
+ * Read-access of a symbol, like reading a variable.
+ */
+ Read = 1,
+ /**
+ * Write-access of a symbol, like writing to a variable.
+ */
+ Write = 2
+ }
+
+ /**
+ * A document highlight is a range inside a text document which deserves
+ * special attention. Usually a document highlight is visualized by changing
+ * the background color of its range.
+ */
+ export interface DocumentHighlight {
+ /**
+ * The range this highlight applies to.
+ */
+ range: IRange;
+ /**
+ * The highlight kind, default is {@link DocumentHighlightKind.Text text}.
+ */
+ kind?: DocumentHighlightKind;
+ }
+
+ /**
+ * The document highlight provider interface defines the contract between extensions and
+ * the word-highlight-feature.
+ */
+ export interface DocumentHighlightProvider {
+ /**
+ * Provide a set of document highlights, like all occurrences of a variable or
+ * all exit-points of a function.
+ */
+ provideDocumentHighlights(model: editor.ITextModel, position: Position, token: CancellationToken): ProviderResult;
+ }
+
+ /**
+ * The linked editing range provider interface defines the contract between extensions and
+ * the linked editing feature.
+ */
+ export interface LinkedEditingRangeProvider {
+ /**
+ * Provide a list of ranges that can be edited together.
+ */
+ provideLinkedEditingRanges(model: editor.ITextModel, position: Position, token: CancellationToken): ProviderResult;
+ }
+
+ /**
+ * Represents a list of ranges that can be edited together along with a word pattern to describe valid contents.
+ */
+ export interface LinkedEditingRanges {
+ /**
+ * A list of ranges that can be edited together. The ranges must have
+ * identical length and text content. The ranges cannot overlap
+ */
+ ranges: IRange[];
+ /**
+ * An optional word pattern that describes valid contents for the given ranges.
+ * If no pattern is provided, the language configuration's word pattern will be used.
+ */
+ wordPattern?: RegExp;
+ }
+
+ /**
+ * Value-object that contains additional information when
+ * requesting references.
+ */
+ export interface ReferenceContext {
+ /**
+ * Include the declaration of the current symbol.
+ */
+ includeDeclaration: boolean;
+ }
+
+ /**
+ * The reference provider interface defines the contract between extensions and
+ * the [find references](https://code.visualstudio.com/docs/editor/editingevolved#_peek)-feature.
+ */
+ export interface ReferenceProvider {
+ /**
+ * Provide a set of project-wide references for the given position and document.
+ */
+ provideReferences(model: editor.ITextModel, position: Position, context: ReferenceContext, token: CancellationToken): ProviderResult;
+ }
+
+ /**
+ * Represents a location inside a resource, such as a line
+ * inside a text file.
+ */
+ export interface Location {
+ /**
+ * The resource identifier of this location.
+ */
+ uri: Uri;
+ /**
+ * The document range of this locations.
+ */
+ range: IRange;
+ }
+
+ export interface LocationLink {
+ /**
+ * A range to select where this link originates from.
+ */
+ originSelectionRange?: IRange;
+ /**
+ * The target uri this link points to.
+ */
+ uri: Uri;
+ /**
+ * The full range this link points to.
+ */
+ range: IRange;
+ /**
+ * A range to select this link points to. Must be contained
+ * in `LocationLink.range`.
+ */
+ targetSelectionRange?: IRange;
+ }
+
+ export type Definition = Location | Location[] | LocationLink[];
+
+ /**
+ * The definition provider interface defines the contract between extensions and
+ * the [go to definition](https://code.visualstudio.com/docs/editor/editingevolved#_go-to-definition)
+ * and peek definition features.
+ */
+ export interface DefinitionProvider {
+ /**
+ * Provide the definition of the symbol at the given position and document.
+ */
+ provideDefinition(model: editor.ITextModel, position: Position, token: CancellationToken): ProviderResult;
+ }
+
+ /**
+ * The definition provider interface defines the contract between extensions and
+ * the [go to definition](https://code.visualstudio.com/docs/editor/editingevolved#_go-to-definition)
+ * and peek definition features.
+ */
+ export interface DeclarationProvider {
+ /**
+ * Provide the declaration of the symbol at the given position and document.
+ */
+ provideDeclaration(model: editor.ITextModel, position: Position, token: CancellationToken): ProviderResult;
+ }
+
+ /**
+ * The implementation provider interface defines the contract between extensions and
+ * the go to implementation feature.
+ */
+ export interface ImplementationProvider {
+ /**
+ * Provide the implementation of the symbol at the given position and document.
+ */
+ provideImplementation(model: editor.ITextModel, position: Position, token: CancellationToken): ProviderResult;
+ }
+
+ /**
+ * The type definition provider interface defines the contract between extensions and
+ * the go to type definition feature.
+ */
+ export interface TypeDefinitionProvider {
+ /**
+ * Provide the type definition of the symbol at the given position and document.
+ */
+ provideTypeDefinition(model: editor.ITextModel, position: Position, token: CancellationToken): ProviderResult;
+ }
+
+ /**
+ * A symbol kind.
+ */
+ export enum SymbolKind {
+ File = 0,
+ Module = 1,
+ Namespace = 2,
+ Package = 3,
+ Class = 4,
+ Method = 5,
+ Property = 6,
+ Field = 7,
+ Constructor = 8,
+ Enum = 9,
+ Interface = 10,
+ Function = 11,
+ Variable = 12,
+ Constant = 13,
+ String = 14,
+ Number = 15,
+ Boolean = 16,
+ Array = 17,
+ Object = 18,
+ Key = 19,
+ Null = 20,
+ EnumMember = 21,
+ Struct = 22,
+ Event = 23,
+ Operator = 24,
+ TypeParameter = 25
+ }
+
+ export enum SymbolTag {
+ Deprecated = 1
+ }
+
+ export interface DocumentSymbol {
+ name: string;
+ detail: string;
+ kind: SymbolKind;
+ tags: ReadonlyArray;
+ containerName?: string;
+ range: IRange;
+ selectionRange: IRange;
+ children?: DocumentSymbol[];
+ }
+
+ /**
+ * The document symbol provider interface defines the contract between extensions and
+ * the [go to symbol](https://code.visualstudio.com/docs/editor/editingevolved#_go-to-symbol)-feature.
+ */
+ export interface DocumentSymbolProvider {
+ displayName?: string;
+ /**
+ * Provide symbol information for the given document.
+ */
+ provideDocumentSymbols(model: editor.ITextModel, token: CancellationToken): ProviderResult;
+ }
+
+ export type TextEdit = {
+ range: IRange;
+ text: string;
+ eol?: editor.EndOfLineSequence;
+ };
+
+ /**
+ * Interface used to format a model
+ */
+ export interface FormattingOptions {
+ /**
+ * Size of a tab in spaces.
+ */
+ tabSize: number;
+ /**
+ * Prefer spaces over tabs.
+ */
+ insertSpaces: boolean;
+ }
+
+ /**
+ * The document formatting provider interface defines the contract between extensions and
+ * the formatting-feature.
+ */
+ export interface DocumentFormattingEditProvider {
+ readonly displayName?: string;
+ /**
+ * Provide formatting edits for a whole document.
+ */
+ provideDocumentFormattingEdits(model: editor.ITextModel, options: FormattingOptions, token: CancellationToken): ProviderResult;
+ }
+
+ /**
+ * The document formatting provider interface defines the contract between extensions and
+ * the formatting-feature.
+ */
+ export interface DocumentRangeFormattingEditProvider {
+ readonly displayName?: string;
+ /**
+ * Provide formatting edits for a range in a document.
+ *
+ * The given range is a hint and providers can decide to format a smaller
+ * or larger range. Often this is done by adjusting the start and end
+ * of the range to full syntax nodes.
+ */
+ provideDocumentRangeFormattingEdits(model: editor.ITextModel, range: Range, options: FormattingOptions, token: CancellationToken): ProviderResult;
+ }
+
+ /**
+ * The document formatting provider interface defines the contract between extensions and
+ * the formatting-feature.
+ */
+ export interface OnTypeFormattingEditProvider {
+ autoFormatTriggerCharacters: string[];
+ /**
+ * Provide formatting edits after a character has been typed.
+ *
+ * The given position and character should hint to the provider
+ * what range the position to expand to, like find the matching `{`
+ * when `}` has been entered.
+ */
+ provideOnTypeFormattingEdits(model: editor.ITextModel, position: Position, ch: string, options: FormattingOptions, token: CancellationToken): ProviderResult;
+ }
+
+ /**
+ * A link inside the editor.
+ */
+ export interface ILink {
+ range: IRange;
+ url?: Uri | string;
+ tooltip?: string;
+ }
+
+ export interface ILinksList {
+ links: ILink[];
+ dispose?(): void;
+ }
+
+ /**
+ * A provider of links.
+ */
+ export interface LinkProvider {
+ provideLinks(model: editor.ITextModel, token: CancellationToken): ProviderResult;
+ resolveLink?: (link: ILink, token: CancellationToken) => ProviderResult;
+ }
+
+ /**
+ * A color in RGBA format.
+ */
+ export interface IColor {
+ /**
+ * The red component in the range [0-1].
+ */
+ readonly red: number;
+ /**
+ * The green component in the range [0-1].
+ */
+ readonly green: number;
+ /**
+ * The blue component in the range [0-1].
+ */
+ readonly blue: number;
+ /**
+ * The alpha component in the range [0-1].
+ */
+ readonly alpha: number;
+ }
+
+ /**
+ * String representations for a color
+ */
+ export interface IColorPresentation {
+ /**
+ * The label of this color presentation. It will be shown on the color
+ * picker header. By default this is also the text that is inserted when selecting
+ * this color presentation.
+ */
+ label: string;
+ /**
+ * An {@link TextEdit edit} which is applied to a document when selecting
+ * this presentation for the color.
+ */
+ textEdit?: TextEdit;
+ /**
+ * An optional array of additional {@link TextEdit text edits} that are applied when
+ * selecting this color presentation.
+ */
+ additionalTextEdits?: TextEdit[];
+ }
+
+ /**
+ * A color range is a range in a text model which represents a color.
+ */
+ export interface IColorInformation {
+ /**
+ * The range within the model.
+ */
+ range: IRange;
+ /**
+ * The color represented in this range.
+ */
+ color: IColor;
+ }
+
+ /**
+ * A provider of colors for editor models.
+ */
+ export interface DocumentColorProvider {
+ /**
+ * Provides the color ranges for a specific model.
+ */
+ provideDocumentColors(model: editor.ITextModel, token: CancellationToken): ProviderResult;
+ /**
+ * Provide the string representations for a color.
+ */
+ provideColorPresentations(model: editor.ITextModel, colorInfo: IColorInformation, token: CancellationToken): ProviderResult;
+ }
+
+ export interface SelectionRange {
+ range: IRange;
+ }
+
+ export interface SelectionRangeProvider {
+ /**
+ * Provide ranges that should be selected from the given position.
+ */
+ provideSelectionRanges(model: editor.ITextModel, positions: Position[], token: CancellationToken): ProviderResult;
+ }
+
+ export interface FoldingContext {
+ }
+
+ /**
+ * A provider of folding ranges for editor models.
+ */
+ export interface FoldingRangeProvider {
+ /**
+ * An optional event to signal that the folding ranges from this provider have changed.
+ */
+ onDidChange?: IEvent;
+ /**
+ * Provides the folding ranges for a specific model.
+ */
+ provideFoldingRanges(model: editor.ITextModel, context: FoldingContext, token: CancellationToken): ProviderResult;
+ }
+
+ export interface FoldingRange {
+ /**
+ * The one-based start line of the range to fold. The folded area starts after the line's last character.
+ */
+ start: number;
+ /**
+ * The one-based end line of the range to fold. The folded area ends with the line's last character.
+ */
+ end: number;
+ /**
+ * Describes the {@link FoldingRangeKind Kind} of the folding range such as {@link FoldingRangeKind.Comment Comment} or
+ * {@link FoldingRangeKind.Region Region}. The kind is used to categorize folding ranges and used by commands
+ * like 'Fold all comments'. See
+ * {@link FoldingRangeKind} for an enumeration of standardized kinds.
+ */
+ kind?: FoldingRangeKind;
+ }
+
+ export class FoldingRangeKind {
+ value: string;
+ /**
+ * Kind for folding range representing a comment. The value of the kind is 'comment'.
+ */
+ static readonly Comment: FoldingRangeKind;
+ /**
+ * Kind for folding range representing a import. The value of the kind is 'imports'.
+ */
+ static readonly Imports: FoldingRangeKind;
+ /**
+ * Kind for folding range representing regions (for example marked by `#region`, `#endregion`).
+ * The value of the kind is 'region'.
+ */
+ static readonly Region: FoldingRangeKind;
+ /**
+ * Creates a new {@link FoldingRangeKind}.
+ *
+ * @param value of the kind.
+ */
+ constructor(value: string);
+ }
+
+ export interface WorkspaceEditMetadata {
+ needsConfirmation: boolean;
+ label: string;
+ description?: string;
+ }
+
+ export interface WorkspaceFileEditOptions {
+ overwrite?: boolean;
+ ignoreIfNotExists?: boolean;
+ ignoreIfExists?: boolean;
+ recursive?: boolean;
+ copy?: boolean;
+ folder?: boolean;
+ skipTrashBin?: boolean;
+ maxSize?: number;
+ }
+
+ export interface WorkspaceFileEdit {
+ oldUri?: Uri;
+ newUri?: Uri;
+ options?: WorkspaceFileEditOptions;
+ metadata?: WorkspaceEditMetadata;
+ }
+
+ export interface WorkspaceTextEdit {
+ resource: Uri;
+ edit: TextEdit;
+ modelVersionId?: number;
+ metadata?: WorkspaceEditMetadata;
+ }
+
+ export interface WorkspaceEdit {
+ edits: Array;
+ }
+
+ export interface Rejection {
+ rejectReason?: string;
+ }
+
+ export interface RenameLocation {
+ range: IRange;
+ text: string;
+ }
+
+ export interface RenameProvider {
+ provideRenameEdits(model: editor.ITextModel, position: Position, newName: string, token: CancellationToken): ProviderResult;
+ resolveRenameLocation?(model: editor.ITextModel, position: Position, token: CancellationToken): ProviderResult;
+ }
+
+ export interface Command {
+ id: string;
+ title: string;
+ tooltip?: string;
+ arguments?: any[];
+ }
+
+ export interface CodeLens {
+ range: IRange;
+ id?: string;
+ command?: Command;
+ }
+
+ export interface CodeLensList {
+ lenses: CodeLens[];
+ dispose(): void;
+ }
+
+ export interface CodeLensProvider {
+ onDidChange?: IEvent;
+ provideCodeLenses(model: editor.ITextModel, token: CancellationToken): ProviderResult;
+ resolveCodeLens?(model: editor.ITextModel, codeLens: CodeLens, token: CancellationToken): ProviderResult;
+ }
+
+ export enum InlayHintKind {
+ Other = 0,
+ Type = 1,
+ Parameter = 2
+ }
+
+ export interface InlayHint {
+ text: string;
+ position: IPosition;
+ kind: InlayHintKind;
+ whitespaceBefore?: boolean;
+ whitespaceAfter?: boolean;
+ }
+
+ export interface InlayHintsProvider {
+ onDidChangeInlayHints?: IEvent | undefined;
+ provideInlayHints(model: editor.ITextModel, range: Range, token: CancellationToken): ProviderResult;
+ }
+
+ export interface SemanticTokensLegend {
+ readonly tokenTypes: string[];
+ readonly tokenModifiers: string[];
+ }
+
+ export interface SemanticTokens {
+ readonly resultId?: string;
+ readonly data: Uint32Array;
+ }
+
+ export interface SemanticTokensEdit {
+ readonly start: number;
+ readonly deleteCount: number;
+ readonly data?: Uint32Array;
+ }
+
+ export interface SemanticTokensEdits {
+ readonly resultId?: string;
+ readonly edits: SemanticTokensEdit[];
+ }
+
+ export interface DocumentSemanticTokensProvider {
+ onDidChange?: IEvent;
+ getLegend(): SemanticTokensLegend;
+ provideDocumentSemanticTokens(model: editor.ITextModel, lastResultId: string | null, token: CancellationToken): ProviderResult;
+ releaseDocumentSemanticTokens(resultId: string | undefined): void;
+ }
+
+ export interface DocumentRangeSemanticTokensProvider {
+ getLegend(): SemanticTokensLegend;
+ provideDocumentRangeSemanticTokens(model: editor.ITextModel, range: Range, token: CancellationToken): ProviderResult;
+ }
+
+ export interface ILanguageExtensionPoint {
+ id: string;
+ extensions?: string[];
+ filenames?: string[];
+ filenamePatterns?: string[];
+ firstLine?: string;
+ aliases?: string[];
+ mimetypes?: string[];
+ configuration?: Uri;
+ }
+ /**
+ * A Monarch language definition
+ */
+ export interface IMonarchLanguage {
+ /**
+ * map from string to ILanguageRule[]
+ */
+ tokenizer: {
+ [name: string]: IMonarchLanguageRule[];
+ };
+ /**
+ * is the language case insensitive?
+ */
+ ignoreCase?: boolean;
+ /**
+ * is the language unicode-aware? (i.e., /\u{1D306}/)
+ */
+ unicode?: boolean;
+ /**
+ * if no match in the tokenizer assign this token class (default 'source')
+ */
+ defaultToken?: string;
+ /**
+ * for example [['{','}','delimiter.curly']]
+ */
+ brackets?: IMonarchLanguageBracket[];
+ /**
+ * start symbol in the tokenizer (by default the first entry is used)
+ */
+ start?: string;
+ /**
+ * attach this to every token class (by default '.' + name)
+ */
+ tokenPostfix?: string;
+ /**
+ * include line feeds (in the form of a \n character) at the end of lines
+ * Defaults to false
+ */
+ includeLF?: boolean;
+ /**
+ * Other keys that can be referred to by the tokenizer.
+ */
+ [key: string]: any;
+ }
+
+ /**
+ * A rule is either a regular expression and an action
+ * shorthands: [reg,act] == { regex: reg, action: act}
+ * and : [reg,act,nxt] == { regex: reg, action: act{ next: nxt }}
+ */
+ export type IShortMonarchLanguageRule1 = [string | RegExp, IMonarchLanguageAction];
+
+ export type IShortMonarchLanguageRule2 = [string | RegExp, IMonarchLanguageAction, string];
+
+ export interface IExpandedMonarchLanguageRule {
+ /**
+ * match tokens
+ */
+ regex?: string | RegExp;
+ /**
+ * action to take on match
+ */
+ action?: IMonarchLanguageAction;
+ /**
+ * or an include rule. include all rules from the included state
+ */
+ include?: string;
+ }
+
+ export type IMonarchLanguageRule = IShortMonarchLanguageRule1 | IShortMonarchLanguageRule2 | IExpandedMonarchLanguageRule;
+
+ /**
+ * An action is either an array of actions...
+ * ... or a case statement with guards...
+ * ... or a basic action with a token value.
+ */
+ export type IShortMonarchLanguageAction = string;
+
+ export interface IExpandedMonarchLanguageAction {
+ /**
+ * array of actions for each parenthesized match group
+ */
+ group?: IMonarchLanguageAction[];
+ /**
+ * map from string to ILanguageAction
+ */
+ cases?: Object;
+ /**
+ * token class (ie. css class) (or "@brackets" or "@rematch")
+ */
+ token?: string;
+ /**
+ * the next state to push, or "@push", "@pop", "@popall"
+ */
+ next?: string;
+ /**
+ * switch to this state
+ */
+ switchTo?: string;
+ /**
+ * go back n characters in the stream
+ */
+ goBack?: number;
+ /**
+ * @open or @close
+ */
+ bracket?: string;
+ /**
+ * switch to embedded language (using the mimetype) or get out using "@pop"
+ */
+ nextEmbedded?: string;
+ /**
+ * log a message to the browser console window
+ */
+ log?: string;
+ }
+
+ export type IMonarchLanguageAction = IShortMonarchLanguageAction | IExpandedMonarchLanguageAction | IShortMonarchLanguageAction[] | IExpandedMonarchLanguageAction[];
+
+ /**
+ * This interface can be shortened as an array, ie. ['{','}','delimiter.curly']
+ */
+ export interface IMonarchLanguageBracket {
+ /**
+ * open bracket
+ */
+ open: string;
+ /**
+ * closing bracket
+ */
+ close: string;
+ /**
+ * token class
+ */
+ token: string;
+ }
+
+}
+
+declare namespace monaco.worker {
+
+
+ export interface IMirrorTextModel {
+ readonly version: number;
+ }
+
+ export interface IMirrorModel extends IMirrorTextModel {
+ readonly uri: Uri;
+ readonly version: number;
+ getValue(): string;
+ }
+
+ export interface IWorkerContext {
+ /**
+ * A proxy to the main thread host object.
+ */
+ host: H;
+ /**
+ * Get all available mirror models in this worker.
+ */
+ getMirrorModels(): IMirrorModel[];
+ }
+
+}
+
+//dtsv=3
+
+/*---------------------------------------------------------------------------------------------
+ * Copyright (c) Microsoft Corporation. All rights reserved.
+ * Licensed under the MIT License. See License.txt in the project root for license information.
+ *--------------------------------------------------------------------------------------------*/
+
+
+declare namespace monaco.languages.typescript {
+ export enum ModuleKind {
+ None = 0,
+ CommonJS = 1,
+ AMD = 2,
+ UMD = 3,
+ System = 4,
+ ES2015 = 5,
+ ESNext = 99
+ }
+ export enum JsxEmit {
+ None = 0,
+ Preserve = 1,
+ React = 2,
+ ReactNative = 3,
+ ReactJSX = 4,
+ ReactJSXDev = 5
+ }
+ export enum NewLineKind {
+ CarriageReturnLineFeed = 0,
+ LineFeed = 1
+ }
+ export enum ScriptTarget {
+ ES3 = 0,
+ ES5 = 1,
+ ES2015 = 2,
+ ES2016 = 3,
+ ES2017 = 4,
+ ES2018 = 5,
+ ES2019 = 6,
+ ES2020 = 7,
+ ESNext = 99,
+ JSON = 100,
+ Latest = 99
+ }
+ export enum ModuleResolutionKind {
+ Classic = 1,
+ NodeJs = 2
+ }
+ interface MapLike {
+ [index: string]: T;
+ }
+ type CompilerOptionsValue =
+ | string
+ | number
+ | boolean
+ | (string | number)[]
+ | string[]
+ | MapLike
+ | null
+ | undefined;
+ interface CompilerOptions {
+ allowJs?: boolean;
+ allowSyntheticDefaultImports?: boolean;
+ allowUmdGlobalAccess?: boolean;
+ allowUnreachableCode?: boolean;
+ allowUnusedLabels?: boolean;
+ alwaysStrict?: boolean;
+ baseUrl?: string;
+ charset?: string;
+ checkJs?: boolean;
+ declaration?: boolean;
+ declarationMap?: boolean;
+ emitDeclarationOnly?: boolean;
+ declarationDir?: string;
+ disableSizeLimit?: boolean;
+ disableSourceOfProjectReferenceRedirect?: boolean;
+ downlevelIteration?: boolean;
+ emitBOM?: boolean;
+ emitDecoratorMetadata?: boolean;
+ experimentalDecorators?: boolean;
+ forceConsistentCasingInFileNames?: boolean;
+ importHelpers?: boolean;
+ inlineSourceMap?: boolean;
+ inlineSources?: boolean;
+ isolatedModules?: boolean;
+ jsx?: JsxEmit;
+ keyofStringsOnly?: boolean;
+ lib?: string[];
+ locale?: string;
+ mapRoot?: string;
+ maxNodeModuleJsDepth?: number;
+ module?: ModuleKind;
+ moduleResolution?: ModuleResolutionKind;
+ newLine?: NewLineKind;
+ noEmit?: boolean;
+ noEmitHelpers?: boolean;
+ noEmitOnError?: boolean;
+ noErrorTruncation?: boolean;
+ noFallthroughCasesInSwitch?: boolean;
+ noImplicitAny?: boolean;
+ noImplicitReturns?: boolean;
+ noImplicitThis?: boolean;
+ noStrictGenericChecks?: boolean;
+ noUnusedLocals?: boolean;
+ noUnusedParameters?: boolean;
+ noImplicitUseStrict?: boolean;
+ noLib?: boolean;
+ noResolve?: boolean;
+ out?: string;
+ outDir?: string;
+ outFile?: string;
+ paths?: MapLike;
+ preserveConstEnums?: boolean;
+ preserveSymlinks?: boolean;
+ project?: string;
+ reactNamespace?: string;
+ jsxFactory?: string;
+ composite?: boolean;
+ removeComments?: boolean;
+ rootDir?: string;
+ rootDirs?: string[];
+ skipLibCheck?: boolean;
+ skipDefaultLibCheck?: boolean;
+ sourceMap?: boolean;
+ sourceRoot?: string;
+ strict?: boolean;
+ strictFunctionTypes?: boolean;
+ strictBindCallApply?: boolean;
+ strictNullChecks?: boolean;
+ strictPropertyInitialization?: boolean;
+ stripInternal?: boolean;
+ suppressExcessPropertyErrors?: boolean;
+ suppressImplicitAnyIndexErrors?: boolean;
+ target?: ScriptTarget;
+ traceResolution?: boolean;
+ resolveJsonModule?: boolean;
+ types?: string[];
+ /** Paths used to compute primary types search locations */
+ typeRoots?: string[];
+ esModuleInterop?: boolean;
+ useDefineForClassFields?: boolean;
+ [option: string]: CompilerOptionsValue | undefined;
+ }
+ export interface DiagnosticsOptions {
+ noSemanticValidation?: boolean;
+ noSyntaxValidation?: boolean;
+ noSuggestionDiagnostics?: boolean;
+ /**
+ * Limit diagnostic computation to only visible files.
+ * Defaults to false.
+ */
+ onlyVisible?: boolean;
+ diagnosticCodesToIgnore?: number[];
+ }
+ export interface WorkerOptions {
+ /** A full HTTP path to a JavaScript file which adds a function `customTSWorkerFactory` to the self inside a web-worker */
+ customWorkerPath?: string;
+ }
+ interface IExtraLib {
+ content: string;
+ version: number;
+ }
+ export interface IExtraLibs {
+ [path: string]: IExtraLib;
+ }
+ /**
+ * A linked list of formatted diagnostic messages to be used as part of a multiline message.
+ * It is built from the bottom up, leaving the head to be the "main" diagnostic.
+ */
+ interface DiagnosticMessageChain {
+ messageText: string;
+ /** Diagnostic category: warning = 0, error = 1, suggestion = 2, message = 3 */
+ category: 0 | 1 | 2 | 3;
+ code: number;
+ next?: DiagnosticMessageChain[];
+ }
+ export interface Diagnostic extends DiagnosticRelatedInformation {
+ /** May store more in future. For now, this will simply be `true` to indicate when a diagnostic is an unused-identifier diagnostic. */
+ reportsUnnecessary?: {};
+ reportsDeprecated?: {};
+ source?: string;
+ relatedInformation?: DiagnosticRelatedInformation[];
+ }
+ export interface DiagnosticRelatedInformation {
+ /** Diagnostic category: warning = 0, error = 1, suggestion = 2, message = 3 */
+ category: 0 | 1 | 2 | 3;
+ code: number;
+ /** TypeScriptWorker removes all but the `fileName` property to avoid serializing circular JSON structures. */
+ file:
+ | {
+ fileName: string;
+ }
+ | undefined;
+ start: number | undefined;
+ length: number | undefined;
+ messageText: string | DiagnosticMessageChain;
+ }
+ interface EmitOutput {
+ outputFiles: OutputFile[];
+ emitSkipped: boolean;
+ }
+ interface OutputFile {
+ name: string;
+ writeByteOrderMark: boolean;
+ text: string;
+ }
+ export interface LanguageServiceDefaults {
+ /**
+ * Event fired when compiler options or diagnostics options are changed.
+ */
+ readonly onDidChange: IEvent;
+ /**
+ * Event fired when extra libraries registered with the language service change.
+ */
+ readonly onDidExtraLibsChange: IEvent;
+ readonly workerOptions: WorkerOptions;
+ /**
+ * Get the current extra libs registered with the language service.
+ */
+ getExtraLibs(): IExtraLibs;
+ /**
+ * Add an additional source file to the language service. Use this
+ * for typescript (definition) files that won't be loaded as editor
+ * documents, like `jquery.d.ts`.
+ *
+ * @param content The file content
+ * @param filePath An optional file path
+ * @returns A disposable which will remove the file from the
+ * language service upon disposal.
+ */
+ addExtraLib(content: string, filePath?: string): IDisposable;
+ /**
+ * Remove all existing extra libs and set the additional source
+ * files to the language service. Use this for typescript definition
+ * files that won't be loaded as editor documents, like `jquery.d.ts`.
+ * @param libs An array of entries to register.
+ */
+ setExtraLibs(
+ libs: {
+ content: string;
+ filePath?: string;
+ }[]
+ ): void;
+ /**
+ * Get current TypeScript compiler options for the language service.
+ */
+ getCompilerOptions(): CompilerOptions;
+ /**
+ * Set TypeScript compiler options.
+ */
+ setCompilerOptions(options: CompilerOptions): void;
+ /**
+ * Get the current diagnostics options for the language service.
+ */
+ getDiagnosticsOptions(): DiagnosticsOptions;
+ /**
+ * Configure whether syntactic and/or semantic validation should
+ * be performed
+ */
+ setDiagnosticsOptions(options: DiagnosticsOptions): void;
+ /**
+ * Configure webworker options
+ */
+ setWorkerOptions(options: WorkerOptions): void;
+ /**
+ * No-op.
+ */
+ setMaximumWorkerIdleTime(value: number): void;
+ /**
+ * Configure if all existing models should be eagerly sync'd
+ * to the worker on start or restart.
+ */
+ setEagerModelSync(value: boolean): void;
+ /**
+ * Get the current setting for whether all existing models should be eagerly sync'd
+ * to the worker on start or restart.
+ */
+ getEagerModelSync(): boolean;
+ }
+ export interface TypeScriptWorker {
+ /**
+ * Get diagnostic messages for any syntax issues in the given file.
+ */
+ getSyntacticDiagnostics(fileName: string): Promise;
+ /**
+ * Get diagnostic messages for any semantic issues in the given file.
+ */
+ getSemanticDiagnostics(fileName: string): Promise;
+ /**
+ * Get diagnostic messages for any suggestions related to the given file.
+ */
+ getSuggestionDiagnostics(fileName: string): Promise;
+ /**
+ * Get the content of a given file.
+ */
+ getScriptText(fileName: string): Promise;
+ /**
+ * Get diagnostic messages related to the current compiler options.
+ * @param fileName Not used
+ */
+ getCompilerOptionsDiagnostics(fileName: string): Promise;
+ /**
+ * Get code completions for the given file and position.
+ * @returns `Promise`
+ */
+ getCompletionsAtPosition(fileName: string, position: number): Promise;
+ /**
+ * Get code completion details for the given file, position, and entry.
+ * @returns `Promise`
+ */
+ getCompletionEntryDetails(
+ fileName: string,
+ position: number,
+ entry: string
+ ): Promise;
+ /**
+ * Get signature help items for the item at the given file and position.
+ * @returns `Promise`
+ */
+ getSignatureHelpItems(
+ fileName: string,
+ position: number,
+ options: any
+ ): Promise;
+ /**
+ * Get quick info for the item at the given position in the file.
+ * @returns `Promise