Skip to content

Instantly share code, notes, and snippets.

@leroix
Created December 9, 2017 01:06
Show Gist options
  • Save leroix/f2d68bf754ce39c6ec3c10e472e56a76 to your computer and use it in GitHub Desktop.
Save leroix/f2d68bf754ce39c6ec3c10e472e56a76 to your computer and use it in GitHub Desktop.
This file has been truncated, but you can view the full file.
var snapshotAuxiliaryData = {"lessSourcesByRelativeFilePath":{"static/atom.less":{"content":"// Import from the syntax theme's variables with a fallback to ./variables/syntax-variables.less\n@import \"./variables/syntax-variables\";\n@import \"syntax-variables\";\n\n// Import from the ui theme's variables with a fallback to ./variables/ui-variables.less\n@import \"./variables/ui-variables\";\n@import \"ui-variables\";\n\n// Octicons\n@import \"octicon-utf-codes\";\n@import \"octicon-mixins\";\n@import \"octicons\";\n\n// Normalize + scaffolding\n@import \"normalize\";\n@import \"scaffolding\";\n\n// Core components\n@import \"cursors\";\n@import \"panels\";\n@import \"docks\";\n@import \"panes\";\n@import \"syntax\";\n@import \"text-editor\";\n@import \"title-bar\";\n@import \"workspace-view\";\n\n// Atom UI library\n@import \"../node_modules/atom-ui/atom-ui.less\";\n","digest":"efab0f9ffc43da40c3d8338fc16e191714b58371"},"static/cursors.less":{"content":"@import \"./variables/syntax-variables\";\n@import \"syntax-variables\";\n\n@import \"./variables/ui-variables\";\n@import \"ui-variables\";\n\n@ibeam-1x: url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAQAAAC1+jfqAAAAL0lEQVQoz2NgCD3x//9/BhBYBWdhgFVAiVW4JBFKGIa4AqD0//9D3pt4I4tAdAMAHTQ/j5Zom30AAAAASUVORK5CYII=');\n@ibeam-2x: url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAQAAADZc7J/AAAAz0lEQVRIx2NgYGBY/R8I/vx5eelX3n82IJ9FxGf6tksvf/8FiTMQAcAGQMDvSwu09abffY8QYSAScNk45G198eX//yev73/4///701eh//kZSARckrNBRvz//+8+6ZohwCzjGNjdgQxkAg7B9WADeBjIBqtJCbhRA0YNoIkBSNmaPEMoNmA0FkYNoFKhapJ6FGyAH3nauaSmPfwI0v/3OukVi0CIZ+F25KrtYcx/CTIy0e+rC7R1Z4KMICVTQQ14feVXIbR695u14+Ir4gwAAD49E54wc1kWAAAAAElFTkSuQmCC');\n\n.cursor-white() {\n cursor: -webkit-image-set(@ibeam-1x 1x, @ibeam-2x 2x) 5 8, text;\n}\n\n// Editors\n& when ( lightness(@syntax-background-color) < 50% ) {\n .platform-darwin atom-text-editor:not([mini]) {\n .cursor-white();\n }\n}\n\n// Mini Editors\n& when ( lightness(@input-background-color) < 50% ) {\n .platform-darwin atom-text-editor[mini] {\n .cursor-white();\n }\n}\n","digest":"1735d16beddc1b6fefb5ea5c8d599c9e7a285a7a"},"static/docks.less":{"content":"@import 'ui-variables';\n@import 'syntax-variables';\n\n@atom-dock-toggle-button-size: 50px;\n@atom-dock-resize-handle-size: 4px;\n\n// Dock --------------\n\n// The actual dock element is used as a kind of placeholder in the DOM, relative\n// to which its children can be positioned.\natom-dock {\n display: flex;\n position: relative;\n}\n\n.atom-dock-inner {\n display: flex;\n\n // Keep the area at least a pixel wide so that you have something to hover\n // over to trigger the toggle button affordance even when fullscreen.\n &.left, &.right { min-width: 1px; }\n &.bottom { min-height: 1px; }\n\n &.bottom { width: 100%; }\n &.left, &.right { height: 100%; }\n\n // Make sure to center the toggle buttons\n &.bottom { flex-direction: column; }\n align-items: center;\n\n // Position the docks flush with their side of the editor.\n &.right { right: 0; }\n &.bottom { bottom: 0; }\n &.left { left: 0; }\n\n // Position the docks flush with their side of the editor.\n &.right { right: 0; }\n &.bottom { bottom: 0; }\n &.left { left: 0; }\n\n &:not(.atom-dock-open) {\n // The dock should only take up space when it's active (i.e. it shouldn't\n // take up space when you're dragging something into it).\n position: absolute;\n z-index: 10; // An arbitrary number. Seems high enough. ¯\\_(ツ)_/¯\n }\n}\n\n.atom-dock-mask {\n position: relative;\n background-color: @tool-panel-background-color;\n overflow: hidden; // Mask the content.\n\n // One of these will be overridden by the component with an explicit size.\n // Which depends on the position of the dock.\n width: 100%;\n height: 100%;\n\n transition: none;\n &.atom-dock-should-animate {\n transition: width 0.2s ease-out, height 0.2s ease-out;\n }\n}\n\n.atom-dock-content-wrapper {\n position: absolute;\n display: flex;\n flex: 1;\n align-items: stretch;\n width: 100%;\n height: 100%;\n\n // The contents of the dock should be \"stuck\" to the moving edge of the mask,\n // so it looks like they're sliding in (instead of being unmasked in place).\n &.right { left: 0; }\n &.bottom { top: 0; }\n &.left { right: 0; }\n\n // Use flex-direction to put the resize handle in the correct place.\n &.left { flex-direction: row-reverse; }\n &.bottom { flex-direction: column; }\n &.right { flex-direction: row; }\n}\n\n// Toggle button --------------\n\n.atom-dock-toggle-button {\n position: absolute;\n overflow: hidden; // Mask half of the circle.\n\n // Must be > .scrollbar-content and inactive atom-dock\n z-index: 11;\n\n // Position the toggle button target at the edge of the dock. It's important\n // that this is absolutely positioned so that it doesn't expand the area of\n // its container (which would block mouse events).\n &.right { right: 100%; }\n &.bottom { bottom: 100%; }\n &.left { left: 100%; }\n\n width: @atom-dock-toggle-button-size;\n height: @atom-dock-toggle-button-size;\n &.bottom { height: @atom-dock-toggle-button-size / 2; }\n &.left, &.right { width: @atom-dock-toggle-button-size / 2; }\n\n .atom-dock-toggle-button-inner {\n width: @atom-dock-toggle-button-size;\n height: @atom-dock-toggle-button-size;\n border-radius: @atom-dock-toggle-button-size / 2;\n\n position: absolute;\n display: flex;\n text-align: center;\n justify-content: center;\n align-items: center;\n cursor: pointer;\n\n // Promote to own layer, fixes rendering issue atom/atom#14915\n will-change: transform;\n\n &.right { left: 0; }\n &.bottom { top: 0; }\n &.left { right: 0; }\n }\n\n // Hide the button.\n &:not(.atom-dock-toggle-button-visible) {\n .atom-dock-toggle-button-inner {\n &.right { transform: translateX(50%); }\n &.bottom { transform: translateY(50%); }\n &.left { transform: translateX(-50%); }\n }\n }\n\n // Center the icon.\n @offset: 8px;\n .atom-dock-toggle-button-inner {\n &.right .icon { transform: translateX(-@offset); }\n &.bottom .icon { transform: translateY(-@offset); }\n &.left .icon { transform: translateX(@offset); }\n }\n\n // Animate the icon.\n .icon {\n transition: opacity 0.1s ease-in 0.1s; // intro\n opacity: 1;\n\n &::before {\n // Shrink the icon element to the size of the character.\n width: auto;\n margin: 0;\n }\n }\n &:not(.atom-dock-toggle-button-visible) .icon {\n opacity: 0;\n transition: opacity 0.2s ease-out 0s; // outro\n }\n\n .atom-dock-toggle-button-inner {\n background-color: @tool-panel-background-color;\n border: 1px solid @pane-item-border-color;\n transition: transform 0.2s ease-out 0s; // intro\n }\n\n &:not(.atom-dock-toggle-button-visible) {\n // Don't contribute to mouseenter/drag events when not visible.\n pointer-events: none;\n\n .atom-dock-toggle-button-inner {\n transition: transform 0.2s ease-out 0.1s; // outro\n }\n }\n}\n\n// Resize handle --------------\n\n.atom-dock-resize-handle {\n width: auto;\n height: auto;\n flex: 0 0 auto;\n\n // Use the resize cursor when the handle's resizable\n &.atom-dock-resize-handle-resizable {\n &.left, &.right { cursor: col-resize; }\n &.bottom { cursor: row-resize; }\n }\n\n &.left, &.right { width: @atom-dock-resize-handle-size; }\n &.bottom { height: @atom-dock-resize-handle-size; }\n}\n\n// Cursor overlay --------------\n\n.atom-dock-cursor-overlay {\n position: fixed;\n top: 0;\n bottom: 0;\n left: 0;\n right: 0;\n z-index: 4;\n\n &.left,\n &.right {\n cursor: col-resize;\n }\n\n &.bottom {\n cursor: row-resize;\n }\n\n &:not(.atom-dock-cursor-overlay-visible) {\n display: none;\n }\n}\n","digest":"d005b1871040daf059507d1a14a3bd552503125a"},"static/jasmine.less":{"content":"@import \"ui-variables\";\n@import \"octicon-mixins\";\n\nhtml {\n background-color: @base-background-color;\n}\n\nbody {\n padding: 0;\n background-color: transparent;\n}\n\n.spec-reporter-container {\n position: fixed;\n display: flex;\n flex-direction: column;\n justify-content: flex-end;\n z-index: 99999;\n top: 0;\n left: 0;\n right: 0;\n bottom: 0;\n}\n\n.spec-reporter {\n flex: 1 1 0;\n overflow-y: auto;\n font-size: 11px;\n line-height: 1.6em;\n color: #333;\n background-color: hsl(0, 0%, 98%);\n\n // 578px initial window height, resize to see underlying editor\n @media (min-height: 578px) {\n flex: 0 1 75%;\n min-height: 578px;\n }\n\n .list-unstyled {\n list-style: none;\n }\n\n .reload-button {\n color: #333;\n background-color: #fff;\n border: 1px solid #ccc;\n\n &:hover {\n background-color: #ddd;\n color: #222;\n }\n }\n\n .symbol-header {\n font-size: 18px;\n font-weight: bold;\n padding-bottom: 10px;\n }\n\n .symbol-area {\n padding: 10px;\n }\n\n .symbol-summary {\n overflow: hidden;\n margin: 0;\n\n li {\n font-family: Monaco, Consolas, monospace;\n float: left;\n line-height: 10px;\n height: 10px;\n width: 10px;\n font-size: 10px;\n\n &.passed {\n color: #5cb85c;\n }\n\n &.failed {\n color: #d9534f;\n }\n\n &.skipped {\n color: #f0ad4e;\n }\n\n &.pending {\n color: #eee;\n }\n\n &::before {\n content: \"\\02022\";\n }\n }\n }\n\n .status {\n font-size: 20px;\n line-height: 2em;\n padding: 5px;\n border-radius: 0;\n text-align: center;\n\n .spec-count {\n float: left;\n }\n\n .time {\n float: right;\n }\n }\n\n .results {\n padding: 10px;\n\n .description {\n font-size: 16px;\n padding: 5px 0 5px 0;\n }\n\n > .suite {\n > .description {\n font-size: 18px;\n font-weight: bold;\n }\n\n margin-bottom: 20px;\n }\n\n .spec {\n margin-top: 5px;\n padding: 0 10px 10px 10px;\n border-left: 3px solid #d9534f;\n\n .spec-toggle {\n .octicon(fold);\n float: right;\n cursor: pointer;\n opacity: 0;\n color: #999;\n\n &.folded {\n .octicon(unfold);\n }\n }\n\n .spec-toggle:hover {\n color: #333;\n }\n\n &:hover .spec-toggle {\n opacity: 1;\n }\n }\n\n .suite > .suite,\n .suite > .spec {\n margin-left: 10px;\n }\n }\n\n .result-message {\n font-size: 16px;\n font-weight: bold;\n color: #d9534f;\n padding: 5px 0 5px 0;\n white-space: pre-wrap;\n }\n\n .result-message.deprecation-message {\n font-weight: normal;\n color: darken(#f0ad4e, 20%);\n line-height: 1.4;\n\n a {\n color: darken(#f0ad4e, 15%);\n }\n\n code {\n color: darken(#f0ad4e, 20%);\n background: lighten(#f0ad4e, 35%);\n }\n }\n\n .stack-trace {\n font-size: 12px;\n margin: 5px 0 0 0;\n border-radius: 2px;\n line-height: 18px;\n color: #ccc;\n border: 1px solid #ddd;\n overflow: auto;\n }\n\n .tooltip {\n .tooltip-inner {\n border: 1px solid #ccc;\n background: #fff;\n color: #666;\n max-width: 400px;\n }\n\n &.in {\n opacity: 1;\n }\n\n .tooltip-arrow {\n visibility: hidden;\n }\n }\n\n .result-message.fail, .stack-trace.padded {\n text-overflow: ellipsis;\n display: -webkit-box;\n -webkit-box-orient: vertical;\n -webkit-line-clamp: 10;\n overflow: hidden;\n\n &.expanded {\n -webkit-line-clamp: inherit;\n // overflow: hidden;\n }\n }\n\n .deprecation-toggle {\n .octicon(fold);\n float: right;\n cursor: pointer;\n opacity: 0;\n color: #999;\n\n &.folded {\n .octicon(unfold);\n }\n }\n\n .deprecation-toggle:hover {\n color: #333;\n }\n\n &:hover .deprecation-toggle {\n opacity: 1;\n }\n}\n","digest":"e40f499e4c81187cb45b28968d0307a73e146103"},"static/linux.less":{"content":"::-webkit-scrollbar-corner {\n background-color: transparent;\n}\n\n::-webkit-scrollbar {\n width: 8px;\n height: 8px;\n}\n\n::-webkit-scrollbar-thumb {\n border-radius: 2px;\n background: rgba(150, 150, 150, .33);\n}\n","digest":"4c4a94845e7f223b4aca5a2ac1fb52a02eb1ce43"},"static/normalize.less":{"content":"/*! normalize.css v3.0.3 | MIT License | github.com/necolas/normalize.css */\n// Modified to Chrome only.\n\n//\n// Remove default margin.\n//\n\nbody {\n margin: 0;\n}\n\n// HTML5 display definitions\n// ==========================================================================\n\n//\n// 1. Normalize vertical alignment of `progress` in Chrome, Firefox, and Opera.\n//\n\naudio,\ncanvas,\nprogress,\nvideo {\n vertical-align: baseline; // 1\n}\n\n//\n// Prevent modern browsers from displaying `audio` without controls.\n//\n\naudio:not([controls]) {\n display: none;\n}\n\n// Links\n// ==========================================================================\n\n//\n// Improve readability of focused elements when they are also in an\n// active/hover state.\n//\n\na:active,\na:hover {\n outline: 0;\n}\n\n// Text-level semantics\n// ==========================================================================\n\n//\n// Address styling not present in IE 8/9/10/11, Safari, and Chrome.\n//\n\nabbr[title] {\n border-bottom: 1px dotted;\n}\n\n//\n// Address style set to `bolder` in Firefox 4+, Safari, and Chrome.\n//\n\nb,\nstrong {\n font-weight: bold;\n}\n\n//\n// Address styling not present in Safari and Chrome.\n//\n\ndfn {\n font-style: italic;\n}\n\n//\n// Address variable `h1` font-size and margin within `section` and `article`\n// contexts in Firefox 4+, Safari, and Chrome.\n//\n\nh1 {\n font-size: 2em;\n margin: 0.67em 0;\n}\n\n//\n// Address inconsistent and variable font size in all browsers.\n//\n\nsmall {\n font-size: 80%;\n}\n\n//\n// Prevent `sub` and `sup` affecting `line-height` in all browsers.\n//\n\nsub,\nsup {\n font-size: 75%;\n line-height: 0;\n position: relative;\n vertical-align: baseline;\n}\n\nsup {\n top: -0.5em;\n}\n\nsub {\n bottom: -0.25em;\n}\n\n// Grouping content\n// ==========================================================================\n\n//\n// Address differences between Firefox and other browsers.\n//\n\nhr {\n box-sizing: content-box;\n height: 0;\n}\n\n//\n// Contain overflow in all browsers.\n//\n\npre {\n overflow: auto;\n}\n\n//\n// Address odd `em`-unit font size rendering in all browsers.\n//\n\ncode,\nkbd,\npre,\nsamp {\n font-family: monospace, monospace;\n font-size: 1em;\n}\n\n// Forms\n// ==========================================================================\n\n//\n// Known limitation: by default, Chrome and Safari on OS X allow very limited\n// styling of `select`, unless a `border` property is set.\n//\n\n//\n// 1. Correct color not being inherited.\n// Known issue: affects color of disabled elements.\n// 2. Correct font properties not being inherited.\n// 3. Address margins set differently in Firefox 4+, Safari, and Chrome.\n//\n\nbutton,\ninput,\noptgroup,\nselect,\ntextarea {\n color: inherit; // 1\n font: inherit; // 2\n margin: 0; // 3\n}\n\n//\n// Address inconsistent `text-transform` inheritance for `button` and `select`.\n// All other form control elements do not inherit `text-transform` values.\n//\n\nbutton,\nselect {\n text-transform: none;\n}\n\n//\n// 1. Improve usability and consistency of cursor style between image-type\n// `input` and others.\n//\n\nbutton,\ninput[type=\"reset\"],\ninput[type=\"submit\"] {\n cursor: pointer; // 1\n}\n\n//\n// Re-set default cursor for disabled elements.\n//\n\nbutton[disabled],\nhtml input[disabled] {\n cursor: default;\n}\n\n//\n// Fix the cursor style for Chrome's increment/decrement buttons. For certain\n// `font-size` values of the `input`, it causes the cursor style of the\n// decrement button to change from `default` to `text`.\n//\n\ninput[type=\"number\"]::-webkit-inner-spin-button,\ninput[type=\"number\"]::-webkit-outer-spin-button {\n height: auto;\n}\n\n//\n// 1. Address `appearance` set to `searchfield` in Safari and Chrome.\n// 2. Address `box-sizing` set to `border-box` in Safari and Chrome.\n//\n\ninput[type=\"search\"] {\n -webkit-appearance: textfield; // 1\n box-sizing: content-box; //2\n}\n\n//\n// Remove inner padding and search cancel button in Safari and Chrome on OS X.\n// Safari (but not Chrome) clips the cancel button when the search input has\n// padding (and `textfield` appearance).\n//\n\ninput[type=\"search\"]::-webkit-search-cancel-button,\ninput[type=\"search\"]::-webkit-search-decoration {\n -webkit-appearance: none;\n}\n\n//\n// Define consistent border, margin, and padding.\n//\n\nfieldset {\n border: 1px solid;\n margin: 0 2px;\n padding: 0.35em 0.625em 0.75em;\n}\n\n//\n// 1. Remove padding so people aren't caught out if they zero out fieldsets.\n//\n\nlegend {\n padding: 0; // 1\n}\n\n//\n// Don't inherit the `font-weight` (applied by a rule above).\n// NOTE: the default cannot safely be changed in Chrome and Safari on OS X.\n//\n\noptgroup {\n font-weight: bold;\n}\n\n// Tables\n// ==========================================================================\n\n//\n// Remove most spacing between table cells.\n//\n\ntable {\n border-collapse: collapse;\n border-spacing: 0;\n}\n\ntd,\nth {\n padding: 0;\n}\n","digest":"ab87f6d9d1264047613b807775d6a8407ee6675a"},"static/octicons.less":{"content":"@import \"octicon-mixins.less\";\n@import \"octicon-utf-codes.less\";\n\n.make-icon(@name) {\n .icon-@{name} { .octicon(@name); }\n}\n\n// There seems to be no way to make an array, or grab all the local vars in\n// less, so I am copying the octicon-utf-codes in, then doing a find and\n// replace.\n// Find: @([a-z-]+): \"[^\"]+\";\n// Replace: .make-icon(\\1);\n\n\n// Atomicons (private)\n\n.make-icon(type-array);\n.make-icon(type-boolean);\n.make-icon(type-class);\n.make-icon(type-constant);\n.make-icon(type-constructor);\n.make-icon(type-enum);\n.make-icon(type-field);\n.make-icon(type-file);\n.make-icon(type-function);\n.make-icon(type-interface);\n.make-icon(type-method);\n.make-icon(type-module);\n.make-icon(type-namespace);\n.make-icon(type-number);\n.make-icon(type-package);\n.make-icon(type-property);\n.make-icon(type-string);\n.make-icon(type-variable);\n\n\n// Octicons\n\n.make-icon(alert);\n.make-icon(alignment-align);\n.make-icon(alignment-aligned-to);\n.make-icon(alignment-unalign);\n.make-icon(arrow-down);\n.make-icon(arrow-left);\n.make-icon(arrow-right);\n.make-icon(arrow-small-down);\n.make-icon(arrow-small-left);\n.make-icon(arrow-small-right);\n.make-icon(arrow-small-up);\n.make-icon(arrow-up);\n.make-icon(beaker);\n.make-icon(beer);\n.make-icon(bell);\n.make-icon(bold);\n.make-icon(book);\n.make-icon(bookmark);\n.make-icon(briefcase);\n.make-icon(broadcast);\n.make-icon(browser);\n.make-icon(bug);\n.make-icon(calendar);\n.make-icon(check);\n.make-icon(checklist);\n.make-icon(chevron-down);\n.make-icon(chevron-left);\n.make-icon(chevron-right);\n.make-icon(chevron-up);\n.make-icon(circle-slash);\n.make-icon(circuit-board);\n.make-icon(clippy);\n.make-icon(clock);\n.make-icon(cloud-download);\n.make-icon(cloud-upload);\n.make-icon(code);\n.make-icon(color-mode);\n.make-icon(comment);\n.make-icon(comment-add);\n.make-icon(comment-discussion);\n.make-icon(credit-card);\n.make-icon(dash);\n.make-icon(dashboard);\n.make-icon(database);\n.make-icon(desktop-download);\n.make-icon(device-camera);\n.make-icon(device-camera-video);\n.make-icon(device-desktop);\n.make-icon(device-mobile);\n.make-icon(diff);\n.make-icon(diff-added);\n.make-icon(diff-ignored);\n.make-icon(diff-modified);\n.make-icon(diff-removed);\n.make-icon(diff-renamed);\n.make-icon(ellipses);\n.make-icon(ellipsis);\n.make-icon(eye);\n.make-icon(eye-unwatch);\n.make-icon(eye-watch);\n.make-icon(file);\n.make-icon(file-add);\n.make-icon(file-binary);\n.make-icon(file-code);\n.make-icon(file-directory);\n.make-icon(file-directory-create);\n.make-icon(file-media);\n.make-icon(file-pdf);\n.make-icon(file-submodule);\n.make-icon(file-symlink-directory);\n.make-icon(file-symlink-file);\n.make-icon(file-text);\n.make-icon(file-zip);\n.make-icon(flame);\n.make-icon(fold);\n.make-icon(gear);\n.make-icon(gift);\n.make-icon(gist);\n.make-icon(gist-fork);\n.make-icon(gist-new);\n.make-icon(gist-private);\n.make-icon(gist-secret);\n.make-icon(git-branch);\n.make-icon(git-branch-create);\n.make-icon(git-branch-delete);\n.make-icon(git-commit);\n.make-icon(git-compare);\n.make-icon(git-fork-private);\n.make-icon(git-merge);\n.make-icon(git-pull-request);\n.make-icon(git-pull-request-abandoned);\n.make-icon(globe);\n.make-icon(grabber);\n.make-icon(graph);\n.make-icon(heart);\n.make-icon(history);\n.make-icon(home);\n.make-icon(horizontal-rule);\n.make-icon(hourglass);\n.make-icon(hubot);\n.make-icon(inbox);\n.make-icon(info);\n.make-icon(issue-closed);\n.make-icon(issue-opened);\n.make-icon(issue-reopened);\n.make-icon(italic);\n.make-icon(jersey);\n.make-icon(jump-down);\n.make-icon(jump-left);\n.make-icon(jump-right);\n.make-icon(jump-up);\n.make-icon(key);\n.make-icon(keyboard);\n.make-icon(law);\n.make-icon(light-bulb);\n.make-icon(link);\n.make-icon(link-external);\n.make-icon(list-ordered);\n.make-icon(list-unordered);\n.make-icon(location);\n.make-icon(lock);\n.make-icon(log-in);\n.make-icon(log-out);\n.make-icon(logo-gist);\n.make-icon(logo-github);\n.make-icon(mail);\n.make-icon(mail-read);\n.make-icon(mail-reply);\n.make-icon(mark-github);\n.make-icon(markdown);\n.make-icon(megaphone);\n.make-icon(mention);\n.make-icon(microscope);\n.make-icon(milestone);\n.make-icon(mirror);\n.make-icon(mirror-private);\n.make-icon(mirror-public);\n.make-icon(mortar-board);\n.make-icon(move-down);\n.make-icon(move-left);\n.make-icon(move-right);\n.make-icon(move-up);\n.make-icon(mute);\n.make-icon(no-newline);\n.make-icon(octoface);\n.make-icon(organization);\n.make-icon(package);\n.make-icon(paintcan);\n.make-icon(pencil);\n.make-icon(person);\n.make-icon(person-add);\n.make-icon(person-follow);\n.make-icon(pin);\n.make-icon(playback-fast-forward);\n.make-icon(playback-pause);\n.make-icon(playback-play);\n.make-icon(playback-rewind);\n.make-icon(plug);\n.make-icon(plus);\n.make-icon(plus-small);\n.make-icon(podium);\n.make-icon(primitive-dot);\n.make-icon(primitive-square);\n.make-icon(pulse);\n.make-icon(puzzle);\n.make-icon(question);\n.make-icon(quote);\n.make-icon(radio-tower);\n.make-icon(remove-close);\n.make-icon(reply);\n.make-icon(repo);\n.make-icon(repo-clone);\n.make-icon(repo-create);\n.make-icon(repo-delete);\n.make-icon(repo-force-push);\n.make-icon(repo-forked);\n.make-icon(repo-pull);\n.make-icon(repo-push);\n.make-icon(repo-sync);\n.make-icon(rocket);\n.make-icon(rss);\n.make-icon(ruby);\n.make-icon(screen-full);\n.make-icon(screen-normal);\n.make-icon(search);\n.make-icon(search-save);\n.make-icon(server);\n.make-icon(settings);\n.make-icon(shield);\n.make-icon(sign-in);\n.make-icon(sign-out);\n.make-icon(smiley);\n.make-icon(split);\n.make-icon(squirrel);\n.make-icon(star);\n.make-icon(star-add);\n.make-icon(star-delete);\n.make-icon(steps);\n.make-icon(stop);\n.make-icon(sync);\n.make-icon(tag);\n.make-icon(tag-add);\n.make-icon(tag-remove);\n.make-icon(tasklist);\n.make-icon(telescope);\n.make-icon(terminal);\n.make-icon(text-size);\n.make-icon(three-bars);\n.make-icon(thumbsdown);\n.make-icon(thumbsup);\n.make-icon(tools);\n.make-icon(trashcan);\n.make-icon(triangle-down);\n.make-icon(triangle-left);\n.make-icon(triangle-right);\n.make-icon(triangle-up);\n.make-icon(unfold);\n.make-icon(unmute);\n.make-icon(unverified);\n.make-icon(verified);\n.make-icon(versions);\n.make-icon(watch);\n.make-icon(x);\n.make-icon(zap);\n","digest":"5ecc30d59bb67571a2c93ae8a69a50e523792cf8"},"static/panels.less":{"content":"@import \"ui-variables\";\n\n// Atom panels\n\natom-panel-container.left,\natom-panel-container.right {\n display: flex;\n}\n\natom-panel-container.left {\n // Align panels to the right of the panel container. The effect of this is\n // that the left dock's toggle button will appear on the right side of the\n // empty space when the panel container has a min width in the theme.\n justify-content: flex-end;\n}\n\n.tool-panel, // deprecated: .tool-panel\natom-panel {\n display: block;\n position: relative;\n}\n\natom-panel-container > atom-panel.left,\natom-panel-container > atom-panel.right {\n display: flex;\n}\n\n// Some packages use `height: 100%` which doesn't play nice with flexbox\natom-panel-container > atom-panel.left > *,\natom-panel-container > atom-panel.right > * {\n height: initial;\n}\n","digest":"c914b2dc5aa4dd33d986620897ffd8175f27a82a"},"static/panes.less":{"content":"@import \"ui-variables\";\n\n// Pane-items are things that go inside a pane. Like the UI-Demo, the\n// settings-view, the archive-view, the image-view. Etc. Basically a non-\n// editor resource with a tab.\natom-pane-container {\n position: relative;\n display: flex;\n flex: 1;\n min-width: 0;\n min-height: 0;\n\n atom-pane-axis {\n position: relative;\n display: flex;\n flex: 1;\n min-width: 0;\n min-height: 0;\n\n & > atom-pane-resize-handle {\n position: relative;\n &:before {\n content: \"\";\n position: absolute;\n z-index: 3;\n }\n }\n }\n\n atom-pane-axis.vertical {\n flex-direction: column;\n\n & > atom-pane-resize-handle {\n border-bottom: none;\n &:before {\n height: 8px;\n top: -4px;\n left: 0;\n right: 0;\n cursor: row-resize;\n }\n }\n }\n\n atom-pane-axis.horizontal {\n flex-direction: row;\n\n & > atom-pane-resize-handle {\n border-right: none;\n &:before {\n width: 8px;\n left: -4px;\n top: 0;\n bottom: 0;\n cursor: col-resize;\n }\n }\n }\n\n atom-pane {\n position: relative;\n display: flex;\n flex: 1;\n flex-direction: column;\n overflow: visible;\n min-width: 0;\n min-height: 0;\n\n .item-views {\n flex: 1;\n display: flex;\n min-width: 0;\n min-height: 0;\n position: relative;\n\n .pane-item {\n color: @text-color;\n background-color: @pane-item-background-color;\n }\n\n > *, > atom-text-editor.react > * {\n position: absolute;\n top: 0;\n right: 0;\n bottom: 0;\n left: 0;\n }\n }\n }\n}\n\n// Windows doesn't have row- and col-resize cursors\n.platform-win32 {\n atom-pane-container {\n atom-pane-axis.vertical {\n & > atom-pane-resize-handle {\n cursor: ns-resize;\n }\n }\n\n atom-pane-axis.horizontal {\n & > atom-pane-resize-handle {\n cursor: ew-resize;\n }\n }\n }\n}\n","digest":"6e09826167bc6efad6d102ff6ee0e5b1cc2578d1"},"static/scaffolding.less":{"content":"@import \"ui-variables\";\n@import \"octicon-mixins\";\n\n//\n// Icon fonts\n// --------------------------------------------------\n\n@font-face { .octicon-font-legacy(); } // keep for backwards compatibility\n@font-face { .octicon-font(); }\n@font-face { .atomicon-font(); } // Private\n\n\n//\n// Scaffolding\n// --------------------------------------------------\n\n*,\n*:before,\n*:after {\n box-sizing: border-box; // Reset the box-sizing\n}\n\nhtml,\nbody {\n width: 100%;\n height: 100%;\n overflow: hidden;\n}\n\nhtml {\n font-family: @font-family;\n font-size: @font-size;\n line-height: 1.428571429; // 20/14\n color: @text-color;\n background-color: @app-background-color;\n}\n","digest":"760f9b6cc195500bebcc111651f277041c6ad40b"},"static/syntax.less":{"content":"@import \"syntax-variables\";\n\natom-text-editor {\n .lines {\n .markup {\n &.git-commit {\n &.changed {\n color: @syntax-color-modified;\n }\n\n &.deleted {\n color: @syntax-color-removed;\n }\n\n &.inserted {\n color: @syntax-color-added;\n }\n }\n }\n }\n}\n\n.define-selection-flash-color-if-not-defined() { @syntax-selection-flash-color: rgba(100, 255, 100, 0.7); }\n.define-selection-flash-color-if-not-defined();\n\n@keyframes flash {\n from { background-color: @syntax-selection-flash-color; }\n to { background-color: null; }\n}\n\natom-text-editor .flash.selection .region {\n animation-name: flash;\n animation-duration: .5s;\n animation-iteration-count: 1;\n}\n","digest":"bb074c8cc4d337b86f3e16712aa4b1a10174df24"},"static/text-editor.less":{"content":"@import \"ui-variables\";\n@import \"octicon-utf-codes\";\n@import \"octicon-mixins\";\n\natom-text-editor {\n display: flex;\n font-family: Menlo, Consolas, 'DejaVu Sans Mono', monospace;\n cursor: text;\n\n .gutter-container {\n width: min-content;\n background-color: inherit;\n cursor: default;\n }\n\n .gutter {\n overflow: hidden;\n z-index: 0;\n text-align: right;\n min-width: 1em;\n box-sizing: border-box;\n background-color: inherit;\n position: relative;\n }\n\n .gutter:hover {\n .line-number.foldable .icon-right {\n visibility: visible;\n\n &:hover {\n opacity: 1;\n }\n }\n }\n\n .gutter, .gutter:hover {\n .line-number.folded .icon-right {\n .octicon(chevron-right, 0.8em);\n\n visibility: visible;\n\n &::before {\n position: relative;\n left: -.1em;\n }\n }\n }\n\n .line-numbers {\n width: max-content;\n background-color: inherit;\n }\n\n .line-number {\n padding-left: .5em;\n white-space: nowrap;\n opacity: 0.6;\n position: relative;\n\n .icon-right {\n .octicon(chevron-down, 0.8em);\n display: inline-block;\n visibility: hidden;\n opacity: .6;\n padding: 0 .4em;\n\n &::before {\n text-align: center;\n }\n }\n }\n\n .highlight {\n background: none;\n padding: 0;\n }\n\n .highlight .region {\n pointer-events: none;\n z-index: -1;\n }\n\n .line {\n white-space: pre;\n contain: layout;\n\n &.cursor-line .fold-marker::after {\n opacity: 1;\n }\n }\n\n .fold-marker {\n cursor: default;\n\n &::after {\n .icon(0.8em, inline);\n\n content: @ellipsis;\n padding-left: 0.2em;\n }\n }\n\n .placeholder-text {\n position: absolute;\n color: @text-color-subtle;\n }\n\n .invisible-character {\n font-weight: normal !important;\n font-style: normal !important;\n }\n\n .indent-guide {\n display: inline-block;\n box-shadow: inset 1px 0;\n }\n\n .cursor {\n z-index: 4;\n pointer-events: none;\n box-sizing: border-box;\n position: absolute;\n border-left: 1px solid;\n opacity: 0;\n }\n\n &.is-focused .cursor {\n opacity: 1;\n }\n\n .cursors.blink-off .cursor {\n opacity: 0;\n }\n}\n\natom-text-editor[mini] {\n font-size: @input-font-size;\n line-height: @component-line-height;\n max-height: @component-line-height + 2; // +2 for borders\n overflow: auto;\n}\n\natom-overlay {\n position: fixed;\n display: block;\n z-index: 4;\n}\n","digest":"557dca01940b829a17ff515e4e73e94ec506c239"},"static/title-bar.less":{"content":"@import \"ui-variables\";\n\n@title-bar-height: 22px;\n@traffic-lights-width: 68px;\n\n@inset-title-bar-height: 38px;\n@inset-traffic-lights-width: 78px;\n\n@title-bar-text-size: 13px;\n@title-bar-background-color: @base-background-color;\n@title-bar-border-color: @base-border-color;\n\n\n// Title Bar -------------------------------\n\n.title-bar {\n display: flex;\n flex-shrink: 0;\n align-items: center;\n justify-content: center;\n overflow: hidden;\n box-sizing: content-box;\n font-size: @title-bar-text-size;\n background-color: @title-bar-background-color;\n border-bottom: 1px solid @title-bar-border-color;\n transition: margin-top 160ms;\n -webkit-user-select: none;\n -webkit-app-region: drag;\n\n .title {\n flex: 0 1 auto;\n overflow: hidden;\n white-space: nowrap;\n text-overflow: ellipsis;\n }\n\n .is-blurred & {\n color: @text-color-subtle;\n }\n}\n\n\n// Custom -------------------------------\n\n.custom-title-bar {\n .title-bar {\n height: @title-bar-height;\n padding-left: @traffic-lights-width;\n padding-right: @traffic-lights-width;\n }\n\n &.fullscreen .title-bar {\n margin-top: -@title-bar-height; // hide title bar in fullscreen mode\n }\n\n atom-panel.modal {\n top: @title-bar-height; // Move modals down\n }\n}\n\n\n// Custom Inset -------------------------------\n\n.custom-inset-title-bar {\n .title-bar {\n height: @inset-title-bar-height;\n padding-left: @inset-traffic-lights-width;\n padding-right: @inset-traffic-lights-width;\n }\n\n &.fullscreen .title-bar {\n margin-top: -@inset-title-bar-height; // hide title bar in fullscreen mode\n }\n\n atom-panel.modal {\n top: @inset-title-bar-height; // Move modals down\n }\n}\n\n\n// Hidden -------------------------------\n\n.hidden-title-bar {\n .status-bar {\n -webkit-app-region: drag; // Enable dragging\n }\n}\n","digest":"7aeb076632ef30bcb6f4c3b25facc4f487b1929d"},"static/variables/octicon-mixins.less":{"content":"@import \"octicon-utf-codes.less\";\n\n.icon-size(@size) {\n font-size: @size;\n width: @size;\n height: @size;\n}\n\n.icon(@size, @display: inline-block) {\n font-family: 'Octicons Regular';\n font-weight: normal;\n font-style: normal;\n display: @display;\n line-height: 1;\n -webkit-font-smoothing: antialiased;\n text-decoration: none;\n\n .icon-size(@size);\n}\n\n.octicon(@name, @size: 16px) {\n &::before {\n .icon(@size);\n content: @@name\n }\n}\n\n.mega-octicon(@name, @size: 32px) {\n &::before {\n .icon(@size);\n content: @@name\n }\n}\n\n// keep for backwards compatibility\n.octicon-font-legacy() {\n font-family: 'Octicons Regular';\n src: url(\"octicons-2.1.2.woff\") format(\"woff\");\n font-weight: normal;\n font-style: normal;\n}\n\n.octicon-font() {\n font-family: 'Octicons Regular';\n src: url(\"octicons.woff\") format(\"woff\");\n font-weight: normal;\n font-style: normal;\n}\n\n.atomicon-font() {\n font-family: 'Octicons Regular';\n src: url('atomicons.woff') format('woff');\n font-weight: normal;\n font-style: normal;\n}\n","digest":"95ee6fc64ee8890d428ac75c63d8b8de3ead010c"},"static/variables/octicon-utf-codes.less":{"content":"\n// Atomicons (private)\n\n@type-array: \"\\e900\";\n@type-boolean: \"\\e901\";\n@type-class: \"\\e902\";\n@type-constant: \"\\e903\";\n@type-constructor: \"\\e904\";\n@type-enum: \"\\e905\";\n@type-field: \"\\e906\";\n@type-file: \"\\e907\";\n@type-function: \"\\e908\";\n@type-interface: \"\\e909\";\n@type-method: \"\\e90a\";\n@type-module: \"\\e90b\";\n@type-namespace: \"\\e90c\";\n@type-number: \"\\e90d\";\n@type-package: \"\\e90e\";\n@type-property: \"\\e90f\";\n@type-string: \"\\e910\";\n@type-variable: \"\\e911\";\n\n\n// Octicons\n\n@alert: \"\\f02d\";\n@alignment-align: \"\\f08a\";\n@alignment-aligned-to: \"\\f08e\";\n@alignment-unalign: \"\\f08b\";\n@arrow-down: \"\\f03f\";\n@arrow-left: \"\\f040\";\n@arrow-right: \"\\f03e\";\n@arrow-small-down: \"\\f0a0\";\n@arrow-small-left: \"\\f0a1\";\n@arrow-small-right: \"\\f071\";\n@arrow-small-up: \"\\f09f\";\n@arrow-up: \"\\f03d\";\n@beaker: \"\\f0dd\";\n@beer: \"\\f069\";\n@bell: \"\\f0de\";\n@bold: \"\\f0e2\";\n@book: \"\\f007\";\n@bookmark: \"\\f07b\";\n@briefcase: \"\\f0d3\";\n@broadcast: \"\\f048\";\n@browser: \"\\f0c5\";\n@bug: \"\\f091\";\n@calendar: \"\\f068\";\n@check: \"\\f03a\";\n@checklist: \"\\f076\";\n@chevron-down: \"\\f0a3\";\n@chevron-left: \"\\f0a4\";\n@chevron-right: \"\\f078\";\n@chevron-up: \"\\f0a2\";\n@circle-slash: \"\\f084\";\n@circuit-board: \"\\f0d6\";\n@clippy: \"\\f035\";\n@clock: \"\\f046\";\n@cloud-download: \"\\f00b\";\n@cloud-upload: \"\\f00c\";\n@code: \"\\f05f\";\n@color-mode: \"\\f065\";\n@comment: \"\\f02b\";\n@comment-add: \"\\f02b\";\n@comment-discussion: \"\\f04f\";\n@credit-card: \"\\f045\";\n@dash: \"\\f0ca\";\n@dashboard: \"\\f07d\";\n@database: \"\\f096\";\n@desktop-download: \"\\f0dc\";\n@device-camera: \"\\f056\";\n@device-camera-video: \"\\f057\";\n@device-desktop: \"\\f27c\";\n@device-mobile: \"\\f038\";\n@diff: \"\\f04d\";\n@diff-added: \"\\f06b\";\n@diff-ignored: \"\\f099\";\n@diff-modified: \"\\f06d\";\n@diff-removed: \"\\f06c\";\n@diff-renamed: \"\\f06e\";\n@ellipses: \"\\f101\";\n@ellipsis: \"\\f09a\";\n@eye: \"\\f04e\";\n@eye-unwatch: \"\\f04e\";\n@eye-watch: \"\\f04e\";\n@file: \"\\f102\";\n@file-add: \"\\f05d\";\n@file-binary: \"\\f094\";\n@file-code: \"\\f010\";\n@file-directory: \"\\f016\";\n@file-directory-create: \"\\f05d\";\n@file-media: \"\\f012\";\n@file-pdf: \"\\f014\";\n@file-submodule: \"\\f017\";\n@file-symlink-directory: \"\\f0b1\";\n@file-symlink-file: \"\\f0b0\";\n@file-text: \"\\f011\";\n@file-zip: \"\\f013\";\n@flame: \"\\f0d2\";\n@fold: \"\\f0cc\";\n@gear: \"\\f02f\";\n@gift: \"\\f042\";\n@gist: \"\\f00e\";\n@gist-fork: \"\\f002\";\n@gist-new: \"\\f05d\";\n@gist-private: \"\\f06a\";\n@gist-secret: \"\\f08c\";\n@git-branch: \"\\f020\";\n@git-branch-create: \"\\f020\";\n@git-branch-delete: \"\\f020\";\n@git-commit: \"\\f01f\";\n@git-compare: \"\\f0ac\";\n@git-fork-private: \"\\f06a\";\n@git-merge: \"\\f023\";\n@git-pull-request: \"\\f009\";\n@git-pull-request-abandoned: \"\\f009\";\n@globe: \"\\f0b6\";\n@grabber: \"\\f103\";\n@graph: \"\\f043\";\n@heart: \"\\2665\";\n@history: \"\\f07e\";\n@home: \"\\f08d\";\n@horizontal-rule: \"\\f070\";\n@hourglass: \"\\f09e\";\n@hubot: \"\\f09d\";\n@inbox: \"\\f0cf\";\n@info: \"\\f059\";\n@issue-closed: \"\\f028\";\n@issue-opened: \"\\f026\";\n@issue-reopened: \"\\f027\";\n@italic: \"\\f0e4\";\n@jersey: \"\\f019\";\n@jump-down: \"\\f072\";\n@jump-left: \"\\f0a5\";\n@jump-right: \"\\f0a6\";\n@jump-up: \"\\f073\";\n@key: \"\\f049\";\n@keyboard: \"\\f00d\";\n@law: \"\\f0d8\";\n@light-bulb: \"\\f000\";\n@link: \"\\f05c\";\n@link-external: \"\\f07f\";\n@list-ordered: \"\\f062\";\n@list-unordered: \"\\f061\";\n@location: \"\\f060\";\n@lock: \"\\f06a\";\n@log-in: \"\\f036\";\n@log-out: \"\\f032\";\n@logo-gist: \"\\f0ad\";\n@logo-github: \"\\f092\";\n@mail: \"\\f03b\";\n@mail-read: \"\\f03c\";\n@mail-reply: \"\\f051\";\n@mark-github: \"\\f00a\";\n@markdown: \"\\f0c9\";\n@megaphone: \"\\f077\";\n@mention: \"\\f0be\";\n@microscope: \"\\f089\";\n@milestone: \"\\f075\";\n@mirror: \"\\f024\";\n@mirror-private: \"\\f06a\";\n@mirror-public: \"\\f024\";\n@mortar-board: \"\\f0d7\";\n@move-down: \"\\f0a8\";\n@move-left: \"\\f074\";\n@move-right: \"\\f0a9\";\n@move-up: \"\\f0a7\";\n@mute: \"\\f080\";\n@no-newline: \"\\f09c\";\n@octoface: \"\\f008\";\n@organization: \"\\f037\";\n@package: \"\\f0c4\";\n@paintcan: \"\\f0d1\";\n@pencil: \"\\f058\";\n@person: \"\\f018\";\n@person-add: \"\\f018\";\n@person-follow: \"\\f018\";\n@pin: \"\\f041\";\n@playback-fast-forward: \"\\f0bd\";\n@playback-pause: \"\\f0bb\";\n@playback-play: \"\\f0bf\";\n@playback-rewind: \"\\f0bc\";\n@plug: \"\\f0d4\";\n@plus: \"\\f05d\";\n@plus-small: \"\\f104\";\n@podium: \"\\f0af\";\n@primitive-dot: \"\\f052\";\n@primitive-square: \"\\f053\";\n@pulse: \"\\f085\";\n@puzzle: \"\\f0c0\";\n@question: \"\\f02c\";\n@quote: \"\\f063\";\n@radio-tower: \"\\f030\";\n@remove-close: \"\\f081\";\n@reply: \"\\f105\";\n@repo: \"\\f001\";\n@repo-clone: \"\\f04c\";\n@repo-create: \"\\f05d\";\n@repo-delete: \"\\f001\";\n@repo-force-push: \"\\f04a\";\n@repo-forked: \"\\f002\";\n@repo-pull: \"\\f006\";\n@repo-push: \"\\f005\";\n@repo-sync: \"\\f087\";\n@rocket: \"\\f033\";\n@rss: \"\\f034\";\n@ruby: \"\\f047\";\n@screen-full: \"\\f066\";\n@screen-normal: \"\\f067\";\n@search: \"\\f02e\";\n@search-save: \"\\f02e\";\n@server: \"\\f097\";\n@settings: \"\\f07c\";\n@shield: \"\\f0e1\";\n@sign-in: \"\\f036\";\n@sign-out: \"\\f032\";\n@smiley: \"\\f0e7\";\n@split: \"\\f0c6\";\n@squirrel: \"\\f0b2\";\n@star: \"\\f02a\";\n@star-add: \"\\f02a\";\n@star-delete: \"\\f02a\";\n@steps: \"\\f0c7\";\n@stop: \"\\f08f\";\n@sync: \"\\f087\";\n@tag: \"\\f015\";\n@tag-add: \"\\f015\";\n@tag-remove: \"\\f015\";\n@tasklist: \"\\f0e5\";\n@telescope: \"\\f088\";\n@terminal: \"\\f0c8\";\n@text-size: \"\\f0e3\";\n@three-bars: \"\\f05e\";\n@thumbsdown: \"\\f0db\";\n@thumbsup: \"\\f0da\";\n@tools: \"\\f031\";\n@trashcan: \"\\f0d0\";\n@triangle-down: \"\\f05b\";\n@triangle-left: \"\\f044\";\n@triangle-right: \"\\f05a\";\n@triangle-up: \"\\f0aa\";\n@unfold: \"\\f039\";\n@unmute: \"\\f0ba\";\n@unverified: \"\\f0e8\";\n@verified: \"\\f0e6\";\n@versions: \"\\f064\";\n@watch: \"\\f0e0\";\n@x: \"\\f081\";\n@zap: \"\\26A1\";\n","digest":"fca97c7cecae6f10fc64d90751603b41f79a4a0d"},"static/variables/syntax-variables.less":{"content":"// This file has fallback variables. It specifies all syntax variables that\n// themes must implement if they include a syntax-variables.less file.\n\n// General colors\n@syntax-text-color: #333;\n@syntax-cursor-color: #333;\n@syntax-selection-color: #69c;\n@syntax-selection-flash-color: #00f; // Color the selection is 'flashed' when you run find next\n@syntax-background-color: #fff;\n\n// Guide colors\n@syntax-wrap-guide-color: #ccc;\n@syntax-indent-guide-color: #ccc;\n@syntax-invisible-character-color: #ccc;\n\n// For find and replace markers\n@syntax-result-marker-color: #444;\n@syntax-result-marker-color-selected: #000;\n\n// Gutter colors\n@syntax-gutter-text-color: #333;\n@syntax-gutter-text-color-selected: #000;\n@syntax-gutter-background-color: #ccc;\n@syntax-gutter-background-color-selected: #eee;\n\n// For git diff info. i.e. in the gutter\n@syntax-color-added: green;\n@syntax-color-modified: orange;\n@syntax-color-removed: red;\n@syntax-color-renamed: blue;\n\n// For language entity colors\n@syntax-color-variable: #DF6A73;\n@syntax-color-constant: #DF6A73;\n@syntax-color-property: #DF6A73;\n@syntax-color-value: #D29B67;\n@syntax-color-function: #61AEEF;\n@syntax-color-method: @syntax-color-function;\n@syntax-color-class: #E5C17C;\n@syntax-color-keyword: #a431c4;\n@syntax-color-tag: #b72424;\n@syntax-color-attribute: #87400d;\n@syntax-color-import: #97C378;\n@syntax-color-snippet: #97C378;\n","digest":"812c1b7883a023f768773d14294653adcdb932d7"},"static/variables/ui-variables.less":{"content":"// This file has fallback variables. It specifies the variables themes\n// must implement.\n\n// Colors\n\n@text-color: #333;\n@text-color-subtle: #777;\n@text-color-highlight: #111;\n@text-color-selected: @text-color-highlight;\n\n@text-color-info: #5293d8;\n@text-color-success: #1fe977;\n@text-color-warning: #f78a46;\n@text-color-error: #c00;\n\n@background-color-info: #0098ff;\n@background-color-success: #17ca65;\n@background-color-warning: #ff4800;\n@background-color-error: #c00;\n@background-color-highlight: hsla(0,0%,0%,.1);\n@background-color-selected: @background-color-highlight;\n\n@app-background-color: #fff;\n\n@base-background-color: #fff;\n@base-border-color: #eee;\n\n@pane-item-background-color: @base-background-color;\n@pane-item-border-color: @base-border-color;\n\n@input-background-color: #fff;\n@input-border-color: @base-border-color;\n\n@tool-panel-background-color: #f4f4f4;\n@tool-panel-border-color: @base-border-color;\n\n@inset-panel-background-color: #eee;\n@inset-panel-border-color: @base-border-color;\n\n@panel-heading-background-color: #ddd;\n@panel-heading-border-color: transparent;\n\n@overlay-background-color: #f4f4f4;\n@overlay-border-color: @base-border-color;\n\n@button-background-color: #ccc;\n@button-background-color-hover: lighten(@button-background-color, 5%);\n@button-background-color-selected: @button-background-color-hover;\n@button-border-color: #aaa;\n\n@tab-bar-background-color: #fff;\n@tab-bar-border-color: darken(@tab-background-color-active, 10%);\n@tab-background-color: #f4f4f4;\n@tab-background-color-active: #fff;\n@tab-border-color: @base-border-color;\n\n@tree-view-background-color: @tool-panel-background-color;\n@tree-view-border-color: @tool-panel-border-color;\n\n@ui-site-color-1: @background-color-success; // green\n@ui-site-color-2: @background-color-info; // blue\n@ui-site-color-3: @background-color-warning; // orange\n@ui-site-color-4: #db2ff4; // purple\n@ui-site-color-5: #f5e11d; // yellow\n\n\n// Sizes\n\n@font-size: 13px;\n@input-font-size: 14px;\n\n@disclosure-arrow-size: 12px;\n\n@component-padding: 10px;\n@component-icon-padding: 5px;\n@component-icon-size: 16px;\n@component-line-height: 25px;\n@component-border-radius: 2px;\n\n@tab-height: 30px;\n\n// Other\n\n@font-family: 'BlinkMacSystemFont', 'Lucida Grande', 'Segoe UI', Ubuntu, Cantarell, sans-serif;\n@use-custom-controls: true; // false uses native controls\n","digest":"e3029f763111ec391f6dcea8178d35be7c798b4f"},"static/workspace-view.less":{"content":"@import \"ui-variables\";\n\natom-workspace {\n display: flex;\n flex-direction: column;\n height: 100%;\n overflow: hidden;\n position: relative;\n color: @text-color;\n background-color: @app-background-color;\n font-family: @font-family;\n\n atom-workspace-axis {\n position: relative;\n }\n\n atom-workspace-axis.horizontal {\n display: flex;\n flex: 1;\n min-width: 0;\n min-height: 0;\n }\n\n atom-workspace-axis.vertical {\n display: flex;\n flex: 1;\n flex-direction: column;\n min-width: 0;\n min-height: 0;\n }\n}\n","digest":"a2c3f77adc22e4dbff693a00d43be77c3431eea5"},"node_modules/about/styles/about.less":{"content":"@import \"variables/ui-variables\";\n@import \"variables/syntax-variables\";\n@import \"ui-variables\";\n@import \"variables\";\n\n.about {\n display: flex;\n flex-direction: column;\n align-items: center;\n justify-content: flex-start;\n -webkit-user-select: none;\n cursor: default;\n overflow: auto;\n text-align: center;\n font-size: 1.25em;\n line-height: 1.4;\n padding: 4em;\n color: @text-color;\n background-color: @base-background-color;\n\n button {\n cursor: default;\n }\n\n a:focus {\n // Don't use Bootstrap default here\n color: inherit;\n }\n\n img, a {\n -webkit-user-drag: none;\n }\n\n .input-checkbox {\n margin-top: -.2em;\n }\n\n // used to group different elements\n .group-start {\n margin-top: 4em;\n }\n .group-item {\n margin-top: 1.5em;\n }\n}\n\n.about-container {\n width: 100%;\n max-width: 500px;\n}\n\n\n// Header --------------------------------\n\n.about-atom-io:hover {\n .about-logo {\n color: @atom-green;\n }\n}\n\n.about-logo {\n display: block;\n width: 100%;\n max-width: 280px;\n margin: 0 auto 1em auto;\n color: @text-color-highlight;\n transition: color 0.2s;\n}\n\n.about-version-container {\n &:hover {\n color: lighten(@text-color, 15%);\n }\n &:active {\n color: lighten(@text-color, 30%);\n }\n}\n\n.about-version {\n margin-right: .5em;\n font-size: 1.25em;\n vertical-align: middle;\n}\n\n.about-header-release-notes {\n vertical-align: middle;\n margin-left: 1em;\n}\n\n\n// Updates --------------------------------\n\n.about-updates-box {\n display: flex;\n align-items: center;\n padding: @component-padding;\n border: 1px solid @base-border-color;\n border-radius: @component-border-radius * 2;\n background-color: @background-color-highlight;\n}\n\n.about-updates-status {\n flex: 1;\n margin-left: .5em;\n text-align: left;\n}\n\n.about-updates-item,\n.about-default-update-message .about-updates-label {\n display: block;\n}\n\n.about-updates-label {\n color: @text-color-subtle;\n &.is-strong {\n color: @text-color;\n }\n}\n\n.about-updates-version {\n margin: 0 .4em;\n}\n\n.about-updates-release-notes {\n margin: 0 1em 0 1.5em;\n}\n\n.about-auto-updates {\n margin-top: 1em;\n input {\n margin-right: .5em;\n }\n}\n\n\n// Love --------------------------------\n\n.about-love {\n .icon::before {\n // Make these octicons look good inlined with text\n position: relative;\n width: auto;\n height: auto;\n margin-right: 0;\n font-size: 1.5em;\n vertical-align: text-top;\n }\n\n .icon-logo-github::before {\n font-size: 3.6em;\n height: .36em;\n }\n}\n\n.about-credits {\n color: @text-color-subtle;\n}\n\n\n// the blue squirrel --------------------------------\n\n.about-release-notes {\n color: @background-color-info;\n &:hover {\n color: lighten(@background-color-info, 15%);\n }\n}\n","digest":"fb7e3f364b75acce30e629a0eaec8bda8cea5e16"},"node_modules/about/styles/variables.less":{"content":"@import \"variables/ui-variables\";\n@import \"variables/syntax-variables\";\n@atom-green: #40a977;\n","digest":"af218163acb279019a92806f4afe744bb0e0ccbf"},"node_modules/archive-view/styles/archive-view.less":{"content":"@import \"variables/ui-variables\";\n@import \"variables/syntax-variables\";\n@import \"ui-variables\";\n\n.archive-editor {\n background-color: @inset-panel-background-color;\n overflow: auto;\n\n .archive-container {\n height:100%;\n width: 100%;\n\n .inset-panel {\n border-width: 0;\n\n .panel-heading {\n border-radius: 0;\n }\n }\n\n .archive-tree {\n padding: 5px;\n }\n }\n}\n","digest":"c928c6e5a9508d14097a0524462f17d0cd2c1d48"},"node_modules/autocomplete-plus/styles/autocomplete.less":{"content":"@import \"variables/ui-variables\";\n@import \"variables/syntax-variables\";\n// TODO: remove this fallback when 193 is out for a while\n.attr-syntax-color() { @syntax-color-attribute: #888; } .attr-syntax-color();\n\n@import \"ui-variables\";\n@import \"syntax-variables\";\n\n@font-size-small: .9em;\n@type-icon-font-size: 1em;\n@type-letter-icon-font-size: @font-size-small;\n@row-line-height: 2em;\n@item-padding: .75em;\n@item-side-padding: .6em;\n\natom-overlay.autocomplete-plus {\n z-index: 12; // higher than docks\n}\n\nautocomplete-suggestion-list.select-list.popover-list {\n width: auto !important; // TODO: Can be removed once the inline style is gone\n display: inline-block;\n min-width: 243px; // Try and fail until the specs pass\n padding: 0;\n overflow: hidden;\n color: @text-color;\n\n .suggestion-list-scroller {\n overflow-y: auto;\n }\n\n .suggestion-description {\n padding: 5px 0;\n padding-left: @item-side-padding;\n padding-right: @item-side-padding;\n min-height: @row-line-height;\n line-height: 1.3;\n background: darken(@overlay-background-color, 4%);\n border-radius: 0 0 @component-border-radius @component-border-radius;\n\n // let the other sibling decide how large the container should be\n width: min-content;\n min-width: 100%;\n }\n\n .suggestion-description-content {\n font-size: @font-size + 1px;\n font-family: @font-family;\n max-height: 33vh;\n display: block;\n overflow-y: auto;\n white-space: pre-wrap;\n }\n\n .suggestion-description-more-link {\n font-size: @font-size + 1px;\n font-family: @font-family;\n color: @text-color-info;\n }\n\n input {\n position: absolute;\n opacity: 0.00;\n }\n\n ol.list-group {\n margin-top: 0;\n display: table;\n width: 100%;\n margin-right: 10px; // Needed to prevent horizontal scrolling when right label is too long\n\n li {\n display: table-row;\n color: @text-color;\n line-height: @row-line-height;\n\n > span {\n display: table-cell;\n vertical-align: middle;\n }\n\n &:after {\n clear: both;\n display: block;\n content: ' ';\n }\n\n &.selected {\n .word {\n color: fadeout(@text-color-selected, 20%);\n }\n .character-match {\n color: @text-color-selected;\n }\n .left-label, .right-label, .snippet-completion {\n color: fadeout(@text-color-selected, 50%);\n }\n }\n }\n }\n}\n\nautocomplete-suggestion-list {\n .icon-container {\n width: @row-line-height;\n padding-left: 0;\n padding-right: @item-padding;\n &:empty {\n width: @item-side-padding;\n padding: 0;\n }\n }\n\n .icon {\n display: block;\n width: @row-line-height;\n line-height: @row-line-height;\n text-align: center;\n font-style: normal;\n font-weight: bold;\n\n color: @text-color-subtle;\n background: fadeout(@text-color, 90%);\n\n &:empty { display: none; }\n > *::before {\n font-size: @type-icon-font-size;\n width: @type-icon-font-size;\n height: @type-icon-font-size;\n }\n\n .icon-letter {\n // I'm failing to vert center these letters. So shift them up...\n position: relative;\n top: -.1em;\n font-size: @type-letter-icon-font-size;\n line-height: @type-letter-icon-font-size;\n }\n }\n\n .left-label {\n text-align: right;\n padding-right: @item-padding;\n vertical-align: middle;\n\n font-size: @font-size-small;\n color: @text-color-subtle;\n\n &:empty {\n padding-right: 0;\n }\n }\n\n .right-label {\n padding-right: @item-padding;\n font-size: @font-size-small;\n color: @text-color-subtle;\n\n &:empty {\n padding-right: 0;\n }\n }\n\n .word-container {\n padding-right: @item-padding;\n }\n\n .word {\n float: left;\n }\n\n .character-match {\n font-weight: bold;\n color: @text-color-highlight;\n }\n\n .snippet-completion {\n color: @text-color-subtle;\n }\n\n // Here we set the max width of the popup\n .left-label {\n max-width: 20vw;\n }\n .word {\n max-width: 35vw;\n }\n .right-label {\n max-width: 25vw;\n }\n\n .word, .left-label, .right-label {\n white-space: nowrap;\n overflow: hidden;\n text-overflow: ellipsis;\n }\n\n .make-type-icon(attribute, @syntax-color-attribute);\n .make-type-icon(builtin, @syntax-color-keyword);\n .make-type-icon(class, @syntax-color-class);\n .make-type-icon(constant, @syntax-color-constant);\n .make-type-icon(function, @syntax-color-function);\n .make-type-icon(import, @syntax-color-import);\n .make-type-icon(keyword, @syntax-color-keyword);\n .make-type-icon(method, @syntax-color-method);\n .make-type-icon(module, @syntax-color-import);\n .make-type-icon(mixin, @syntax-color-class);\n .make-type-icon(package, @syntax-color-import);\n .make-type-icon(property, @syntax-color-property);\n .make-type-icon(require, @syntax-color-import);\n .make-type-icon(snippet, @syntax-color-snippet);\n .make-type-icon(tag, @syntax-color-tag);\n .make-type-icon(type, @syntax-color-class);\n .make-type-icon(value, @syntax-color-value);\n .make-type-icon(variable, @syntax-color-variable);\n .make-type-icon(selector, @syntax-color-attribute);\n .make-type-icon(pseudo-selector, @syntax-color-attribute);\n}\n\n.make-type-icon(@type, @color) {\n .icon.@{type} {\n color: @color;\n background: fadeout(@color, 80%)\n }\n}\n.make-type-icon(@type, @color)\n when (hsvvalue(@color) - hsvvalue(@overlay-background-color) > -20)\n and (hsvvalue(@color) - hsvvalue(@overlay-background-color) < 20) {\n .icon.@{type} {\n @corrected-color: contrast(@overlay-background-color, darken(@color, 30%), lighten(@color, 30%));\n color: @corrected-color;\n background: fadeout(@corrected-color, 80%);\n }\n}\n","digest":"a67bb2a764bd14a0d0d022deaaf06a02f0205088"},"node_modules/background-tips/styles/background-tips.less":{"content":"@import \"variables/ui-variables\";\n@import \"variables/syntax-variables\";\n// The ui-variables file is provided by base themes provided by Atom.\n//\n// See https://github.com/atom/atom-dark-ui/blob/master/styles/ui-variables.less\n// for a full listing of what's available.\n@import \"ui-variables\";\n\nbackground-tips {\n display: block;\n pointer-events: none;\n position: absolute;\n top: 0;\n left: 0;\n right: 0;\n bottom: 0;\n overflow: hidden;\n\n .background-message {\n -webkit-user-select: none;\n cursor: default;\n\n .message {\n padding: 0 @component-padding*3;\n opacity: 0;\n transition: opacity .3s ease-in-out;\n &.fade-in {\n opacity: 1;\n }\n\n .keystroke {\n border: 2px solid;\n padding: 0 @component-padding/2;\n border-radius: @component-border-radius * 3;\n font-family: \"Helvetica Neue\", Arial, sans-serif;\n }\n }\n }\n}\n","digest":"4844ed52aace7b2aabc1600197b0c67d523fa018"},"node_modules/bookmarks/styles/bookmarks.less":{"content":"@import \"variables/ui-variables\";\n@import \"variables/syntax-variables\";\n@import \"octicon-utf-codes.less\";\n\natom-text-editor {\n .gutter .line-number.bookmarked .icon-right {\n visibility: visible;\n\n &:before {\n content: @bookmark;\n color: #09C;\n }\n }\n}\n\n.bookmarks-view {\n .bookmark {\n .line-text {\n font-family: monospace;\n }\n }\n}\n","digest":"16ccb42180dde26a0525047c649420fc349cc803"},"node_modules/bracket-matcher/styles/bracket-matcher.atom-text-editor.less":{"content":"@import \"variables/ui-variables\";\n@import \"variables/syntax-variables\";\n.bracket-matcher .region {\n border-bottom: 1px dotted lime;\n position: absolute;\n}\n\n.line-number.bracket-matcher {\n background-color: @text-color-subtle\n}","digest":"4c5ca1e7952051f2495852a8fdc5475a937ce6da"},"node_modules/command-palette/styles/command-palette.less":{"content":"@import \"variables/ui-variables\";\n@import \"variables/syntax-variables\";\n@import \"ui-variables\";\n\n// Highlight matched text\n.command-palette .list-group .character-match {\n color: @text-color-highlight;\n font-weight: bold;\n}\n","digest":"4b22bbd3a8da4831603f9cd9a6719906e27b0f60"},"node_modules/deprecation-cop/styles/deprecation-cop.less":{"content":"@import \"variables/ui-variables\";\n@import \"variables/syntax-variables\";\n// The ui-variables file is provided by base themes provided by Atom.\n//\n// See https://github.com/atom/atom-dark-ui/blob/master/stylesheets/ui-variables.less\n// for a full listing of what's available.\n@import \"ui-variables\";\n\n.deprecation-cop-status {\n .icon.icon-alert:before {\n // It's a really big icon...\n width: 17px;\n }\n}\n.deprecation-cop {\n overflow: auto;\n -webkit-flex: 1;\n background-color: @app-background-color !important;\n\n .deprecation-overview { \n &:after {\n content: '';\n clear: both;\n display: block;\n }\n }\n\n .deprecation-info {\n padding: 0 @component-padding;\n }\n\n .deprecation-info:hover {\n background-color: @background-color-selected !important;\n }\n\n .deprecation-detail.list-item {\n white-space: normal;\n clear: both;\n\n .deprecation-message {\n padding: 5px 0 5px 28px;\n line-height: 1.4;\n font-size: @font-size;\n\n p:last-child {\n margin-bottom: 0;\n }\n }\n\n .icon-alert {\n margin-top: 5px;\n float: left;\n }\n }\n\n .collapsed > ul {\n display: none;\n }\n\n .list {\n list-style-type: none;\n padding: 0;\n }\n\n .stack-trace {\n background-color: @tool-panel-background-color;\n padding: @component-padding;\n margin-bottom: @component-padding;\n }\n\n a {\n color: @text-color-highlight;\n }\n}\n","digest":"7843074dd162b61c7fc9ff62d55eccfbfcdb78d5"},"node_modules/encoding-selector/styles/encoding-selector.less":{"content":"@import \"variables/ui-variables\";\n@import \"variables/syntax-variables\";\n@import \"ui-variables\";\n\n.encoding-status a,\n.encoding-status a:hover {\n color: @text-color;\n}\n","digest":"32b0dfd811078fe30702e597d22d2709785f2742"},"node_modules/find-and-replace/styles/find-and-replace.less":{"content":"@import \"variables/ui-variables\";\n@import \"variables/syntax-variables\";\n@import \"ui-variables\";\n@import \"syntax-variables\";\n\n@find-and-replace-font: Menlo, Consolas, 'DejaVu Sans Mono', monospace;\n\n// result markers\natom-text-editor {\n .find-result .region {\n background-color: transparent;\n border-radius: @component-border-radius;\n border: 1px solid @syntax-result-marker-color;\n box-sizing: border-box;\n z-index: 0;\n }\n\n .current-result .region {\n border-radius: @component-border-radius;\n border: 1px solid @syntax-result-marker-color-selected;\n box-sizing: border-box;\n z-index: 0;\n }\n\n .find-result,\n .current-result {\n display: none;\n }\n}\n\natom-workspace.find-visible {\n atom-text-editor {\n .find-result,\n .current-result {\n display: block;\n }\n }\n}\n\n// Both project and buffer FNR styles\n.find-and-replace,\n.preview-pane,\n.project-find {\n @min-width: 200px; // min width before it starts scrolling\n\n -webkit-user-select: none;\n padding: @component-padding/2;\n overflow-x: auto;\n\n .header {\n padding: @component-padding/4 @component-padding/2;\n min-width: @min-width;\n line-height: 1.75;\n }\n .header-item {\n margin: @component-padding/4 0;\n }\n\n .input-block {\n display: flex;\n flex-wrap: wrap;\n width: 100%;\n min-width: @min-width;\n }\n .input-block-item {\n display: flex;\n flex: 1;\n padding: @component-padding / 2;\n }\n\n .btn-group {\n display: flex;\n flex: 1;\n .btn {\n flex: 1;\n }\n & + .btn-group {\n margin-left: @component-padding;\n }\n }\n\n .btn > .icon {\n width: 20px;\n height: 16px;\n vertical-align: middle;\n fill: currentColor;\n stroke: currentColor;\n pointer-events: none;\n }\n\n .close-button {\n margin-left: @component-padding;\n cursor: pointer;\n color: @text-color-subtle;\n &:hover {\n color: @text-color-highlight;\n }\n .icon::before {\n margin-right: 0;\n text-align: center;\n vertical-align: middle;\n }\n }\n\n .description {\n display: inline-block;\n .subtle-info-message {\n padding-left: 5px;\n color: @text-color-subtle;\n .highlight {\n color: @text-color;\n font-weight: normal;\n }\n }\n }\n\n .options-label {\n color: @text-color-subtle;\n position: relative;\n .options {\n margin-right: .5em;\n color: @text-color;\n }\n }\n\n .btn-group-options {\n display: inline-flex;\n margin-top: -.1em;\n\n .btn {\n width: 36px;\n padding: 0;\n line-height: 1.75;\n }\n }\n\n .editor-container {\n position: relative;\n atom-text-editor {\n width: 100%;\n }\n }\n\n}\n\n// Buffer find and replace\n.find-and-replace {\n @input-width: 260px;\n @block-width: 260px;\n\n .input-block-item {\n flex: 1 1 @block-width;\n }\n .input-block-item--flex {\n flex: 100 1 @input-width;\n }\n\n .btn-group-find,\n .btn-group-replace {\n flex: 1;\n }\n\n .btn-group-find-all,\n .btn-group-replace-all {\n flex: 2;\n }\n\n .find-container atom-text-editor {\n padding-right: 64px; // leave some room for the results count\n }\n\n // results count\n .find-meta-container {\n position: absolute;\n top: 1px;\n right: 0;\n margin: @component-padding/2 @component-padding/2 0 0;\n z-index: 2;\n font-size: .9em;\n line-height: @component-line-height;\n pointer-events: none;\n .result-counter {\n margin-right: @component-padding;\n }\n }\n}\n\n.find-wrap-icon {\n @wrap-size: @font-size * 10;\n\n opacity: 0;\n transition: opacity 0.5s;\n &.visible { opacity: 1; }\n\n position: absolute;\n\n // These are getting placed in the DOM as a pane item, so override the pane\n // item positioning styles. :/\n top: 50% !important;\n left: 50% !important;\n right: initial !important;\n bottom: initial !important;\n\n margin-top: @wrap-size * -0.5;\n margin-left: @wrap-size * -0.5;\n\n background: fadeout(darken(@syntax-background-color, 4%), 55%);\n border-radius: @component-border-radius * 2;\n text-align: center;\n pointer-events: none;\n &:before {\n // Octicons look best in sizes that are multiples of 16px\n font-size: @wrap-size - mod(@wrap-size, 16px) - 32px;\n line-height: @wrap-size;\n height: @wrap-size;\n width: @wrap-size;\n color: @syntax-text-color;\n opacity: .5;\n }\n}\n\n// Project find and replace\n.project-find {\n @project-input-width: 260px;\n @project-block-width: 160px;\n\n .input-block-item {\n flex: 1 1 @project-block-width;\n }\n .input-block-item--flex {\n flex: 100 1 @project-input-width;\n }\n\n .loading,\n .preview-block,\n .error-messages,\n .filter-container {\n display: none;\n }\n}\n\n.preview-pane {\n position: relative;\n display: flex;\n flex-direction: column;\n\n .preview-header {\n display: flex;\n padding: @component-padding/2 @component-padding/2 @component-padding/2 @component-padding;\n align-items: center;\n justify-content: space-between;\n font-weight: normal;\n border-bottom: 1px solid @panel-heading-border-color;\n background-color: @panel-heading-background-color;\n }\n\n .preview-controls {\n flex-shrink: 0;\n }\n\n .loading-spinner-tiny,\n .loading-spinner-tiny + .inline-block {\n vertical-align: middle;\n }\n\n .no-results-overlay {\n visibility: hidden;\n }\n\n &.no-results .no-results-overlay {\n visibility: visible;\n }\n\n .results-view {\n overflow: auto;\n position: relative;\n flex: 1;\n\n .list-tree {\n padding: 0 @component-padding;\n }\n\n .line-number {\n margin-right: 1ex;\n text-align: right;\n display: inline-block;\n font-family: @find-and-replace-font;\n }\n .match-line.selected .line-number {\n color: @text-color-selected;\n }\n\n .path-match-number {\n padding-left: @component-padding;\n color: @text-color-subtle;\n }\n\n .search-result {\n // box-shadow over a border is used to not affect height calculation\n box-shadow: inset 0 -1px 0 @base-border-color;\n &:first-child {\n box-shadow: inset 0 -1px 0 @base-border-color, inset 0 1px 0 @base-border-color;\n }\n }\n\n .preview {\n word-break: break-all;\n font-family: @find-and-replace-font;\n white-space: pre;\n color: @text-color-subtle;\n }\n\n .match-line .preview {\n color: @text-color-highlight;\n }\n .match-line.selected .preview {\n color: @text-color-selected;\n }\n\n\n .selected {\n .highlight-info {\n box-shadow: inset 0 0 1px lighten(@background-color-info, 50%);\n }\n\n .highlight-error {\n box-shadow: inset 0 0 1px lighten(@background-color-error, 25%);\n }\n\n .highlight-success {\n box-shadow: inset 0 0 1px lighten(@background-color-success, 25%);\n }\n }\n }\n}\n\n.find-container atom-text-editor, .replace-container atom-text-editor {\n // Styles for regular expression highlighting\n .syntax--regexp {\n .syntax--escape {\n color: @text-color-info;\n }\n .syntax--range, .syntax--character-class, .syntax--wildcard {\n color: @text-color-success;\n }\n .syntax--wildcard {\n font-weight: bold;\n }\n .syntax--set {\n color: inherit;\n }\n .syntax--keyword, .syntax--punctuation {\n color: @text-color-error;\n font-weight: normal;\n }\n\n .syntax--replacement.syntax--variable {\n color: @text-color-warning;\n }\n }\n}\n","digest":"5a7ed14760617a7440f845b68f007710839334f3"},"node_modules/fuzzy-finder/styles/fuzzy-finder.less":{"content":"@import \"variables/ui-variables\";\n@import \"variables/syntax-variables\";\n@import \"ui-variables\";\n\n// Highlight matched text\n.fuzzy-finder .list-group .character-match {\n color: @text-color-highlight;\n font-weight: bold;\n}\n","digest":"d49db921170357f83612471149eac507cf6c0f76"},"node_modules/github/styles/_global.less":{"content":"@import \"variables/ui-variables\";\n@import \"variables/syntax-variables\";\n@import \"variables\";\n\n// Styles for things that are sprinkled throuout various places\n\n// vertical align the text with the icon\n.github-Tabs,\n.github-PrPaneItem,\n.tooltip {\n .badge .icon:before {\n vertical-align: text-top;\n }\n}\n\n// indent task lists\n.github-DotComMarkdownHtml .task-list-item {\n list-style: none;\n .task-list-item-checkbox {\n position: absolute;\n margin-left: -20px;\n }\n}\n\n\n.issueish-badge, .issueish-badge.badge {\n align-self: flex-start;\n flex-shrink: 0;\n margin-right: @component-padding;\n font-weight: bold;\n text-transform: capitalize;\n border-radius: @component-border-radius;\n\n &.open {\n color: contrast(@gh-background-color-green, black, white, 50%);\n background-color: @gh-background-color-green;\n }\n\n &.closed {\n color: contrast(@gh-background-color-red, black, white, 50%);\n background-color: @gh-background-color-red;\n }\n\n &.merged {\n color: contrast(@gh-background-color-purple, black, white, 50%);\n background-color: @gh-background-color-purple;\n }\n}\n\n.status-warning {\n color: @gh-background-color-yellow;\n}\n\n.status-success {\n color: @gh-background-color-green;\n}\n\n.status-error {\n color: @gh-background-color-red;\n}\n","digest":"1ec25d4470eb2304d47883c2fa0aafb5b57390ac"},"node_modules/github/styles/branch-menu-view.less":{"content":"@import \"variables/ui-variables\";\n@import \"variables/syntax-variables\";\n@import \"variables\";\n\n.github-BranchMenuView {\n\n &-selector {\n display: flex;\n align-items: center;\n }\n\n &-item {\n margin: @component-padding / 2;\n }\n\n .icon-git-branch {\n flex-basis: 16px;\n flex-grow: 0;\n flex-shrink: 0;\n color: @text-color-subtle;\n }\n\n .icon-git-branch::before {\n margin-right: 0;\n text-align: center;\n }\n\n &-select {\n flex-grow: 1;\n flex-shrink: 1;\n width: 100%;\n }\n\n &-button {\n flex-grow: 0;\n flex-shrink: 0;\n }\n\n &-editor {\n flex: 1;\n\n atom-text-editor,\n atom-text-editor .cursor-line {\n background-color: inherit;\n }\n atom-text-editor[mini] {\n font-size: inherit;\n text-align: left;\n }\n }\n\n &-message {\n max-height: 20em;\n margin: @component-padding / 2;\n padding: @component-padding / 2;\n line-height: 1.4;\n white-space: normal;\n text-align: left;\n overflow-y: auto;\n border: 1px solid @base-border-color;\n border-radius: @component-border-radius;\n background-color: @inset-panel-background-color;\n\n &:empty {\n display: none;\n }\n }\n}\n","digest":"0cbddff446212db08d871a028dd406f4ce0e3c11"},"node_modules/github/styles/changed-files-count-view.less":{"content":"@import \"variables/ui-variables\";\n@import \"variables/syntax-variables\";\n@import \"variables\";\n\n// Used in the status-bar\n\n.github-ChangedFilesCount {\n\n &.icon-diff::before {\n margin-right: .2em;\n }\n\n}\n","digest":"e2c6c93159b16fee602d1862449cf0b6bfe45d9f"},"node_modules/github/styles/commit-view.less":{"content":"@import \"variables/ui-variables\";\n@import \"variables/syntax-variables\";\n@import \"variables\";\n\n.github-CommitView {\n padding: @component-padding;\n border-top: 1px solid @base-border-color;\n flex: 0 0 auto;\n\n &-editor {\n position: relative;\n border: 1px solid @input-border-color;\n border-radius: @component-border-radius;\n padding: @component-padding / 2;\n font-size: @font-size;\n background-color: @syntax-background-color;\n }\n\n &-editor.hidden {\n display: none;\n }\n\n &-editor atom-text-editor {\n height: 100px;\n .cursor-line.cursor-line.cursor-line {\n background-color: transparent;\n }\n }\n\n &-expandButton {\n position: absolute;\n right: 0;\n bottom: 0;\n padding: @component-padding / 2;\n line-height: 1;\n border: none;\n background-color: @syntax-background-color;\n cursor: default;\n opacity: .3;\n &:hover {\n opacity: 1;\n }\n &:active {\n opacity: .5;\n }\n &:before {\n margin: 0;\n }\n }\n\n &-bar {\n display: flex;\n align-items: center;\n margin-top: @component-padding;\n }\n\n &-label {\n margin-right: @component-padding;\n }\n\n &-button {\n flex: 1;\n overflow: hidden;\n text-overflow: ellipsis;\n cursor: default;\n &.is-secondary {\n flex: 0 1 auto;\n margin-right: @component-padding;\n }\n }\n\n &-remaining-characters {\n width: 1.25em;\n text-align: right;\n margin-left: @component-padding;\n color: @text-color-subtle;\n\n &.is-warning { color: @text-color-warning; }\n &.is-error { color: @text-color-error; }\n }\n\n\n // States ---------------------------------------------------\n\n &-editor.is-expanded {\n background-color: transparent;\n atom-text-editor {\n display: none;\n }\n .github-CommitView-expandButton {\n position: relative;\n width: 100%;\n line-height: inherit;\n background-color: transparent;\n opacity: .5;\n &::before {\n margin-right: @component-padding / 2;\n }\n &::after {\n content: \"Toggle expanded commit message\";\n }\n &:active {\n opacity: .3;\n }\n }\n }\n\n}\n\n\n\n\n\n\n// Hacks ---------------------------------------------------\n// TODO: Unhack if possible\n\n\n// Fix focus styles\n// Since it's not possible to add a padding to <atom-text-editor>\n// a pseudo element is used to add the border when focused.\n\n.theme-one-dark-ui,\n.theme-one-light-ui {\n .github-CommitView-editor atom-text-editor.is-focused {\n box-shadow: none;\n &:before {\n content: \"\";\n position: absolute;\n top: -2px;\n left: -2px;\n right: -2px;\n bottom: -2px;\n border: 2px solid;\n border-color: inherit;\n border-radius: @component-border-radius;\n }\n }\n}\n","digest":"9e5cbf636f2ccc35496b051f83a432acec5b4045"},"node_modules/github/styles/conflicting-editor.less":{"content":"@import \"variables/ui-variables\";\n@import \"variables/syntax-variables\";\n@import \"variables\";\n\n@conflict-color-ours: spin(@syntax-color-renamed, 80); // usually magenta/purple-ish\n@conflict-color-theirs: @syntax-color-renamed;\n@conflict-color-base: desaturate( @syntax-color-renamed, 100% );\n@conflict-color-modified: @syntax-color-modified;\n@conflict-color-resolved: @syntax-color-added;\n\n\natom-text-editor {\n\n .github-ConflictBlock {\n display: flex;\n align-items: center;\n margin-right: @component-padding;\n padding: @component-padding / 2;\n cursor: default;\n color: fade(@syntax-text-color, 75%);\n\n .github-ResolutionControls {\n flex: 1;\n button {\n margin-right: @component-padding;\n }\n\n span {\n cursor: pointer;\n }\n }\n }\n\n .github-SideDescription {\n font-family: @font-family;\n font-size: .9em;\n }\n\n .github-ResolutionControls .icon {\n line-height: 0;\n }\n\n .github-ConflictTopBlock {\n margin-top: @component-padding;\n border-top-left-radius: @component-border-radius * 1.5;\n border-top-right-radius: @component-border-radius * 1.5;\n }\n .github-ConflictBottomBlock {\n margin-bottom: @component-padding;\n border-bottom-left-radius: @component-border-radius * 1.5;\n border-bottom-right-radius: @component-border-radius * 1.5;\n }\n\n\n // Color variations -------------------------\n\n .generate-conflicts(@name, @color) {\n .github-Conflict@{name} {\n margin-right: @component-padding;\n background-color: @color;\n &.cursor-line { background-color: fadein(@color, 10%) !important; }\n }\n\n .github-Conflict@{name}Banner {\n margin-right: @component-padding;\n background-color: @color;\n &.cursor-line { background-color: fadein(@color, 10%) !important; }\n &.github-ConflictUnmodifiedBanner span { color: fade(@color, 66%) !important; };\n }\n\n .github-Conflict@{name}Block {\n color: contrast(@syntax-background-color, hsla(0,0%,0%,.66), hsla(0,0%,100%,.5));\n background-color: fadein(@color, 20%);\n\n .btn {\n color: white;\n border-color: hsla(0,0%,0%,.15);\n border: none;\n background: fade(@color, 100%);\n }\n }\n }\n\n .generate-conflicts(Ours, fade(@conflict-color-ours, 15%) );\n .generate-conflicts(Theirs, fade(@conflict-color-theirs, 15%) );\n .generate-conflicts(Base, fade(@conflict-color-base, 15%) );\n .generate-conflicts(Modified, fade(@conflict-color-modified, 15%) );\n\n\n // Separator -------------------------\n // Uses same color as Base\n\n .github-ConflictSeparator {\n margin-right: @component-padding;\n background-color: fade(@conflict-color-base, 15%);\n &.cursor-line { background-color: fade(@conflict-color-base, 25%) !important; }\n span { color: fade(@conflict-color-base, 66%) !important; };\n }\n\n // Resolved -------------------------\n\n .github-ResolvedLines {\n background-color: fade(@conflict-color-resolved, 15%);\n &.cursor-line { background-color: fade(@conflict-color-resolved, 25%) !important; }\n }\n}\n","digest":"b186401a41aa0364bfed9c88162b18a96f3bbb87"},"node_modules/github/styles/dialog.less":{"content":"@import \"variables/ui-variables\";\n@import \"variables/syntax-variables\";\n@import \"variables\";\n\n@github-dialog-spacing: @component-padding / 2;\n\n.github-Dialog {\n\n &Prompt {\n margin: @component-padding;\n text-align: center;\n font-size: 1.2em;\n }\n\n &Inputs {\n display: flex;\n flex-direction: column;\n padding: @github-dialog-spacing;\n }\n\n &Label {\n flex: 1;\n margin: @github-dialog-spacing;\n line-height: 2;\n }\n\n &Buttons {\n display: flex;\n justify-content: flex-end;\n padding: @github-dialog-spacing;\n\n // Switch button order on Windows\n .platform-win32 & {\n flex-direction: row-reverse;\n justify-content: flex-start;\n }\n\n .btn {\n margin: @github-dialog-spacing;\n }\n }\n\n &Spinner {\n display: flex;\n align-items: center;\n justify-content: center;\n padding: @component-padding;\n\n .loading {\n margin: @component-padding;\n }\n }\n\n atom-text-editor[mini].editor {\n margin: 0;\n }\n}\n","digest":"666aae03e802fe20d2f9c2547aaa3151aef6a343"},"node_modules/github/styles/file-patch-list-view.less":{"content":"@import \"variables/ui-variables\";\n@import \"variables/syntax-variables\";\n@import \"variables\";\n\n.github-FilePatchListView {\n &:empty:before {\n content:'No changes';\n display: block;\n padding: @component-padding;\n text-align: center;\n color: @text-color-subtle;\n font-style: italic;\n }\n\n &-item {\n position: relative;\n display: flex;\n align-items: flex-start;\n padding: @component-padding/2 @component-padding;\n padding-left: @component-padding * 3.5;\n overflow: hidden;\n -webkit-user-select: none;\n cursor: default;\n }\n\n &-icon {\n text-align: right;\n &:before {\n margin-right: @component-padding / 1.2;\n }\n }\n\n &-path {\n flex: 1;\n word-break: break-word;\n }\n\n &-resolutionItem {\n padding-top: 0;\n padding-bottom: @component-padding / 2;\n }\n}\n\n.github-MergeConflictPaths .github-FilePatchListView-icon:last-child {\n margin-left: @component-padding / 2;\n}\n","digest":"a86dc9565052d0e9c830974a7f164ae66a7b0e06"},"node_modules/github/styles/file-patch-view.less":{"content":"@import \"variables/ui-variables\";\n@import \"variables/syntax-variables\";\n@import \"variables\";\n\n.github-FilePatchView {\n display: flex;\n flex-direction: column;\n -webkit-user-select: none;\n cursor: default;\n flex: 1;\n min-width: 0;\n\n &-header {\n display: flex;\n justify-content: space-between;\n align-items: center;\n padding: @component-padding/2;\n padding-left: @component-padding;\n border-bottom: 1px solid @base-border-color;\n\n .btn {\n font-size: .9em;\n &.icon-move-up::before,\n &.icon-move-down::before {\n font-size: 1em;\n margin-right: .5em;\n }\n }\n }\n\n &-title {\n flex: 1;\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n margin-right: @component-padding;\n }\n\n &-container {\n flex: 1;\n overflow-y: auto;\n\n .is-blank, .large-file-patch {\n display: flex;\n height: 100%;\n align-items: center;\n justify-content: center;\n text-align: center;\n font-size: 1.2em;\n padding: @component-padding;\n }\n\n .large-file-patch {\n flex-direction: column;\n }\n }\n}\n","digest":"faa80c413e9f60ff766e507c573b14530694384a"},"node_modules/github/styles/git-panel.less":{"content":"@import \"variables/ui-variables\";\n@import \"variables/syntax-variables\";\n@import \"variables\";\n\n.github-StubItem-git-tab-controller {\n flex: 1;\n display: flex;\n}\n\n.github-PanelEtchWrapper {\n flex: 1;\n display: flex;\n min-width: 0;\n}\n\n.github-Panel {\n flex: 1;\n display: flex;\n flex-direction: column;\n min-width: 0;\n font-family: @font-family;\n font-size: @font-size;\n color: @text-color;\n -webkit-user-select: none;\n cursor: default;\n\n &.no-repository {\n padding: @component-padding * 3;\n text-align: center;\n }\n\n &.is-loading {\n color: @text-color-subtle;\n }\n\n &.no-repository {\n display: flex;\n justify-content: center;\n font-size: 1.25em;\n\n > * {\n margin: @component-padding 0;\n }\n\n .git-logo-path {\n fill: mix(@base-background-color, @text-color, 66%); // 2/3 of bg color\n }\n\n .btn.btn-primary {\n overflow: hidden;\n text-overflow: ellipsis;\n }\n }\n}\n\natom-dock.bottom {\n .github-Panel {\n flex-direction: row;\n }\n .github-StagingView {\n flex-direction: row;\n flex: 2;\n }\n .github-StagedChanges {\n border-left: 1px solid @base-border-color;\n border-right: 1px solid @base-border-color;\n }\n .github-StagingView-group:first-child .github-StagingView-header {\n border-top: 1px solid @base-border-color;\n }\n .github-CommitView {\n flex: 1;\n }\n}\n","digest":"21dbf06996a424e1c8eec8d9e5122bbd9b813056"},"node_modules/github/styles/github-controller.less":{"content":"@import \"variables/ui-variables\";\n@import \"variables/syntax-variables\";\n.github-StubItem-github-tab-controller {\n flex: 1;\n display: flex;\n}\n\n.github-GithubTabController {\n flex: 1;\n display: flex;\n flex-direction: column;\n\n &-content {\n flex: 1;\n display: flex;\n }\n\n &-no-remotes {\n margin: 10px;\n font-size: @font-size * 1.25;\n }\n\n .github-RemoteSelector {\n font-size: @font-size * 1.25;\n\n p {\n text-align: center;\n margin: 10px;\n }\n\n ul {\n list-style: none;\n padding-left: 1em;\n }\n\n a {\n color: @text-color-info;\n }\n }\n}\n","digest":"963a90ebbd22941db87bfa58517c4ee9831c6e4a"},"node_modules/github/styles/github-login-view.less":{"content":"@import \"variables/ui-variables\";\n@import \"variables/syntax-variables\";\n.github-GithubLoginView-Container {\n height: 100%;\n display: flex;\n}\n\n.github-GithubLoginView {\n height: 100%;\n display: flex;\n\n .github-GithubLoginView-Subview {\n flex: 1;\n display: flex;\n flex-direction: column;\n align-self: center;\n align-items: center;\n padding: 20px;\n\n > button, > input {\n margin: @component-padding;\n }\n }\n\n p {\n text-align: center;\n font-size: @font-size * 1.25;\n margin: 0;\n\n &:first-child {\n margin-bottom: 20px;\n }\n\n a {\n color: @text-color-info;\n }\n }\n\n input[type=text] {\n width: 100%;\n }\n}\n","digest":"ac9a34a60d6b07479d9804318cc56bab71143908"},"node_modules/github/styles/hunk-view.less":{"content":"@import \"variables/ui-variables\";\n@import \"variables/syntax-variables\";\n@import \"ui-variables\";\n\n@hunk-fg-color: @text-color-subtle;\n@hunk-bg-color: @pane-item-background-color;\n\n.github-HunkView {\n font-family: Menlo, Consolas, 'DejaVu Sans Mono', monospace;\n border-bottom: 1px solid @pane-item-border-color;\n background-color: @hunk-bg-color;\n\n &-header {\n display: flex;\n align-items: stretch;\n font-size: .9em;\n background-color: @panel-heading-background-color;\n border-bottom: 1px solid @panel-heading-border-color;\n }\n\n &-title {\n flex: 1;\n line-height: 2.4;\n padding: 0 @component-padding;\n color: @text-color-subtle;\n overflow: hidden;\n white-space: nowrap;\n text-overflow: ellipsis;\n -webkit-font-smoothing: antialiased;\n }\n\n &-stageButton,\n &-discardButton {\n line-height: 1;\n padding-left: @component-padding;\n padding-right: @component-padding;\n font-family: @font-family;\n border: none;\n border-left: 1px solid @panel-heading-border-color;\n background-color: transparent;\n cursor: default;\n &:hover { background-color: @button-background-color-hover; }\n &:active { background-color: @panel-heading-border-color; }\n }\n\n // pixel fit the icon\n &-discardButton:before {\n text-align: left;\n width: auto;\n }\n\n &-line {\n display: table-row;\n line-height: 1.5em;\n color: @hunk-fg-color;\n &.is-unchanged {\n -webkit-font-smoothing: antialiased;\n }\n }\n\n &-lineNumber {\n display: table-cell;\n min-width: 3.5em; // min 4 chars\n overflow: hidden;\n padding: 0 .5em;\n text-align: right;\n border-right: 1px solid @base-border-color;\n -webkit-font-smoothing: antialiased;\n }\n\n &-plusMinus {\n margin-right: 1ch;\n color: fade(@text-color, 50%);\n vertical-align: top;\n }\n\n &-lineContent {\n display: table-cell;\n padding: 0 .5em 0 3ch; // indent 3 characters\n text-indent: -2ch; // remove indentation for the +/-\n white-space: pre-wrap;\n word-break: break-word;\n width: 100%;\n vertical-align: top;\n }\n\n &-lineText {\n display: inline-block;\n text-indent: 0;\n }\n}\n\n\n//\n// States\n// -------------------------------\n\n.github-HunkView.is-selected.is-hunkMode .github-HunkView-header {\n background-color: @background-color-selected;\n .github-HunkView-title {\n color: @text-color;\n }\n .github-HunkView-stageButton, .github-HunkView-discardButton {\n border-color: mix(@text-color, @background-color-selected, 25%);\n }\n}\n\n.github-HunkView-title:hover {\n color: @text-color-highlight;\n}\n\n.github-HunkView-line {\n\n // mixin\n .hunk-line-mixin(@fg; @bg) {\n &:hover {\n background-color: @background-color-highlight;\n }\n &.is-selected {\n color: @text-color;\n background-color: @background-color-selected;\n }\n .github-HunkView-lineContent {\n color: saturate( mix(@fg, @text-color-highlight, 20%), 20%);\n background-color: saturate( mix(@bg, @hunk-bg-color, 15%), 20%);\n }\n // hightlight when focused + selected\n .github-FilePatchView:focus &.is-selected .github-HunkView-lineContent {\n color: saturate( mix(@fg, @text-color-highlight, 10%), 10%);\n background-color: saturate( mix(@bg, @hunk-bg-color, 25%), 10%);\n }\n }\n\n &.is-deleted {\n .hunk-line-mixin(@text-color-error, @background-color-error);\n }\n\n &.is-added {\n .hunk-line-mixin(@text-color-success, @background-color-success);\n }\n\n // divider line between added and deleted lines\n &.is-deleted + .is-added .github-HunkView-lineContent {\n box-shadow: 0 -1px 0 hsla(0,0%,50%,.1);\n }\n\n}\n\n// focus colors\n.github-FilePatchView:focus {\n .github-HunkView.is-selected.is-hunkMode .github-HunkView-title,\n .github-HunkView.is-selected.is-hunkMode .github-HunkView-header,\n .github-HunkView-line.is-selected .github-HunkView-lineNumber {\n color: contrast(@button-background-color-selected);\n background: @button-background-color-selected;\n }\n .github-HunkView-line.is-selected .github-HunkView-lineNumber {\n border-color: mix(@button-border-color, @button-background-color-selected, 25%);\n }\n .github-HunkView.is-selected.is-hunkMode .github-HunkView {\n &-stageButton,\n &-discardButton {\n border-color: mix(@hunk-bg-color, @button-background-color-selected, 30%);\n &:hover { background-color: mix(@hunk-bg-color, @button-background-color-selected, 10%); }\n &:active { background-color: @button-background-color-selected; }\n }\n }\n}\n","digest":"d071e3342d98b85c0f3dc23dfb62f8799ebf4207"},"node_modules/github/styles/issueish-tooltip.less":{"content":"@import \"variables/ui-variables\";\n@import \"variables/syntax-variables\";\n@import 'variables';\n\n.github-IssueishTooltip {\n max-width: 500px;\n text-align: left;\n\n .issueish-badge-and-link {\n padding-bottom: @component-padding;\n }\n\n .issueish-badge {\n align-self: flex-start;\n flex-shrink: 0;\n margin-right: @component-padding;\n font-weight: bold;\n text-transform: capitalize;\n border-radius: @component-border-radius;\n\n &.open {\n color: contrast(@gh-background-color-green, black, white, 50%);\n background-color: @gh-background-color-green;\n }\n\n &.closed {\n color: contrast(@gh-background-color-red, black, white, 50%);\n background-color: @gh-background-color-red;\n }\n\n &.merged {\n color: contrast(@gh-background-color-purple, black, white, 50%);\n background-color: @gh-background-color-purple;\n }\n }\n\n .issueish-title {\n margin: 0;\n padding-bottom: @component-padding;\n line-height: 1.2;\n display: block;\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n }\n\n .author-avatar {\n margin-right: 10px;\n width: 20px;\n height: 20px;\n }\n}\n","digest":"43d49a3f33510ca56adc2bcf272d9377f82938d0"},"node_modules/github/styles/loader.less":{"content":"@import \"variables/ui-variables\";\n@import \"variables/syntax-variables\";\n\n@import \"variables\";\n\n// Loader\n// Shows a spinner with an Octoface\n\n/* Usage: ---------------------------------------------\n\n<div className=\"github-Loader\">\n <span className=\"github-Spinner\"></span>\n</div>\n\n--------------------------------------------------- */\n\n// Loader (just the container)\n\n.github-Loader {\n height: 100%;\n display: flex;\n align-items: center;\n justify-content: center;\n font-size: 32px;\n color: @gh-background-color-purple;\n\n .tooltip & { color: inherit; }\n}\n\n\n// Spinner (can be used outside of github-Loader too)\n\n.github-Spinner {\n position: relative;\n display: inline-block;\n vertical-align: middle;\n width: 2em;\n height: 2em;\n\n // Octoface\n &::before {\n display: inline-block;\n width: inherit;\n height: inherit;\n content: \"\\f008\";\n font-family: 'Octicons Regular';\n font-weight: normal;\n font-style: normal;\n line-height: 2;\n text-align: center;\n -webkit-font-smoothing: antialiased;\n }\n\n // spinner\n &::after {\n content: \"\";\n position: absolute;\n width: inherit;\n height: inherit;\n top: 0;\n left: 0;\n border-right: 2px dotted;\n border-bottom: 2px dotted;\n border-left: 2px solid transparent;\n border-radius: 1em;\n\n // To limit CPU usage, the animation plays for some time at normal speed,\n // then slows down frame-rate for a while and stops at some point\n animation: github-Spinner-animation 4s linear 12,\n github-Spinner-animation 4s 48s steps(12) 100;\n\n @keyframes github-Spinner-animation {\n 100% { transform: rotate(360deg); }\n }\n }\n}\n","digest":"fcfbd015c3136813441bacb738856357318e1533"},"node_modules/github/styles/message.less":{"content":"@import \"variables/ui-variables\";\n@import \"variables/syntax-variables\";\n\n@import \"variables\";\n\n// Message\n// Use to show some sort of message, like an error or so\n\n/* Usage: ---------------------------------------------\n\n<div className=\"github-Message\">\n <div className=\"github-Message-wrapper\">\n <h1 className=\"github-Message-title\">Whooops</h1>\n <p className=\"github-Message-description\">Bad things happened</p>\n <p className=\"github-Message-action\">\n <button className=\"github-Message-button btn btn-primary\">Get me out of here</button>\n </p>\n </div>\n</div>\n\n--------------------------------------------------- */\n\n\n.github-Message {\n flex: 1;\n display: flex;\n overflow-x: hidden;\n overflow-y: auto;\n\n &-wrapper {\n margin: auto;\n padding: @component-padding*2;\n text-align: center;\n }\n\n &-title {\n color: @text-color-highlight;\n font-size: 1.5em;\n margin-bottom: .5em;\n }\n\n &-description {\n font-size: 1.2em;\n line-height: 1.4;\n margin-bottom: 0;\n }\n\n &-longDescription {\n font-size: 1.1em;\n line-height: 1.4;\n text-align: left;\n margin-bottom: 0;\n }\n\n &-action {\n margin-top: @component-padding* 2;\n }\n\n &-button {\n margin: @component-padding/2;\n }\n\n}\n","digest":"67da1c1e4c884f86f0dc5091ee290aaa296c90f8"},"node_modules/github/styles/pane-view.less":{"content":"@import \"variables/ui-variables\";\n@import \"variables/syntax-variables\";\n@import \"variables\";\n@import \"ui-variables\";\n\n.github-PaneView {\n display: flex;\n height: 100%;\n}\n","digest":"d767a2539746faac8959261c770bd262e58c4587"},"node_modules/github/styles/pr-info.less":{"content":"@import \"variables/ui-variables\";\n@import \"variables/syntax-variables\";\n@import 'variables';\n\n@label-padding: @component-padding / 2;\n@avatar-size: 32px;\n\n.github-RemotePrController {\n flex: 1;\n display: flex;\n flex-direction: column;\n}\n\n.github-PrInfo {\n padding: @component-padding * 2;\n overflow: auto;\n flex: 1;\n cursor: default;\n\n .icon {\n vertical-align: middle;\n }\n\n .pinned-by-url {\n cursor: pointer;\n }\n\n .pinned-pr-info {\n display: flex;\n padding: @component-padding;\n border: 1px solid @text-color-subtle;\n border-radius: @component-border-radius;\n margin-bottom: @component-padding * 2;\n\n a {\n text-decoration: underline;\n }\n }\n\n // Badge and link ------------------------\n .pr-badge-and-link {\n display: flex;\n align-items: center;\n margin-bottom: @component-padding * 2;\n\n .browser-link {\n display: inline-block;\n margin-left: 0.5em;\n }\n\n :last-child {\n flex: 1;\n text-align: right;\n }\n }\n\n .pr-link a {\n color: @text-color-subtle;\n word-break: break-all;\n }\n\n .refresh-button {\n .icon {\n color: @text-color-subtle;\n cursor: pointer;\n\n &.refreshing::before {\n @keyframes github-RefreshButton-animation {\n 100% { transform: rotate(360deg); }\n }\n animation: github-RefreshButton-animation 2s linear 30; // limit to 1min in case something gets stuck\n }\n }\n }\n\n\n // Avatar and title ------------------------\n\n .pr-avatar-and-title {\n display: flex;\n align-items: center;\n margin-bottom: @component-padding;\n }\n\n .author-avatar-link {\n margin-right: @component-padding;\n align-self: flex-start;\n }\n\n .author-avatar {\n max-height: @avatar-size;\n border-radius: @component-border-radius;\n }\n\n .pr-title {\n margin: 0;\n line-height: 1.2;\n color: @text-color-highlight;\n }\n\n // Status ------------------------\n\n .merge-status,\n .build-status {\n line-height: 2;\n }\n .merge-status.success {\n .icon { color: @text-color-success; }\n }\n .build-status.pending {\n .icon { color: @text-color-warning; }\n }\n\n // Info ------------------------\n\n .count-number {\n margin-left: .25em;\n font-size: 1.1em;\n font-weight: 600;\n line-height: 1;\n }\n\n .label {\n padding: 0 @label-padding;\n margin: 0 @label-padding @label-padding 0;\n border-radius: @component-border-radius;\n line-height: 2em;\n display: inline-block;\n }\n\n\n // Reactions ------------------------\n\n .reactions {\n .reaction-group {\n margin-right: @component-padding * 2;\n }\n }\n\n // Statuses ------------------------\n\n .github-PrStatuses {\n border-top: 1px solid @base-border-color;\n padding-top: @component-padding * 2;\n }\n\n // All \"items\" ------------------------\n\n .meta-info,\n .conversation,\n .commit-count,\n .file-count,\n .reactions,\n .labels {\n border-top: 1px solid @base-border-color;\n padding: @component-padding 0;\n }\n\n .conversation {\n cursor: pointer;\n }\n}\n","digest":"5837d6e7353bb5d158aa8179919adb2904a55774"},"node_modules/github/styles/pr-pane-item.less":{"content":"@import \"variables/ui-variables\";\n@import \"variables/syntax-variables\";\n@import 'variables';\n\n.github-PrPaneItem {\n padding: @component-padding * 3;\n overflow: auto;\n position: absolute;\n top: 0;\n right: 0;\n bottom: 0;\n left: 0;\n font-size: 1.25em;\n line-height: 1.5;\n background-color: @base-background-color;\n\n * {\n user-select: text;\n -webkit-user-select: text;\n }\n\n &-container {\n max-width: 48em;\n margin: 0 auto;\n }\n\n // Badge and link ------------------------\n .issueish-badge-and-link {\n display: flex;\n align-items: center;\n margin-bottom: @component-padding * 2;\n\n :last-child {\n flex: 1;\n text-align: right;\n }\n }\n\n .issueish-link a {\n color: @text-color-subtle;\n }\n\n .pr-build-status-icon {\n margin-left: @component-padding;\n }\n\n .refresh-button {\n .icon {\n color: @text-color-subtle;\n cursor: pointer;\n\n &.refreshing::before {\n @keyframes github-RefreshButton-animation {\n 100% { transform: rotate(360deg); }\n }\n animation: github-RefreshButton-animation 2s linear 30; // limit to 1min in case something gets stuck\n }\n }\n }\n\n\n // Avatar and title ------------------------\n\n .issueish-avatar-and-title {\n display: flex;\n align-items: center;\n margin-bottom: @component-padding * 2;\n padding-bottom: @component-padding;\n border-bottom: 1px solid @base-border-color;\n }\n\n .author-avatar-link {\n margin-right: @component-padding;\n align-self: flex-start;\n }\n\n .author-avatar {\n max-height: 32px;\n border-radius: @component-border-radius;\n }\n\n .issueish-title {\n margin: 0;\n font-size: 1.5em;\n font-weight: 500;\n line-height: 1.3;\n color: @text-color-highlight;\n }\n\n\n // Body ------------------------\n\n .issueish-body {\n padding-top: @component-padding;\n border-top: 1px solid @base-border-color;\n\n & > *:first-child {\n margin-top: 0;\n }\n }\n\n .github-DotComMarkdownHtml {\n a {\n color: @text-color-info;\n }\n\n p {\n line-height: 1.5;\n }\n\n hr {\n margin-top: 5px;\n margin-bottom: 5px;\n border-top: 1px solid @text-color;\n width: 100%\n }\n\n ul {\n margin-left: -10px;\n }\n\n ol {\n margin-left: -20px;\n }\n\n li {\n font-size: .9em;\n padding-top: .1em;\n padding-bottom: .1em;\n\n li {\n font-size: 1em;\n }\n }\n\n pre > code {\n white-space: pre;\n }\n }\n\n\n // Reactions ------------------------\n\n .reactions {\n width: fit-content;\n padding-top: @component-padding;\n .reaction-group {\n margin-right: @component-padding;\n padding: @component-padding;\n border: 1px solid @base-border-color;\n border-radius: @component-border-radius;\n }\n &:empty {\n all: unset;\n }\n }\n\n // Statuses ------------------------\n\n .github-PrStatuses {\n margin-top: @component-padding * 4;\n padding: @component-padding;\n border: 1px solid @base-border-color;\n border-radius: @component-border-radius;\n }\n\n\n // Elements ------------------------\n\n blockquote {\n font-size: inherit;\n padding-top: 0;\n padding-left: @component-padding;\n padding-bottom: 0;\n color: @text-color-subtle;\n border-left: 2px solid @text-color-subtle;\n }\n}\n","digest":"971ec9a620680e0d82cff70685d38daf6097cddb"},"node_modules/github/styles/pr-selection.less":{"content":"@import \"variables/ui-variables\";\n@import \"variables/syntax-variables\";\n@import 'variables';\n\n.github-PrSelectionByBranch {\n flex: 1;\n display: flex;\n overflow: auto;\n\n &-container {\n flex: 1;\n display: flex;\n flex-direction: column;\n }\n\n &-message {\n padding: 0 @component-padding;\n margin: @component-padding 0;\n }\n\n &-input {\n padding: 0 @component-padding;\n margin: @component-padding 0;\n\n // TODO: Simplify selector\n .github-PrUrlInputBox-Subview > input {\n margin-top: 0;\n }\n }\n\n &-list {\n list-style: none;\n padding-left: 0;\n cursor: default;\n\n li {\n padding: @component-padding/2 @component-padding;\n border-top: 1px solid @base-border-color;\n &:hover {\n background-color: @background-color-highlight;\n }\n }\n }\n\n}\n","digest":"631c3dd52f9760cdeaa04183207d97e870e4d030"},"node_modules/github/styles/pr-statuses.less":{"content":"@import \"variables/ui-variables\";\n@import \"variables/syntax-variables\";\n@import 'variables';\n\n.github-PrStatuses {\n .donut-ring-pending {\n stroke: @gh-background-color-yellow;\n }\n\n .donut-ring-succeeded {\n stroke: @gh-background-color-green;\n }\n\n .donut-ring-failed {\n stroke: @gh-background-color-red;\n }\n\n &-header {\n display: flex;\n\n svg {\n width: 50px;\n height: 50px;\n\n circle {\n stroke-width: 5;\n }\n }\n }\n\n &-summary {\n font-weight: bold;\n padding: @component-padding 0;\n flex: 1;\n }\n\n &-list {\n display: flex;\n flex-direction: column;\n list-style: none;\n padding: 0;\n margin-bottom: 0;\n }\n\n &-list-item {\n display: flex;\n flex-direction: row;\n border-top: 1px solid @base-border-color;\n padding: @component-padding / 2;\n\n &-icon {\n padding-right: @component-padding;\n display: flex;\n align-items: center; // hmm, does it look better centered vertically or not\n }\n\n &-context {\n flex: 1;\n }\n\n &-details-link {\n margin-left: 5px;\n }\n }\n}\n","digest":"489204272cd824ae56c32946c4d80de4034b5362"},"node_modules/github/styles/pr-timeline.less":{"content":"@import \"variables/ui-variables\";\n@import \"variables/syntax-variables\";\n@import 'variables';\n\n@avatar-size: 20px;\n\n.github-PrTimeline {\n margin-top: @component-padding * 3;\n border-top: 1px solid mix(@text-color, @base-background-color, 15%);\n\n // all items\n .timeline-item {\n margin: 0 @component-padding * 3;\n padding: @component-padding*3 0;\n border-bottom: 1px solid mix(@text-color, @base-background-color, 15%);\n }\n\n .emoji,\n g-emoji {\n margin-right: .25em;\n }\n\n\n .author-avatar {\n width: @avatar-size;\n height: @avatar-size;\n margin-right: 5px;\n }\n\n .pre-timeline-item-icon {\n position: absolute;\n margin-left: -25px;\n margin-top: 2px;\n color: @text-color-subtle;\n }\n\n .commits {\n .info-row {\n margin-bottom: @component-padding;\n }\n }\n\n .commit {\n display: table-row;\n align-items: center;\n margin-left: @component-padding * 2;\n\n &:first-child {\n padding-top: @component-padding;\n }\n\n &:only-child {\n padding-top: 0;\n padding-bottom: 0;\n margin-left: -@component-padding;\n }\n\n & + .issue {\n margin-top: @component-padding/2;\n }\n\n .commit-author {\n display: table-cell;\n white-space: nowrap;\n text-align: right;\n }\n\n .author-avatar {\n flex-basis: @avatar-size;\n }\n\n .commit-message-headline {\n display: table-cell;\n font-size: .9em;\n padding: 0 @component-padding/3;\n max-height: @avatar-size;\n text-overflow: ellipsis;\n white-space: nowrap;\n overflow: hidden;\n max-width: 0; // this makes sure the ellipsis work in table-cell\n width: 100%;\n }\n\n .commit-sha {\n display: table-cell;\n text-align: right;\n font-family: monospace;\n padding-left: 5px;\n font-size: .85em;\n color: @text-color-subtle;\n }\n }\n\n .cross-referenced-events {\n // provides spacing between cross-referenced-event rows\n border-spacing: 0 @component-padding / 2;\n\n .info-row {\n margin-bottom: @component-padding;\n }\n }\n\n .cross-referenced-event {\n display: table-row;\n\n &:last-child {\n margin-bottom: 0;\n }\n\n &-label {\n display: table-cell;\n width: 100%;\n\n &-title {\n font-weight: bold;\n }\n\n &-number {\n display: inline;\n margin-left: 5px;\n white-space: nowrap;\n }\n }\n\n &-private {\n display: table-cell;\n }\n\n &-state {\n display: table-cell;\n text-align: right;\n\n .badge {\n margin-left: 5px;\n }\n }\n }\n\n .sha {\n font-family: monospace;\n }\n\n .merged-event {\n display: flex;\n align-items: center;\n font-size: .9em;\n line-height: 1.3;\n color: @text-color-subtle;\n\n .username,\n .merge-ref {\n font-weight: bold;\n color: @text-color-highlight;\n }\n }\n\n .merged-event ~ .issue {\n border-bottom-style: dashed;\n }\n\n .head-ref-force-pushed-event {\n .username {\n font-weight: bold;\n color: @text-color-highlight;\n }\n .sha {\n font-weight: bold;\n }\n }\n\n .issue {\n\n .info-row {\n margin-bottom: @component-padding/1.5;\n }\n .comment-message-header {\n font-size: .9em;\n color: @text-color-subtle;\n }\n\n .github-DotComMarkdownHtml {\n\n p:last-child {\n margin-bottom: 0;\n }\n\n pre > code {\n white-space: pre;\n }\n }\n }\n\n &-load-more-link {\n cursor: pointer;\n text-align: center;\n }\n\n}\n","digest":"d50d5e0e5a2b8d3228297364d703cec05d3ea8d1"},"node_modules/github/styles/pr-url-input-box.less":{"content":"@import \"variables/ui-variables\";\n@import \"variables/syntax-variables\";\n\n@import \"variables\";\n\n.github-PrUrlInputBox {\n\n &-Container {\n display: flex;\n flex: 1;\n flex-direction: row;\n\n // TODO: Simplify selector\n // Only add padding when inside this container\n .github-PrUrlInputBox-Subview {\n padding: @component-padding * 2;\n }\n\n p {\n text-align: center;\n }\n }\n\n &-pinButton {\n padding: @component-padding;\n border-bottom: 1px solid @base-border-color;\n cursor: default;\n }\n\n // TODO: Simplify selector\n &-pinButton + &-Subview {\n padding: @component-padding;\n border-bottom: 1px solid @base-border-color;\n }\n\n &-Subview {\n flex: 1;\n display: flex;\n flex-direction: column;\n align-self: center;\n align-items: center;\n\n > button, > input {\n margin: @component-padding;\n }\n\n .icon-git-pull-request:before {\n width: auto;\n font-size: 48px;\n color: @text-color-subtle;\n }\n\n p {\n font-size: 1.1em;\n line-height: 1.5;\n -webkit-user-select: none;\n cursor: default;\n\n &:last-of-type {\n margin-bottom: 0;\n }\n\n a {\n color: @text-color-info;\n }\n }\n\n input[type=text] {\n width: 100%;\n }\n }\n\n}\n","digest":"3356a1beac32671788f42690a808c687abeb4a3f"},"node_modules/github/styles/push-pull-menu-view.less":{"content":"@import \"variables/ui-variables\";\n@import \"variables/syntax-variables\";\n@import \"variables\";\n\n.github-PushPullMenuView {\n\n &-selector {\n display: flex;\n align-items: center;\n }\n\n &-item {\n margin: @component-padding / 2;\n &.is-flexible {\n flex: 1;\n }\n }\n\n // margin not needed, .github-PushPullMenuView-item takes care of the spacing\n .icon-mark-github::before {\n margin-right: 0;\n color: @text-color-subtle;\n }\n\n // Make Pull/Push buttons take up available space\n // since they're more important than Fetch\n .btn-group {\n display: flex;\n .btn {\n flex: 1;\n }\n }\n\n // Removes flickering of the toolip if there is an icon inside\n .btn-tooltip-wrapper .icon {\n pointer-events: none;\n }\n\n &-message {\n max-height: 4.8em;\n margin: @component-padding / 2;\n padding: @component-padding / 2;\n line-height: 1.4;\n white-space: normal;\n text-align: left;\n overflow-y: auto;\n border: 1px solid @base-border-color;\n border-radius: @component-border-radius;\n background-color: @inset-panel-background-color;\n\n &:empty {\n display: none;\n }\n }\n\n\n // Progress indicator\n &.in-progress {\n .icon-mark-github {\n position: relative;\n color: @text-color;\n &:before {\n color: inherit;\n }\n &:after {\n content: \"\";\n position: absolute;\n top: -4px;\n left: -4px;\n width: 24px;\n height: 24px;\n border-top: 2px dotted;\n border-right: 2px dotted;\n border-bottom: 2px dotted transparent;\n border-radius: 16px;\n\n // To limit CPU usage, the animation plays for some time at normal speed,\n // then slows down frame-rate for a while and stops at some point\n -webkit-animation: github-PushPullMenuView-animation 2s linear 12,\n github-PushPullMenuView-animation 4s 24s steps(12) 100;\n }\n }\n }\n}\n\n\n// Animations\n@-webkit-keyframes github-PushPullMenuView-animation {\n 100% { transform: rotate(360deg); }\n}\n","digest":"118a5da77647865a0ccc7dce4494103e94bf99cb"},"node_modules/github/styles/push-pull-view.less":{"content":"@import \"variables/ui-variables\";\n@import \"variables/syntax-variables\";\n@import \"variables\";\n\n// Used in the status-bar\n\n.github-PushPull {\n\n &-icon.icon.icon.icon {\n margin-right: 0;\n text-align: center;\n }\n\n &-label.is-pull {\n margin-right: .4em;\n }\n\n}\n","digest":"e6ede175925ba2b76f78ff28d3efbbd366b055b3"},"node_modules/github/styles/resizer.less":{"content":"@import \"variables/ui-variables\";\n@import \"variables/syntax-variables\";\n.resizer-container {\n height: 100%;\n display: flex;\n\n .sizing-handle, .content {\n display: inline;\n }\n\n .sizing-handle {\n position: absolute;\n width: 8px;\n top: 0;\n bottom: 0;\n left: -5px;\n z-index: 3;\n cursor: col-resize;\n }\n}\n","digest":"36d765d44e0dbf2bed725bfacb3eb25a6ce9b732"},"node_modules/github/styles/staging-view.less":{"content":"@import \"variables/ui-variables\";\n@import \"variables/syntax-variables\";\n@import \"variables\";\n\n.github-StagingView {\n flex: 1;\n display: flex;\n flex-direction: column;\n\n &-group {\n flex: 1;\n display: flex;\n flex-direction: column;\n }\n\n &-header {\n display: flex;\n align-items: center;\n padding: 0 0 0 @component-padding;\n font-weight: 600;\n border-top: 1px solid @panel-heading-border-color;\n border-bottom: 1px solid @panel-heading-border-color;\n\n .github-StagingView-group:first-child & {\n border-top: none;\n }\n\n .icon {\n text-align: center;\n &:before {\n color: @text-color-subtle;\n margin-right: @component-padding / 1.2;\n vertical-align: middle;\n }\n }\n }\n\n &-headerButton {\n height: 2.5em;\n border: none;\n padding: 0 @component-padding;\n font-weight: normal;\n border-left: 1px solid @panel-heading-border-color;\n white-space: nowrap;\n background: none;\n cursor: default;\n\n &:disabled {\n color: @text-color-subtle;\n }\n\n &:active {\n background-color: @button-background-color-hover;\n }\n\n &.icon:before {\n margin-right: 0;\n font-size: 1em;\n text-align: left;\n }\n\n &--fullWidth {\n border-left: none;\n border-bottom: 1px solid @panel-heading-border-color;\n }\n }\n\n\n &-title {\n flex: 1;\n margin-right: @component-padding;\n line-height: 2.5em;\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n }\n\n &-list {\n flex: 1 1 0;\n overflow-x: auto;\n }\n}\n\n\n//\n// States\n// -----------------------------------------\n\n.github-StagingView-group-truncatedMsg {\n padding: @component-padding / 2 @component-padding;\n}\n\n.github-StagingView-group.is-focused .is-selected {\n // is selected\n color: @text-color-selected;\n background: @background-color-selected;\n\n // also has focus\n .github-StagingView:focus & {\n color: contrast(@button-background-color-selected);\n background: @button-background-color-selected;\n }\n}\n","digest":"57b9fc8f4327f0d431f62b68211b538219ffc179"},"node_modules/github/styles/status-bar-tile-controller.less":{"content":"@import \"variables/ui-variables\";\n@import \"variables/syntax-variables\";\n@import \"variables\";\n\n.github-StatusBarTileController {\n display: inline-block;\n\n &-tooltipMenu {\n &.tooltip {\n width: 400px; // Same as the github-Panel\n padding-left: @component-padding;\n padding-right: @component-padding;\n box-sizing: border-box;\n }\n .tooltip-inner.tooltip-inner {\n padding: @component-padding / 2;\n background-color: @tool-panel-background-color;\n border: 1px solid @base-border-color;\n box-shadow: 0 4px 8px hsla(0, 0, 0, .1);\n color: @text-color;\n }\n &.top .tooltip-arrow.tooltip-arrow {\n width: @component-padding;\n height: @component-padding;\n border-width: 0 0 1px 1px;\n border-color: @base-border-color;\n background-color: @tool-panel-background-color;\n border-bottom-right-radius: 2px;\n transform: rotate(-45deg);\n }\n }\n\n & > .inline-block:hover {\n text-decoration: underline;\n cursor: default;\n }\n\n // Sync animation\n .icon-sync::before {\n @keyframes github-StatusBarSync-animation {\n 100% { transform: rotate(360deg); }\n }\n animation: github-StatusBarSync-animation 2s linear 30; // limit to 1min in case something gets stuck\n }\n\n // Merge conflict icon\n .github-ChangedFilesCount .icon-alert {\n margin-left: @component-padding / 2;\n }\n\n .github-branch-detached {\n color: @text-color-subtle;\n font-style: italic;\n }\n}\n","digest":"0b28811db4a81ee3a9d00e86921d202db079bf80"},"node_modules/github/styles/tabs.less":{"content":"@import \"variables/ui-variables\";\n@import \"variables/syntax-variables\";\n@import \"variables\";\n\n// General Styles\n.github-Tabs {\n &-Panel {\n &.active {\n display: flex;\n }\n\n &.inactive {\n display: none;\n }\n }\n}\n\n// App-specific styles\n.github-Tabs.sidebar-tabs {\n height: 100%;\n display: flex;\n flex-direction: column;\n\n .github-Tabs-NavigationContainer {\n display: flex;\n flex-direction: row;\n padding: @component-padding;\n border-bottom: 1px solid @panel-heading-border-color;\n\n .github-Tabs-NavigationItem {\n flex: 1;\n text-align: center;\n cursor: pointer;\n background-color: @button-background-color;\n color: contrast(@button-background-color, hsla(0,0%,0%,.6), hsla(0,0%,100%,.6));\n border: 1px solid @button-border-color;\n padding: .25em .5em;\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n\n & + .github-Tabs-NavigationItem {\n border-left: none;\n }\n\n &.active {\n background-color: @button-background-color-selected;\n color: contrast(@button-background-color-selected, hsla(0,0%,0%,1), hsla(0,0%,100%,1));\n }\n\n &:first-child {\n border-top-left-radius: @component-border-radius;\n border-bottom-left-radius: @component-border-radius;\n }\n\n &:last-child {\n border-top-right-radius: @component-border-radius;\n border-bottom-right-radius: @component-border-radius;\n }\n }\n\n }\n\n &[data-tabs-count=\"1\"] {\n .github-Tabs-NavigationContainer {\n display: none;\n }\n }\n\n .github-Tabs-PanelContainer {\n flex: 1;\n display: flex;\n flex-direction: column;\n }\n\n .github-Tabs-Panel {\n flex: 1;\n\n &.active {\n }\n\n &.inactive {\n }\n }\n}\n","digest":"99acecab444f511281e3e2d55385a58617bd2ee2"},"node_modules/github/styles/timings-view.less":{"content":"@import \"variables/ui-variables\";\n@import \"variables/syntax-variables\";\n@import \"variables\";\n\n.github-GitTimingsView {\n width: 100%;\n height: 100%;\n overflow: auto;\n\n &-header {\n display: flex;\n justify-content: flex-end;\n padding: @component-padding;\n border-bottom: 1px solid @base-border-color;\n }\n\n .waterfall-widget {\n border-radius: @component-border-radius;\n border: 1px solid @pane-item-border-color;\n background-color: @pane-item-background-color;\n margin: 10px;\n }\n\n .waterfall-header {\n padding: 5px 5px 0 5px;\n color: @text-color;\n font-size: @font-size;\n display: flex;\n border-bottom: 1px solid @pane-item-border-color;\n\n .collapse-toggle {\n cursor: pointer;\n margin-right: 2px;\n }\n\n &-text {\n flex: 1;\n }\n\n &-controls {\n flex-basis: 250px;\n display: flex;\n align-items: center;\n }\n }\n\n .waterfall-export-button {\n margin: 0 10px 3px 0;\n }\n\n .waterfall-scroller {\n overflow: auto;\n }\n\n .waterfall-container {\n position: relative;\n display: inline-block; // stretches to childs width\n min-width: 100%;\n }\n\n .waterfall-time-marker {\n position: absolute;\n height: 100%;\n width: 1px;\n border-left: 1px solid @pane-item-border-color;\n }\n\n .waterfall-timeline {\n position: relative;\n margin: 5px 0;\n }\n\n .waterfall-timeline-label {\n position: absolute;\n padding-left: 5px;\n color: @text-color;\n }\n\n .waterfall-row {\n position: relative;\n min-height: 15px;\n padding: 2px 0;\n\n &:nth-child(2n+1) {\n background-color: @app-background-color;\n }\n\n &:hover {\n background-color: @pane-item-border-color;\n }\n }\n\n .waterfall-row-label {\n position: relative;\n margin: 0 5px;\n white-space: nowrap;\n }\n\n .waterfall-marker {\n position: absolute;\n top: 2px;\n bottom: 2px;\n }\n\n .waterfall-marker-section {\n display: inline-block;\n position: relative;\n height: 100%;\n vertical-align: top;\n }\n}\n","digest":"e35a7ff8f4c72b7ab63447c07b852019f211be3f"},"node_modules/github/styles/user-mention-tooltip.less":{"content":"@import \"variables/ui-variables\";\n@import \"variables/syntax-variables\";\n@import 'variables';\n\n.github-UserMentionTooltip {\n display: flex;\n\n &-avatar {\n flex-basis: 50px;\n padding-right: @component-padding;\n\n > img {\n width: 90px;\n height: 90px;\n border-radius: @component-border-radius / 2;\n }\n }\n\n &-info {\n flex: 1;\n text-align: left;\n line-height: 1.6;\n\n > div {\n white-space: nowrap;\n }\n .icon {\n vertical-align: middle;\n }\n }\n}\n","digest":"dd1c13acecf2cc9a731fd3039a41cd519ad8f7f8"},"node_modules/github/styles/variables.less":{"content":"@import \"variables/ui-variables\";\n@import \"variables/syntax-variables\";\n@import \"ui-variables\";\n@import \"syntax-variables\";\n\n@separator-border-color: contrast(@pane-item-background-color, fade(@pane-item-border-color, 20%), @pane-item-border-color);\n\n@gh-background-color-blue: #006eeb;\n@gh-background-color-light-blue: #dbedff;\n@gh-background-color-yellow: #ffd93d;\n@gh-background-color-red: #dc3545;\n@gh-background-color-purple: #6f42c1;\n@gh-background-color-green: #28a745;\n","digest":"9ee4e4579d5fd51444f9269f6fa5074eda5bd98d"},"node_modules/git-diff/styles/git-diff.less":{"content":"@import \"variables/ui-variables\";\n@import \"variables/syntax-variables\";\n@import \"syntax-variables\";\n@import \"octicon-utf-codes\";\n@import \"octicon-mixins\";\n\natom-text-editor {\n .gutter .line-number {\n &.git-line-modified {\n border-left: 2px solid @syntax-color-modified;\n padding-left: ~\"calc(0.5em - 2px)\";\n }\n\n &.git-line-added {\n border-left: 2px solid @syntax-color-added;\n padding-left: ~\"calc(0.5em - 2px)\";\n }\n\n &.git-line-removed:before {\n @size: 4px;\n\n position: absolute;\n left: 0;\n bottom: -@size;\n height: 0;\n width: 0;\n content: \" \";\n border: solid transparent;\n border-left-color: @syntax-color-removed;\n border-width: @size;\n margin-top: -@size;\n pointer-events: none;\n }\n }\n .gutter.git-diff-icon .line-number {\n width: 100%;\n border-left: none;\n padding-left: 0.4em;\n\n &:before {\n .octicon-font();\n display: inline-block;\n position: relative;\n top: -.05em;\n\n // make sure it doesnt affect the gutter line height.\n height: 0px;\n width: 1em;\n content: \" \";\n padding-right: 0.4em;\n font-size: .95em;\n }\n\n &.git-line-modified:before {\n content: @primitive-dot;\n color: @syntax-color-modified;\n }\n\n &.git-line-added:before {\n content: @plus;\n color: @syntax-color-added;\n }\n\n &.git-line-removed:before {\n border: none; // reset triangle\n content: @dash;\n color: @syntax-color-removed;\n position: relative;\n top: .6em;\n }\n }\n}\n","digest":"6db75eab1b667749742226ec2e39bdb78335c799"},"node_modules/grammar-selector/styles/grammar-selector.less":{"content":"@import \"variables/ui-variables\";\n@import \"variables/syntax-variables\";\n@import \"ui-variables\";\n\n.grammar-status a,\n.grammar-status a:hover {\n color: @text-color;\n}\n","digest":"b23e8d5530f94d34c75f7500027d8dca5a25f02e"},"node_modules/image-view/styles/image-view.less":{"content":"@import \"variables/ui-variables\";\n@import \"variables/syntax-variables\";\n@import \"ui-variables\";\n\n@spacing: @component-padding/2;\n@transparent-background-image: \"atom://image-view/images/transparent-background.png\";\n\n.image-view {\n display: flex;\n flex-direction: column;\n background-color: @pane-item-background-color;\n\n\n // Image Controls -------------------\n\n .image-controls {\n display: flex;\n justify-content: space-between;\n align-items: center;\n flex-wrap: wrap;\n padding: @spacing;\n border-bottom: 1px solid @panel-heading-border-color;\n background-color: @panel-heading-background-color;\n\n a {\n display: inline-block;\n position: relative;\n width: 24px;\n height: 24px;\n margin: @spacing;\n vertical-align: middle;\n font-size: 0;\n border-radius: 22px;\n border: 2px solid #fff;\n box-shadow: inset 0 1px 2px hsla(0,0%,0%,.4), 0 0 0 1px hsla(0,0%,0%,.1), 0 2px 2px hsla(0,0%,0%,.2);\n background-clip: content-box;\n\n &:hover {\n border-color: #ccc;\n }\n &:active {\n border-color: #999;\n }\n }\n\n &-color-white {\n color: #000;\n background-color: #fff;\n background-image: url(@transparent-background-image);\n }\n\n &-color-black {\n color: #fff;\n background-color: #000;\n background-image: url(@transparent-background-image);\n }\n\n .btn-group {\n margin: @spacing;\n }\n\n .reset-zoom-button {\n min-width: 5em;\n }\n\n // disabled once the button is selected\n .zoom-to-fit-button.selected {\n pointer-events: none;\n cursor: default;\n }\n }\n\n\n // Image -------------------\n\n .image-container {\n flex: 1 1 0;\n display: flex;\n overflow: auto;\n\n img {\n flex: none;\n margin: auto;\n }\n }\n\n // Background color\n [background=\"white\"] {\n background-color: white;\n background-image: url(@transparent-background-image);\n }\n [background=\"black\"] {\n background-color: black;\n background-image: url(@transparent-background-image);\n }\n\n\n\n // Zoom to fit -------------------\n // Scales the image to fit the available space.\n\n .zoom-to-fit {\n &.image-container {\n padding: @component-padding;\n\n img {\n flex: 1 1 0;\n min-width: 0;\n margin: 0;\n\n // Alternative: object-fit: contain;\n // then it would also scale larger than its original size\n object-fit: scale-down;\n }\n }\n }\n\n}\n","digest":"b94bb3785de9428c7780f2af2eb49d0eaf7096e1"},"node_modules/incompatible-packages/styles/incompatible-packages.less":{"content":"@import \"variables/ui-variables\";\n@import \"variables/syntax-variables\";\n@import \"ui-variables\";\n\n.incompatible-packages {\n background-color: @pane-item-background-color;\n overflow-y: scroll;\n\n .incompatible-package {\n padding: 15px;\n margin-bottom: 10px;\n border-radius: 6px;\n border: 1px solid #d1d1d2;\n background-color: #fafafa;\n overflow: hidden;\n\n .badge {\n margin-left: 1em;\n }\n\n .heading {\n margin-top: 0px;\n }\n\n ul {\n padding-left: 1em;\n }\n\n li {\n list-style-type: none;\n }\n\n pre {\n margin-top: 2em;\n max-height: 25em;\n overflow: scroll;\n color: @text-color-error;\n }\n }\n}\n\n.incompatible-packages-status {\n padding-left: 2px;\n}\n","digest":"9388e1cd27b0b0fd67e21bdbc809d996b8d27706"},"node_modules/keybinding-resolver/styles/keybinding-resolver.less":{"content":"@import \"variables/ui-variables\";\n@import \"variables/syntax-variables\";\n@import \"ui-variables\";\n@import \"octicon-mixins\";\n\n.key-binding-resolver {\n -webkit-flex: 0.25;\n overflow: auto;\n\n .keystroke {\n margin-right: 1em;\n }\n\n table {\n .used {\n color: @text-color-success;\n }\n\n .unused {\n color: @text-color;\n }\n\n .unmatched {\n color: @text-color-subtle;\n }\n\n .used .command, .unused .command{\n .octicon(check);\n }\n\n .unmatched .command {\n .octicon(x);\n }\n\n .command, .selector, .source {\n min-width: 10em;\n }\n\n .source {\n cursor: pointer;\n }\n }\n}\n","digest":"a25a3b8c740ed552295164442b4ff8d8d1515f52"},"node_modules/markdown-preview/assets/primer-markdown.less":{"content":"@import \"variables/ui-variables\";\n@import \"variables/syntax-variables\";\n// All of our block level items should have the same margin\n@margin: 16px;\n\n// This is styling for generic markdownized text. Anything you put in a\n// container with .markdown-body on it should render generally well. It also\n// includes some GitHub Flavored Markdown specific styling (like @mentions)\n.markdown-body {\n overflow: hidden;\n font-family: \"Helvetica Neue\", Helvetica, \"Segoe UI\", Arial, freesans, sans-serif;\n font-size: 16px;\n line-height: 1.6;\n word-wrap: break-word;\n\n > *:first-child {\n margin-top: 0 !important;\n }\n\n > *:last-child {\n margin-bottom: 0 !important;\n }\n\n // Anchors like <a name=\"examples\">. These sometimes end up wrapped around\n // text when users mistakenly forget to close the tag or use self-closing tag\n // syntax. We don't want them to appear like links.\n // FIXME: a:not(:link):not(:visited) would be a little clearer here (and\n // possibly faster to match), but it breaks styling of <a href> elements due\n // to https://bugs.webkit.org/show_bug.cgi?id=142737.\n a:not([href]) {\n color: inherit;\n text-decoration: none;\n }\n\n // Link Colors\n .absent {\n color: #c00;\n }\n\n .anchor {\n position: absolute;\n top: 0;\n left: 0;\n display: block;\n padding-right: 6px;\n padding-left: 30px;\n margin-left: -30px;\n\n &:focus {\n outline: none;\n }\n }\n\n // Headings\n h1, h2, h3, h4, h5, h6 {\n position: relative;\n margin-top: 1em;\n margin-bottom: @margin;\n font-weight: bold;\n line-height: 1.4;\n\n .octicon-link {\n display: none;\n color: #000;\n vertical-align: middle;\n }\n\n &:hover .anchor {\n padding-left: 8px;\n margin-left: -30px;\n text-decoration: none;\n\n .octicon-link {\n display: inline-block;\n }\n }\n\n tt,\n code {\n font-size: inherit;\n }\n }\n\n h1 {\n padding-bottom: 0.3em;\n font-size: 2.25em;\n line-height: 1.2;\n border-bottom: 1px solid #eee;\n\n .anchor {\n line-height: 1;\n }\n }\n\n h2 {\n padding-bottom: 0.3em;\n font-size: 1.75em;\n line-height: 1.225;\n border-bottom: 1px solid #eee;\n\n .anchor {\n line-height: 1;\n }\n }\n\n h3 {\n font-size: 1.5em;\n line-height: 1.43;\n\n .anchor {\n line-height: 1.2;\n }\n }\n\n h4 {\n font-size: 1.25em;\n\n .anchor {\n line-height: 1.2;\n }\n }\n\n h5 {\n font-size: 1em;\n\n .anchor {\n line-height: 1.1;\n }\n }\n\n h6 {\n font-size: 1em;\n color: #777;\n\n .anchor {\n line-height: 1.1;\n }\n }\n\n p,\n blockquote,\n ul, ol, dl,\n table,\n pre {\n margin-top: 0;\n margin-bottom: @margin;\n }\n\n hr {\n height: 4px;\n padding: 0;\n margin: @margin 0;\n background-color: #e7e7e7;\n border: 0 none;\n }\n\n // Lists, Blockquotes & Such\n ul,\n ol {\n padding-left: 2em;\n\n &.no-list {\n padding: 0;\n list-style-type: none;\n }\n }\n\n // Did someone complain about list spacing? Encourage them\n // to create the spacing with their markdown formatting.\n // List behavior should be controled by the markup, not the css.\n //\n // For lists with padding between items, use blank\n // lines between items. This will generate paragraphs with\n // padding to space things out.\n //\n // - item\n //\n // - item\n //\n // - item\n //\n // For list without padding, don't use blank lines.\n //\n // - item\n // - item\n // - item\n //\n // Modifying the css to emulate these behaviors merely brakes\n // one case in the process of solving another. Don't change\n // this unless it's really really a bug.\n ul ul,\n ul ol,\n ol ol,\n ol ul {\n margin-top: 0;\n margin-bottom: 0;\n }\n\n li > p {\n margin-top: @margin;\n }\n\n dl {\n padding: 0;\n }\n\n dl dt {\n padding: 0;\n margin-top: @margin;\n font-size: 1em;\n font-style: italic;\n font-weight: bold;\n }\n\n dl dd {\n padding: 0 @margin;\n margin-bottom: @margin;\n }\n\n blockquote {\n padding: 0 15px;\n color: #777;\n border-left: 4px solid #ddd;\n\n > :first-child {\n margin-top: 0;\n }\n\n > :last-child {\n margin-bottom: 0;\n }\n }\n\n // Tables\n table {\n display: block;\n width: 100%;\n overflow: auto;\n word-break: normal;\n word-break: keep-all; // For Firefox to horizontally scroll wider tables.\n\n th {\n font-weight: bold;\n }\n\n th, td {\n padding: 6px 13px;\n border: 1px solid #ddd;\n }\n\n tr {\n background-color: #fff;\n border-top: 1px solid #ccc;\n\n &:nth-child(2n) {\n background-color: #f8f8f8;\n }\n }\n }\n\n // Images & Stuff\n img {\n max-width: 100%;\n -moz-box-sizing: border-box;\n box-sizing: border-box;\n }\n\n .emoji {\n max-width: none;\n }\n\n // Gollum Image Tags\n\n // Framed\n span.frame {\n display: block;\n overflow: hidden;\n\n & > span {\n display: block;\n float: left;\n width: auto;\n padding: 7px;\n margin: 13px 0 0;\n overflow: hidden;\n border: 1px solid #ddd;\n }\n\n span img {\n display: block;\n float: left;\n }\n\n span span {\n display: block;\n padding: 5px 0 0;\n clear: both;\n color: #333;\n }\n }\n\n span.align-center {\n display: block;\n overflow: hidden;\n clear: both;\n\n & > span {\n display: block;\n margin: 13px auto 0;\n overflow: hidden;\n text-align: center;\n }\n\n span img {\n margin: 0 auto;\n text-align: center;\n }\n }\n\n span.align-right {\n display: block;\n overflow: hidden;\n clear: both;\n\n & > span {\n display: block;\n margin: 13px 0 0;\n overflow: hidden;\n text-align: right;\n }\n\n span img {\n margin: 0;\n text-align: right;\n }\n }\n\n span.float-left {\n display: block;\n float: left;\n margin-right: 13px;\n overflow: hidden;\n\n span {\n margin: 13px 0 0;\n }\n }\n\n span.float-right {\n display: block;\n float: right;\n margin-left: 13px;\n overflow: hidden;\n\n & > span {\n display: block;\n margin: 13px auto 0;\n overflow: hidden;\n text-align: right;\n }\n }\n\n // Inline code snippets\n code,\n tt {\n padding: 0;\n padding-top: 0.2em;\n padding-bottom: 0.2em;\n margin: 0;\n font-size: 85%;\n background-color: rgba(0,0,0,0.04);\n border-radius: 3px; // don't add padding, gives scrollbars\n\n &:before,\n &:after {\n letter-spacing: -0.2em; // this creates padding\n content: \"\\00a0\";\n }\n\n br { display: none; }\n }\n\n del code { text-decoration: inherit; }\n\n // Code tags within code blocks (<pre>s)\n pre > code {\n padding: 0;\n margin: 0;\n font-size: 100%;\n word-break: normal;\n white-space: pre;\n background: transparent;\n border: 0;\n }\n\n .highlight {\n margin-bottom: @margin;\n }\n\n .highlight pre,\n pre {\n padding: @margin;\n overflow: auto;\n font-size: 85%;\n line-height: 1.45;\n background-color: #f7f7f7;\n border-radius: 3px;\n }\n\n .highlight pre {\n margin-bottom: 0;\n word-break: normal;\n }\n\n pre {\n word-wrap: normal;\n }\n\n pre code,\n pre tt {\n display: inline;\n max-width: initial;\n padding: 0;\n margin: 0;\n overflow: initial;\n line-height: inherit;\n word-wrap: normal;\n background-color: transparent;\n border: 0;\n\n &:before,\n &:after {\n content: normal;\n }\n }\n\n kbd {\n display: inline-block;\n padding: 3px 5px;\n font-size: 11px;\n line-height: 10px;\n color: #555;\n vertical-align: middle;\n background-color: #fcfcfc;\n border: solid 1px #ccc;\n border-bottom-color: #bbb;\n border-radius: 3px;\n box-shadow: inset 0 -1px 0 #bbb;\n }\n}\n","digest":"34042e121a602019f7f5984cacf079bd171c002c"},"node_modules/markdown-preview/styles/markdown-preview-default.less":{"content":"@import \"variables/ui-variables\";\n@import \"variables/syntax-variables\";\n\n// Default Markdown Preview styles\n\n// These are the default Markdown Preview styles.\n// They use the syntax-variables to adapt to the color scheme of syntax themes.\n\n\n@import \"syntax-variables\";\n\n.markdown-preview:not([data-use-github-style]) {\n\n @fg: @syntax-text-color;\n @bg: @syntax-background-color;\n\n @fg-accent: @syntax-cursor-color;\n @fg-strong: contrast(@bg, darken(@fg, 32%), lighten(@fg, 32%));\n @fg-subtle: contrast(@fg, lighten(@fg, 16%), darken(@fg, 16%));\n\n @border: contrast(@bg, lighten(@bg, 16%), darken(@bg, 16%));\n\n @margin: 1.5em;\n\n\n padding: 2em;\n font-size: 1.2em;\n color: @fg;\n background-color: @bg;\n overflow: auto;\n\n & > :first-child {\n margin-top: 0;\n }\n\n\n // Headings --------------------\n\n h1, h2, h3, h4, h5, h6 {\n line-height: 1.2;\n margin-top: @margin;\n margin-bottom: @margin/3;\n color: @fg-strong;\n }\n\n h1 { font-size: 2.4em; font-weight: 300; }\n h2 { font-size: 1.8em; font-weight: 400; }\n h3 { font-size: 1.5em; font-weight: 500; }\n h4 { font-size: 1.2em; font-weight: 600; }\n h5 { font-size: 1.1em; font-weight: 600; }\n h6 { font-size: 1.0em; font-weight: 600; }\n\n\n // Emphasis --------------------\n\n strong {\n color: @fg-strong;\n }\n\n del {\n color: @fg-subtle;\n }\n\n\n // Link --------------------\n\n a,\n a code {\n color: @fg-accent;\n }\n\n\n // Images --------------------\n\n img {\n max-width: 100%;\n }\n\n\n // Paragraph --------------------\n\n & > p {\n margin-top: 0;\n margin-bottom: @margin;\n }\n\n\n // List --------------------\n\n & > ul,\n & > ol {\n margin-bottom: @margin;\n }\n\n\n // Blockquotes --------------------\n\n blockquote {\n margin: @margin 0;\n font-size: inherit;\n color: @fg-subtle;\n border-color: @border;\n border-width: 4px;\n }\n\n\n // HR --------------------\n\n hr {\n margin: @margin*2 0;\n border-top: 2px dashed @border;\n background: none;\n }\n\n\n // Table --------------------\n\n table {\n margin: @margin 0;\n }\n\n th {\n color: @fg-strong;\n }\n\n th,\n td {\n padding: .66em 1em;\n border: 1px solid @border;\n }\n\n\n // Code --------------------\n\n code {\n color: @fg-strong;\n background-color: contrast(@syntax-background-color, lighten(@syntax-background-color, 8%), darken(@syntax-background-color, 6%));\n }\n\n atom-text-editor {\n margin: @margin 0;\n padding: 1em;\n font-size: .92em;\n border-radius: 3px;\n background-color: contrast(@syntax-background-color, lighten(@syntax-background-color, 4%), darken(@syntax-background-color, 4%));\n }\n\n\n // KBD --------------------\n\n kbd {\n color: @fg-strong;\n border: 1px solid @border;\n border-bottom: 2px solid darken(@border, 6%);\n background-color: contrast(@syntax-background-color, lighten(@syntax-background-color, 8%), darken(@syntax-background-color, 6%));\n }\n\n}\n","digest":"a812c45bf13bc5cfb9b4050eb8eb9214071ab015"},"node_modules/markdown-preview/styles/markdown-preview-github.less":{"content":"@import \"variables/ui-variables\";\n@import \"variables/syntax-variables\";\n\n// GitHub.com styles\n\n// These are the GitHub Flavored Markdown styles also found on github.com.\n// They can be anabled in the markdown-preview settings by turning on \"Use GitHub.com styles\".\n\n\n@import (reference) \"../assets/primer-markdown\";\n\n.markdown-preview[data-use-github-style] {\n\n // Includes GitHub.com styles from `../assets/primer-markdown.less`.\n // Source: https://github.com/primer/markdown/blob/master/components/markdown.scss\n .markdown-body();\n\n\n // The styles below override/complement the GitHub.com styles\n // It's needed because some markup or global styles are different\n padding: 30px;\n font-size: 16px;\n color: #333;\n background-color: #fff;\n overflow: scroll;\n\n a {\n color: #337ab7;\n }\n\n code {\n color: inherit;\n }\n\n atom-text-editor {\n padding: .8em 1em;\n margin-bottom: 1em;\n font-size: .85em;\n border-radius: 4px;\n overflow: auto;\n }\n}\n","digest":"07fc65e213bb99fa0b8d24962b645fb170850a69"},"node_modules/markdown-preview/styles/markdown-preview.less":{"content":"@import \"variables/ui-variables\";\n@import \"variables/syntax-variables\";\n\n// Global Markdown Preview styles\n\n.markdown-preview {\n atom-text-editor {\n // only show scrollbars on hover\n .scrollbars-visible-always & {\n .vertical-scrollbar,\n .horizontal-scrollbar {\n visibility: hidden;\n }\n }\n .scrollbars-visible-always &:hover {\n .vertical-scrollbar,\n .horizontal-scrollbar {\n visibility: visible;\n }\n }\n }\n\n // move task list checkboxes\n .task-list-item-checkbox {\n position: absolute;\n margin: .25em 0 0 -1.4em;\n }\n}\n\n.markdown-spinner {\n margin: auto;\n background-image: url(images/octocat-spinner-128.gif);\n background-repeat: no-repeat;\n background-size: 64px;\n background-position: top center;\n padding-top: 70px;\n text-align: center;\n}\n","digest":"61743ae59cf2dd4caf7f148985be6bccc3d74d0a"},"node_modules/notifications/styles/notifications-log.less":{"content":"@import \"variables/ui-variables\";\n@import \"variables/syntax-variables\";\n@import \"ui-variables\";\n@import \"octicon-mixins\";\n\n@icon-size: 30px;\n@font-family-monospace: Consolas, \"Liberation Mono\", Menlo, Courier, monospace;\n\n.notifications-log {\n display: flex;\n flex-direction: column;\n min-width: 200px;\n\n header {\n flex: none;\n background-color: @base-background-color;\n border-bottom: 1px solid @base-border-color;\n\n .notification-type {\n border: none;\n width: @icon-size;\n height: @icon-size;\n margin: 1px;\n padding: 0;\n color: @text-color-subtle;\n opacity: .5;\n background: @base-background-color;\n }\n }\n\n .notifications-log-items {\n flex: auto;\n list-style: none;\n padding: 0;\n margin: 0;\n overflow: auto;\n\n .notifications-log-item {\n display: flex;\n box-sizing: content-box; // Keep spacing even\n border-bottom: 1px solid @base-border-color;\n max-height: @icon-size;\n overflow: hidden;\n\n .notifications-log-notification {\n flex: auto;\n display: flex;\n position: relative;\n padding-left: @icon-size;\n overflow: hidden;\n\n &.icon:before {\n position: absolute;\n top: 0;\n left: 0;\n bottom: 0;\n width: @icon-size;\n height: 100%;\n padding-top: @component-padding/2;\n text-align: center;\n }\n\n .message {\n flex: 0 1 auto;\n word-wrap: break-word;\n padding: @component-padding/2 @component-padding;\n border-left: 1px solid @base-border-color;\n }\n\n .btn-toolbar {\n flex: 1 0 auto;\n display: flex;\n align-items: center;\n white-space: nowrap;\n\n &:empty {\n display: none;\n }\n\n .btn-copy-report {\n vertical-align: middle;\n margin-left: @component-padding/2;\n\n &::before {\n margin: 0;\n }\n }\n }\n }\n\n .timestamp {\n flex: 0 0 auto;\n white-space: nowrap;\n text-align: center;\n line-height: @icon-size;\n padding: 0 @component-padding;\n }\n }\n }\n\n}\n\n// Types -------------------------------\n\n.notifications-log {\n\n // fatal\n .notification-type.fatal {\n .type(@text-color-error; @background-color-error);\n }\n\n .hide-fatal li.fatal {\n display: none;\n }\n\n .notifications-log-notification.fatal {\n .log(@text-color-error; @background-color-error);\n }\n\n // error\n .notification-type.error {\n .type(@text-color-error; @background-color-error);\n }\n\n .hide-error li.error {\n display: none;\n }\n\n .notifications-log-notification.error {\n .log(@text-color-error; @background-color-error);\n }\n\n // warning\n .notification-type.warning {\n .type(@text-color-warning; @background-color-warning);\n }\n\n .hide-warning li.warning {\n display: none;\n }\n\n .notifications-log-notification.warning {\n .log(@text-color-warning; @background-color-warning);\n }\n\n // info\n .notification-type.info {\n .type(@text-color-info; @background-color-info);\n }\n\n .hide-info li.info {\n display: none;\n }\n\n .notifications-log-notification.info {\n .log(@text-color-info; @background-color-info);\n }\n\n // success\n .notification-type.success {\n .type(@text-color-success; @background-color-success);\n }\n\n .hide-success li.success {\n display: none;\n }\n\n .notifications-log-notification.success {\n .log(@text-color-success; @background-color-success);\n }\n\n}\n\n// Type Mixin\n\n.type(@txt; @bg) {\n &.show-type {\n color: @txt;\n opacity: 1;\n }\n}\n\n.log(@txt; @bg) {\n .message {\n color: lighten(@txt, 0%);\n }\n\n &.icon:before {\n color: @txt;\n }\n}\n","digest":"547af188df482ab9d735154eec4177e43955bae6"},"node_modules/notifications/styles/notifications.less":{"content":"@import \"variables/ui-variables\";\n@import \"variables/syntax-variables\";\n@import \"ui-variables\";\n@import \"octicon-mixins\";\n\n@icon-size: 30px;\n@width: 450px;\n@width-detail: 450px;\n@max-height-message: 200px;\n@max-height-detail: 500px;\n@max-height: @max-height-message + @max-height-detail + 100px; // 100px for footer. This is only used for the closing animation\n@notification-gap: 2px;\n@font-family-monospace: Consolas, \"Liberation Mono\", Menlo, Courier, monospace;\n\natom-notifications {\n display: block;\n z-index: 1000; // TODO: Have some convention about z-index stacking\n position: absolute;\n top: 35px;\n right: 0;\n bottom: 0;\n padding: @component-padding;\n font-size: 1.2em;\n overflow-x: hidden;\n overflow-y: auto;\n pointer-events: none;\n &::-webkit-scrollbar {\n display: none;\n }\n\n atom-notification {\n .close-all {\n display: none;\n }\n }\n\n atom-notification:first-child {\n .close-all {\n display: block;\n }\n .message {\n padding-right: @component-padding * 2 + 95px; // space for icon and button\n }\n }\n\n atom-notification:only-child {\n .close-all {\n display: none;\n }\n .message {\n padding-right: inherit;\n }\n &.has-close .message {\n padding-right: @component-padding + 24px; // space for icon\n }\n }\n\n atom-notification {\n float: right;\n clear: right;\n position: relative;\n width: @width;\n padding-left: @icon-size;\n margin-bottom: @notification-gap;\n max-height: @max-height;\n word-wrap: break-word;\n pointer-events: auto;\n\n &.icon:before {\n position: absolute;\n top: 0;\n left: 0;\n width: @icon-size;\n height: 100%;\n padding-top: @component-padding;\n text-align: center;\n border-radius: @component-border-radius 0 0 @component-border-radius;\n }\n\n\n // fill space between notifiactions to prevent click throughs\n &:after {\n content: \"\";\n display: block;\n position: absolute;\n left: 0;\n right: 0;\n bottom: -@notification-gap;\n height: @notification-gap;\n }\n\n .meta,\n .close,\n .detail,\n .stack-toggle,\n .stack-container {\n display: none;\n }\n\n &.fatal .meta,\n &.has-description .meta,\n &.has-buttons .meta,\n &.has-close .close,\n &.has-detail .detail,\n &.has-stack .stack-toggle,\n &.has-stack .stack-container {\n display: block;\n }\n\n // .item's are used as general containers\n .item {\n padding: @component-padding;\n border-top: 1px solid hsla(0,0%,0%,.1);\n &.message {\n border-top: none;\n p:last-child {\n margin-bottom: 0;\n }\n }\n }\n\n &.has-close .message {\n padding-right: @component-padding + 24px; // space for icon\n }\n\n .content {\n border-radius: 0 @component-border-radius @component-border-radius 0;\n }\n\n .message {\n max-height: @max-height-message;\n overflow-y: auto;\n }\n\n .close-all.btn {\n position: absolute;\n top: 7px;\n right: 38px;\n background: none;\n }\n\n .close {\n position: absolute;\n top: 0;\n right: 0;\n width: 38px;\n height: 38px;\n line-height: 38px;\n text-align: center;\n font-size: 16px;\n text-shadow: none;\n color: black;\n opacity: .4;\n &:hover, &:focus {\n opacity: 1;\n }\n &:active {\n opacity: .2;\n }\n &:before {\n margin: 0;\n }\n }\n\n &.has-detail {\n width: @width-detail;\n }\n\n .detail {\n font-size: .8em;\n background-color: hsla(0,0%,100%,.3);\n background-clip: padding-box;\n max-height: @max-height-detail;\n overflow-y: auto;\n\n .line {\n font-family: @font-family-monospace;\n }\n\n .stack-toggle {\n margin-top: @component-padding;\n\n .icon:before {\n margin: 0;\n }\n }\n\n .detail-content {\n .line {\n white-space: pre-wrap;\n }\n }\n\n .stack-container {\n margin-top: @component-padding;\n\n .line {\n white-space: pre;\n }\n }\n }\n\n .description {\n font-size: .8em;\n\n p:last-child {\n margin-bottom: 0;\n }\n }\n\n .btn-toolbar.btn-toolbar {\n margin-top: 10px;\n margin-bottom: -5px;\n margin-left: 0;\n }\n\n .btn-toolbar.btn-toolbar > .btn {\n margin-left: 0;\n margin-bottom: 5px;\n }\n\n .btn-copy-report {\n vertical-align: middle;\n }\n\n .opening {\n cursor: progress;\n }\n }\n}\n\n// Types -------------------------------\n\natom-notifications {\n atom-notification.fatal {\n .notification(@text-color-error; @background-color-error);\n }\n\n atom-notification.error {\n .notification(@text-color-error; @background-color-error);\n }\n\n atom-notification.warning {\n .notification(@text-color-warning; @background-color-warning);\n }\n\n atom-notification.info {\n .notification(@text-color-info; @background-color-info);\n }\n\n atom-notification.success {\n .notification(@text-color-success; @background-color-success);\n }\n}\n\n\n// Mixins -------------------------------\n\n.notification(@txt; @bg) {\n\n .content {\n color: darken(@txt, 40%);\n background-color: lighten(@bg, 25%);\n }\n\n a {\n color: darken(@txt, 20%);\n }\n\n code {\n color: darken(@txt, 40%);\n background-color: desaturate(lighten(@bg, 18%), 5%);\n }\n\n &.icon:before {\n color: lighten(@bg, 36%);\n background-color: @bg;\n }\n\n .close-all.btn {\n border: 1px solid fadeout(darken(@txt, 40%), 70%);\n color: fadeout(darken(@txt, 40%), 40%);\n text-shadow: none;\n\n &:hover {\n background: none;\n border-color: fadeout(darken(@txt, 40%), 20%);\n color: darken(@txt, 40%);\n }\n }\n}\n\n\n// Animations -------------------------------\n\natom-notifications atom-notification {\n -webkit-animation: notification-show .16s cubic-bezier(0.175, 0.885, 0.32, 1.27499);\n\n &[type=\"fatal\"] {\n -webkit-animation: notification-show .16s cubic-bezier(0.175, 0.885, 0.32, 1.27499),\n notification-shake 4s 2s;\n -webkit-animation-iteration-count: 1, 3; // shake 3 times after showing\n &:hover {\n -webkit-animation-play-state: paused; // stop shaking when hovering\n }\n }\n\n &.remove,\n &.remove:hover {\n -webkit-animation: notification-hide .12s cubic-bezier(.34,.07,1,.2),\n notification-shrink .24s .12s cubic-bezier(0.5, 0, 0, 1);\n -webkit-animation-fill-mode: forwards;\n }\n}\n\n@-webkit-keyframes notification-show {\n 0% { opacity: 0; transform: perspective(@width) translate(0, -@icon-size) rotateX(90deg); }\n 100% { opacity: 1; transform: perspective(@width) translate(0, 0) rotateX( 0deg); }\n}\n\n@-webkit-keyframes notification-hide {\n 0% { opacity: 1; transform: scale( 1); }\n 100% { opacity: 0; transform: scale(.8); }\n}\n\n@-webkit-keyframes notification-shrink {\n 0% { opacity: 0; max-height: @max-height; transform: scale(.8); }\n 100% { opacity: 0; max-height: 0; transform: scale(.8); }\n}\n\n@-webkit-keyframes notification-shake {\n 0% { transform: translateX( 0); }\n 2% { transform: translateX(-4px); }\n 4% { transform: translateX( 8px); }\n 6% { transform: translateX(-4px); }\n 8% { transform: translateX( 0); }\n 100% { transform: translateX( 0); }\n}\n","digest":"3a911249ddafbc4e8508a8e05d86a11a613f6f21"},"node_modules/package-generator/styles/package-generator.less":{"content":"@import \"variables/ui-variables\";\n@import \"variables/syntax-variables\";\n.package-generator .error {\n display: none;\n}","digest":"4cd559f40d4bb3277680a5502a5179654fded2b1"},"node_modules/settings-view/styles/package-card.less":{"content":"@import \"variables/ui-variables\";\n@import \"variables/syntax-variables\";\n@import \"octicon-mixins\";\n@import \"ui-variables\";\n@import \"variables\";\n\n.settings-view {\n\n // TODO: Somehow unify the \"card\".\n\n .package-card {\n padding: @component-padding*1.5;\n margin-bottom: @component-padding;\n list-style-type: none;\n font-size: 1.2em;\n border-radius: @component-border-radius*2;\n border: 1px solid @base-border-color;\n background-color: @package-card-background-color;\n overflow: hidden;\n cursor: pointer;\n -webkit-user-select: none;\n\n &:hover {\n background-color: contrast(@package-card-background-color, darken(@package-card-background-color, 2%), lighten(@package-card-background-color, 2%));\n }\n &:active {\n background-color: @package-card-background-color;\n }\n\n &.disabled {\n background-color: @package-card-disabled-background-color;\n .body,\n .avatar,\n .author,\n .stats {\n opacity: .5;\n }\n }\n\n &.deprecated, {\n background-color: @package-card-disabled-background-color;\n // .body,\n .avatar,\n .author,\n .stats {\n opacity: .5;\n }\n }\n\n .deprecation-badge {\n display: none;\n font-size: .75em;\n text-transform: uppercase;\n }\n\n &.deprecated .deprecation-badge {\n display: inline;\n }\n\n &.col-lg-4 {\n min-width: 190px;\n padding: @component-padding 0;\n padding-left: @component-padding;\n padding-right: @component-padding;\n }\n\n .thumbnail {\n border-radius: 3px;\n margin: 0;\n min-height: 140px;\n color: @text-color;\n border-radius: @component-border-radius*2;\n border: 1px solid @base-border-color;\n background-color: @package-card-background-color;\n\n .caption {\n width: 100%;\n position: relative;\n }\n }\n .package-name {\n font-weight: bolder;\n color: @text-color-highlight;\n }\n\n .package-version {\n font-size: .8em\n }\n\n .description {\n color: @text-color;\n overflow: hidden;\n min-height: 38px;\n max-height: 38px;\n text-overflow: ellipsis;\n display: -webkit-box;\n -webkit-line-clamp: 2; /* number of lines to show */\n -webkit-box-orient: vertical;\n }\n\n .package-message p:last-child {\n margin: 0;\n }\n\n .downloads {\n color: @text-color-highlight;\n overflow: hidden;\n text-overflow: ellipsis;\n display: -webkit-box;\n -webkit-line-clamp: 1; /* number of lines to show */\n -webkit-box-orient: vertical;\n }\n\n .package-status {\n right: 0px;\n top: 5px;\n text-align: center;\n\n &.icon-cloud-download {\n color: #428bca;\n }\n\n &.icon-check {\n color: #6CC644;\n }\n\n &.icon-alert {\n color: #BD2C00;\n }\n }\n\n .card-name {\n font-weight: 300;\n margin: 0 0 .2em 0;\n font-size: 1.2em;\n line-height: 1.4;\n\n .css-truncate-target {\n color: $greenDark;\n }\n }\n\n .stats {\n\n .stats-item {\n margin-left: @component-padding*1.5;\n height: 26px;\n display: inline-block;\n line-height: 24px;\n vertical-align: top;\n\n .icon {\n color: @text-color-subtle;\n }\n }\n\n .star-box {\n display: inline-block;\n vertical-align: top;\n\n .star-button {\n padding: 0 6px;\n\n .octicon {\n margin-right: 0px;\n }\n }\n }\n }\n\n .body {\n .css-truncate-target {\n max-width: 100%;\n }\n }\n\n .package-description {\n white-space: normal;\n line-height: 1.4;\n }\n\n .meta {\n display: flex;\n flex-wrap: wrap;\n justify-content: flex-end;\n width: 100%;\n\n a.linked-octicon {\n text-decoration: none;\n\n &:hover {\n .octicon {\n color: $greenDark;\n }\n\n .value {\n color: $greenDark;\n }\n }\n }\n\n .action {\n border-radius: 3px;\n padding: 3px 6px;\n\n &:hover {\n background-color: #eaeaea;\n }\n }\n\n .value {\n color: #999;\n }\n }\n\n .meta-user {\n flex: 1 0 auto;\n margin-top: @component-padding;\n margin-right: @component-padding;\n\n .avatar {\n border-radius: @component-border-radius;\n height: 24px;\n width: 24px;\n display: inline-block;\n vertical-align: middle;\n background-color: hsla(0,0%,0%,.1);\n }\n\n .author {\n color: @text-color-subtle;\n margin-left: @component-padding;\n &:focus {\n outline: none;\n }\n }\n }\n\n .meta-controls {\n margin-top: @component-padding/2;\n\n .install-button.is-installing,\n .uninstall-button.is-uninstalling {\n opacity: 1; // override disabled style\n background-image: linear-gradient(to right, transparent 50%, hsla(0,0%,0%,.15) 50%);\n background-size: 10px 100%;\n -webkit-animation: available-package-is-installing .5s linear infinite;\n }\n\n .status-indicator {\n padding: 0;\n width: @component-padding/2;\n min-width: 4px;\n pointer-events: none;\n transition: background .4s;\n background: @background-color-success;\n &.is-disabled {\n background: @background-color-warning;\n }\n }\n\n .btn-toolbar > .btn-group {\n float: left;\n margin: @component-padding/2 0 0 @component-padding/2;\n }\n }\n\n .meta-lower {\n padding: 13px;\n background-color: @input-background-color;\n line-height: 1;\n }\n\n &.blank-slate {\n text-align: center;\n color: $beigeDark;\n height: 132px;\n line-height: 132px;\n }\n\n // End copy-paste from atom.io\n }\n\n // Remove hover styles if it's in a detail view\n .package-detail .package-card {\n cursor: default;\n &:hover {\n background-color: @package-card-background-color;\n }\n &.disabled {\n background-color: @package-card-disabled-background-color;\n }\n }\n\n}\n\n@-webkit-keyframes available-package-is-installing {\n 100% { background-position: -10px 0px; }\n}\n","digest":"90620b6b73a187e587ca81213560a13c3fe0e55c"},"node_modules/settings-view/styles/package-readme.less":{"content":"@import \"variables/ui-variables\";\n@import \"variables/syntax-variables\";\n// Package README\n\n@import \"ui-variables\";\n\n.settings-view {\n\n .package-readme {\n font-size: 1.25em;\n\n h1 { font-size: 2em; margin-top: 1.5em; }\n h2 { font-size: 1.75em; margin-top: 1.5em; }\n h3 { font-size: 1.5em; margin-top: 1.75em; }\n h4 { font-size: 1.25em; margin-top: 1.25em; }\n h1, h2, h3, h4 {\n color: @text-color-highlight;\n }\n\n a {\n color: @text-color-info;\n }\n\n hr {\n border-color: @text-color-subtle;\n }\n\n blockquote {\n border-left-color: @text-color-subtle;\n }\n\n pre {\n margin-bottom: 1em;\n }\n\n img {\n max-width: 100%;\n }\n\n table {\n display: block;\n margin-bottom: 1em;\n width: 100%;\n overflow: auto;\n word-break: normal;\n\n th {\n font-weight: bold;\n text-align: center;\n }\n\n th, td {\n padding: 6px 13px;\n border: 1px solid @base-border-color;\n }\n\n tr {\n border-top: 1px solid @base-border-color;\n background-color: @base-background-color;\n &:nth-child(2n) {\n background-color: @background-color-highlight;\n }\n }\n }\n\n kbd {\n display: inline-block;\n padding: .3em .4em;\n font-size: .8em;\n line-height: 1;\n color: @text-color-highlight;\n vertical-align: middle;\n background-color: lighten(@base-background-color, 10%);\n border: solid 1px @base-border-color;\n border-bottom-color: darken(@base-border-color, 10%);\n border-radius: @component-border-radius;\n box-shadow: inset 0 -1px 0 darken(@base-border-color, 10%);\n }\n\n }\n}\n","digest":"c7aecf94bf4c4229b6d83d8b0f913cc9bfb46231"},"node_modules/settings-view/styles/settings-view.less":{"content":"@import \"variables/ui-variables\";\n@import \"variables/syntax-variables\";\n@import \"octicon-mixins\";\n@import \"octicon-utf-codes\";\n@import \"ui-variables\";\n\n@section-padding: 4 * @component-padding;\n@breadcrumb-padding: 2 * @component-padding;\n\n.settings-view {\n display: flex;\n overflow: auto;\n\n .breadcrumb {\n margin-bottom: 0;\n padding: @breadcrumb-padding;\n font-size: 1.2em;\n color: @text-color-subtle;\n list-style: none;\n\n > li {\n display: inline-block;\n a {\n color: @text-color;\n }\n\n + li:before {\n content: \"/\\00a0\"; // Unicode space added since inline-block means non-collapsing white-space\n padding: 0 5px;\n }\n }\n\n > .active a {\n color: @text-color-highlight;\n }\n\n }\n\n .text {\n color: @text-color;\n }\n\n .alert-type(@tx; @bg) {\n @alert-background-color: mix(@bg, @base-background-color, 10%);\n color: contrast(@alert-background-color, darken(@tx, 20%), lighten(@tx, 20%) );\n border-color: darken(@alert-background-color, 10%);\n background-color: @alert-background-color;\n\n .alert-link {\n color: inherit;\n text-decoration: underline;\n }\n }\n\n .alert-info { .alert-type(@text-color-info; @background-color-info); }\n .alert-success { .alert-type(@text-color-success; @background-color-success); }\n .alert-warning { .alert-type(@text-color-warning; @background-color-warning); }\n .alert-error,\n .alert-danger { .alert-type(@text-color-error; @background-color-error); }\n\n\n .error-message {\n .alert {\n margin-bottom: 0;\n }\n\n .close {\n top: -6px; // magic number... for now\n }\n\n .error-details {\n .alert-type(@text-color-error; @background-color-error);\n }\n\n .error-link {\n color: inherit;\n text-decoration: underline;\n margin-left: @component-padding/2;\n }\n }\n\n select.form-control {\n color: @text-color;\n border-color: @button-border-color;\n background-color: @button-background-color;\n &:hover,\n &:focus {\n box-shadow: none;\n background-color: @button-background-color-hover;\n }\n }\n\n .select-container {\n display: flex;\n align-items: stretch;\n }\n\n .themes-picker-item .btn {\n margin-left: 2px;\n &::before {\n margin-right: 0;\n text-align: left;\n }\n }\n\n .checkbox {\n padding-left: 2.25em;\n label {\n padding-left: 0;\n display: block;\n }\n .setting-title {\n display: inline-block;\n }\n }\n input[type=\"checkbox\"] {\n margin: 0 .75em 0 -2.25em;\n }\n\n .color {\n padding-left: 5em;\n .setting-title {\n margin-top: .15em;\n }\n }\n input[type=\"color\"] {\n float: left;\n margin: 0 0 0 -5em;\n padding: 0;\n width: 4em;\n height: 1.6em;\n border-radius: 4px;\n border: 1px solid @base-border-color;\n background: darken(@base-background-color, 2%);\n &::-webkit-color-swatch-wrapper {\n padding: 2px;\n margin: 0;\n border-radius: inherit;\n }\n &::-webkit-color-swatch {\n border-radius: 2px;\n border: 1px solid hsla(0,0%,0%,.1);\n }\n }\n\n .editor-container {\n margin: @component-padding*2 0;\n &:last-child {\n margin-bottom: 0;\n }\n &.settings-filter {\n margin-bottom: 36px;\n }\n }\n\n .section {\n padding: @section-padding;\n border-top: 1px solid @base-border-color;\n &:first-child,\n &:last-child {\n padding: @section-padding;\n }\n &.section:empty {\n padding: 0;\n border-top: none;\n }\n\n atom-text-editor[mini] {\n opacity: .75;\n .selection .region {\n background-color: contrast(@input-background-color, lighten(@input-background-color, 8%), darken(@input-background-color, 8%) );\n }\n }\n\n atom-text-editor[mini].is-focused {\n opacity: 1;\n .selection .region {\n background-color: contrast(@input-background-color, lighten(@input-background-color, 12%), darken(@input-background-color, 12%) );\n }\n }\n }\n\n div > .package-detail section.section.settings-panel {\n border-top: 1px solid @base-border-color;\n }\n\n .section-container {\n width: 100%;\n max-width: 800px;\n\n &.updates-container {\n .package-container {\n > .row {\n margin-left: -@component-padding;\n margin-right: -@component-padding;\n }\n }\n .native-key-bindings, .alert-info {\n margin-bottom: 15px;\n }\n }\n }\n\n section .section-heading,\n .section .section-heading {\n margin-bottom: @component-padding*2;\n color: @text-color-highlight;\n font-size: 1.75em;\n font-weight: bold;\n line-height: 1;\n -webkit-user-select: none;\n cursor: default;\n }\n\n .sub-section-heading.icon:before,\n .section-heading.icon:before {\n margin-right: @component-padding*.8;\n }\n\n .section-heading-count {\n margin-left: .5em;\n }\n\n .section-body {\n margin-top: 20px;\n }\n\n .sub-section {\n margin: @section-padding 0;\n\n .sub-section-heading {\n color: @text-color-highlight;\n font-size: 1.4em;\n font-weight: bold;\n line-height: 1;\n -webkit-user-select: none;\n\n &.has-items {\n cursor: pointer;\n\n &::after {\n .icon(16px);\n content: @fold;\n position: absolute;\n right: 0;\n color: @text-color-subtle;\n }\n\n &:hover:after {\n color: @text-color-highlight;\n }\n }\n }\n\n .sub-section-body {\n margin-top: 20px;\n }\n\n &.collapsed {\n .sub-section-heading:after {\n content: @unfold;\n }\n .package-container .package-card,\n .sub-section-body .control-group {\n display: none !important;\n }\n }\n }\n\n .control-label {\n -webkit-user-select: none;\n cursor: default;\n }\n\n .setting-title {\n font-size: 1.2em;\n -webkit-user-select: none;\n }\n\n .setting-description {\n color: @text-color-subtle;\n -webkit-user-select: none;\n cursor: default;\n\n &:empty {\n display: none;\n }\n }\n\n .link {\n color: @text-color-info;\n\n &:hover, &:focus {\n color: lighten(@text-color-info, 4%);\n }\n }\n\n .config-menu {\n flex: 1.6;\n min-width: 180px;\n max-width: 240px;\n -webkit-user-select: none;\n user-select: none;\n padding-top: @component-padding;\n background-color: lighten(@base-background-color, 2%);\n border-right: 1px solid @base-border-color;\n overflow-x: auto;\n\n .icon:before {\n text-align: center;\n }\n\n .panels-packages{\n flex-grow: 1;\n overflow: auto;\n height: 0;\n\n li + li {\n margin-top: 0;\n }\n\n li > a {\n border-radius: 1px !important;\n padding: 12px 14px;\n font-weight: bold;\n line-height: 16px;\n opacity: .85;\n transition: opacity .1s ease-in;\n box-shadow: inset 0 -1px 0 rgba(0,0,0, 7%);\n\n &:hover {\n opacity: 1;\n box-shadow: inset 0 -1px 0 rgba(0,0,0, 7%) !important;\n }\n }\n\n li:first-child {margin-top:2px;}\n li:last-child {margin-bottom: 10px;}\n\n li.active a, li.active a:hover {\n opacity: 1;\n box-shadow: 0 0 0 1px darken(#3c76dd, 10%) !important;\n\n .package-author, .package-version {\n color: #fff;\n opacity: .6;\n }\n }\n\n .package-version {\n line-height: 16px;\n margin-left: 5px;\n font-weight: normal;\n color: #999;\n }\n\n .package-author {\n font-weight: normal;\n display: block;\n color: #999;\n }\n }\n\n .button-area {\n margin: 15px; // same as nav\n > .btn {\n width: 100%;\n }\n }\n\n .nav > li {\n margin-top: 0;\n > a {\n border-radius: 0;\n white-space: nowrap;\n\n &:hover {\n color: @text-color-highlight;\n background-color: @background-color-highlight;\n }\n }\n }\n\n .nav > li.active > a {\n color: @text-color-selected;\n background-color: @background-color-selected;\n }\n }\n\n .panels {\n flex: 8.4;\n flex-flow: column;\n display: flex;\n position: relative;\n min-width: 0;\n\n .panels-item {\n flex: 1;\n min-width: 372px; // magic number: fit the Settings, Uninstall and Disable button\n overflow: auto;\n }\n }\n\n .settings-panel {\n label {\n color: @text-color;\n }\n\n .control-group + .control-group {\n margin-top: 1.5em;\n }\n\n .control-group .editor-container {\n margin: 0;\n }\n\n .grammar-filetypes {\n margin-top: @component-padding;\n }\n }\n\n .package-detail-view {\n .package-keymap-table,\n .package-grammars-table,\n .package-snippets-table {\n padding-top: @component-padding;\n padding-left: @component-padding;\n\n td {\n white-space: nowrap;\n }\n\n .snippet-body,\n .snippet-prefix {\n font-family: monospace;\n }\n }\n\n .update-message {\n padding-right: @component-padding;\n }\n\n .link {\n width: -webkit-fit-content; // prevents hover area being full-width\n }\n\n .link,\n .text {\n margin: 0 15px @component-padding 15px;\n }\n\n .update-link,\n .repo-link {\n &:hover {\n cursor: pointer;\n text-decoration: underline;\n }\n }\n }\n\n .themes-panel {\n .control-group {\n margin-top: @component-padding*3;\n }\n .themes-picker {\n display: flex;\n flex-wrap: wrap;\n margin: 0 -@component-padding;\n }\n .themes-picker-item {\n flex: 1;\n min-width: 320px; // Enough for the UI Theme description\n padding: 0 @component-padding;\n }\n }\n\n .packages {\n display: flex;\n flex-flow: column;\n\n .themes-label {\n font-size: 1.25em;\n font-weight: bold;\n }\n\n .theme-chooser {\n padding-top: @component-padding*2;\n }\n\n .theme-description {\n -webkit-user-select: none;\n cursor: default;\n }\n\n .package-container {\n width: 100%;\n }\n\n .search-container {\n display: flex;\n flex-wrap: wrap;\n margin: 0 -@component-padding/2;\n padding-top: @component-padding*1.5;\n\n\n .editor-container {\n flex: 1;\n min-width: 130px;\n margin: @component-padding/2;\n }\n\n .btn-group {\n margin: @component-padding/2;\n padding-left: 1px; // Counter balance since btns have margin-left: -1px\n }\n }\n\n .search-message {\n margin: @component-padding 0 0;\n }\n\n .error-message {\n padding: @component-padding 0;\n }\n\n }\n\n .btn-retry {\n margin-left: @component-padding;\n }\n\n .readme {\n margin-top: @component-padding;\n }\n\n .panel-heading .label {\n margin-left: @component-padding;\n }\n\n .loading-area {\n span {\n &::before {\n font-size: 1.1em;\n width: 1.1em;\n height: 1.1em;\n }\n }\n }\n\n .error-view {\n margin: @component-padding 0 @component-padding 0;\n }\n\n .packages-panel {\n .nav {\n .badge {\n margin-left: @component-icon-padding;\n }\n }\n }\n\n .copy-icon {\n cursor: pointer;\n padding-right: 2px;\n\n &:hover {\n color: #2a6496;\n }\n }\n\n .table {\n table {\n width: 100%;\n table-layout: initial;\n }\n\n th {\n padding: @component-padding - 2px @component-padding;\n padding-left: 0;\n }\n\n td {\n height: @component-line-height;\n }\n\n td, th {\n padding-left: 1%;\n padding-right: 1%;\n white-space: nowrap;\n overflow: hidden;\n border-color: @base-border-color;\n }\n\n col.keystroke {\n width: (15% - 2%);\n }\n\n col.command {\n width: (40% - 2%);\n }\n\n col.source {\n width: (10% - 2%);\n }\n\n col.selector {\n width: (35% - 2%);\n }\n }\n\n .compile-tools-heading {\n font-weight: bold;\n }\n\n .compile-tools-message {\n padding-top: @component-padding;\n\n code {\n text-shadow: none;\n border-width: 1px;\n border-style: solid;\n }\n }\n\n .uri-history {\n width: 100%;\n\n th {\n white-space: nowrap;\n }\n\n td, th {\n padding: 0 @component-padding @component-padding/2 0;\n }\n }\n}\n\n@media all and (max-width: 800px) {\n .thumbnail .btn-toolbar {\n .btn {\n width: 100%;\n margin: 2px 0;\n }\n }\n}\n\n.package-updates-status-view:hover {\n text-decoration: underline;\n}\n\n.available-updates-status {\n padding-left: 2px;\n}\n\n\n// Overrides\n// TODO: Refactor + cleanup\n\n.settings-view {\n\n .container {\n padding: 0;\n > .row {\n margin-left: 0;\n margin-right: 0;\n }\n }\n\n .updates-heading-container {\n display: flex;\n flex-wrap: wrap;\n justify-content: space-between;\n align-items: center;\n }\n\n .update-all-button:last-child {\n margin-left: @component-padding/2;\n }\n\n .keybinding-panel .is-user {\n color: @text-color-selected;\n background-color: @background-color-selected;\n }\n\n .btn-wrap-group .btn {\n margin: 0 @component-padding/2 @component-padding/2 0;\n }\n}\n\n.clearfix {\n &::before {\n display: table;\n content: \"\";\n }\n\n &::after {\n display: table;\n clear: both;\n content: \"\";\n }\n}\n\n// Reset Bootstrap media queries,\n// since it breaks when resizing the treeview or in multiple panes\n\n@media (min-width: 768px) {\n .container {\n width: auto;\n }\n}\n@media (min-width: 992px) {\n .container {\n width: auto;\n }\n}\n@media (min-width: 1200px) {\n .container {\n width: auto;\n }\n .col-lg-8 {\n width: 100%;\n }\n}\n","digest":"353f99d8bd7ca4e7cb8cd467208012d646bc2edf"},"node_modules/settings-view/styles/variables.less":{"content":"@import \"variables/ui-variables\";\n@import \"variables/syntax-variables\";\n// Import only after ui-variables.less\n@package-card-background-color: lighten(@tool-panel-background-color, 8%);\n@package-card-disabled-background-color: darken(@package-card-background-color, 3%);\n","digest":"cffd057442ce83af2518c9627d28c87cfbb5fafa"},"node_modules/spell-check/styles/spell-check.atom-text-editor.less":{"content":"@import \"variables/ui-variables\";\n@import \"variables/syntax-variables\";\n.spell-check-misspelling .region {\n border-bottom: 2px dotted hsla(0, 100%, 60%, 0.75);\n}\n\n.spell-check-corrections {\n width: 25em !important;\n}\n","digest":"dabc0ce2a181159b0875d3f5d1b59be9d0ec2cfb"},"node_modules/status-bar/styles/status-bar.less":{"content":"@import \"variables/ui-variables\";\n@import \"variables/syntax-variables\";\n@import \"ui-variables\";\n@import \"octicon-mixins\";\n\nstatus-bar {\n display: block;\n font-size: 11px;\n line-height: @component-line-height - 3px;\n height: @component-line-height + 1px;\n position: relative;\n -webkit-user-select: none;\n cursor: default;\n overflow: hidden;\n white-space: nowrap;\n min-width: -webkit-min-content;\n\n a, a:hover {\n color: @text-color;\n }\n\n .flexbox-repaint-hack {\n padding: 0 @component-line-height/2;\n position: absolute;\n top: 0;\n right: 0;\n bottom: 0;\n left: 0;\n display: flex;\n justify-content: space-between;\n }\n\n // Use 1/3 of space -> will get cut-off first when narrow\n .status-bar-left {\n flex: 1 1 33%;\n }\n\n // Use 2/3 of space\n .status-bar-right {\n padding-left: @component-padding;\n .inline-block {\n margin-right: 0;\n margin-left: @component-padding;\n & > .inline-block {\n margin-left: 0;\n }\n }\n }\n\n // Add horizontal overflow scrolling\n .status-bar-left,\n .status-bar-right {\n overflow-x: auto;\n // prevent badly behaved status bar items from causing vertical scrolling\n // in the status bar. They can always implement overflow: auto to scroll\n // within themselves.\n overflow-y: hidden;\n &::-webkit-scrollbar {\n display: none;\n }\n }\n\n // Limit inline-blocks from getting too long\n .inline-block {\n max-width: 20vw;\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n }\n\n // No width limit for file-info -> will get cut off if too long\n .inline-block.file-info {\n max-width: none;\n }\n\n .file-info.buffer-modified::after {\n content: '*';\n }\n\n // All icons are smaller than normal (normal is 16px)\n .icon:before {\n .icon-size(14px);\n position: relative;\n top: 1px;\n margin-right: 0px;\n }\n\n .icon-diff-ignored:before,\n .commits-ahead-label:before,\n .commits-behind-label:before {\n margin-right: -1px;\n }\n\n .hide,\n .current-path:empty,\n .cursor-position:empty,\n .selection-count:empty {\n display: none;\n }\n\n .git-view {\n display: inline-block;\n }\n\n .cursor-position a,\n .cursor-position a:hover {\n color: @text-color;\n }\n}\n","digest":"73ed165f0ba9727bb6aceaa136e3c4dd24a0b498"},"node_modules/styleguide/styles/components.less":{"content":"@import \"variables/ui-variables\";\n@import \"variables/syntax-variables\";\n@import \"ui-variables\";\n\n//\n// This adds some component styles specifically for the Styleguide\n// --------------------------------\n\n.styleguide {\n\n // Icons ---------------\n\n [data-name=\"icons\"] {\n .example-rendered {\n display: flex;\n flex-wrap: wrap;\n align-content: flex-start;\n }\n\n .example-code {\n display: none; // remove, doesn't make much sense here\n }\n\n .icon {\n position: relative;\n flex: 1 0 200px;\n padding: 10px 0 10px 40px;\n color: @text-color-subtle;\n &:before {\n position: absolute;\n margin-left: -32px;\n color: @text-color-highlight;\n text-align: center;\n }\n &:hover {\n color: @text-color-highlight;\n &:before {\n color: @text-color-selected;\n font-size: 32px;\n width: 32px;\n height: 32px;\n margin-top: -8px;\n margin-left: -40px; // 32px (initial) + 8px (grow)\n }\n }\n }\n\n // Make the Gist logo bigger\n .icon-logo-gist {\n &:before,\n &:hover:before {\n font-size: 2.5em;\n margin-top: -.05em;\n margin-left: -1.3em;\n width: 16px;\n height: 16px;\n }\n }\n\n // Make the GitHub logo bigger\n .icon-logo-github {\n &:before,\n &:hover:before {\n font-size: 3em;\n margin-top: .08em;\n margin-left: -1.2em;\n }\n }\n }\n\n // Inputs + controls ---------------\n\n .input-search,\n .input-textarea {\n margin-top: @component-padding;\n }\n\n .input-label {\n display: block;\n width: -webkit-max-content;\n margin: 0 1em 1em 0;\n }\n\n .input-color,\n .input-number,\n .input-select {\n margin: 0 @component-padding 0 0 !important;\n }\n\n\n // Site colors ---------------\n\n .ui-site-1,\n .ui-site-2,\n .ui-site-3,\n .ui-site-4,\n .ui-site-5 {\n height: 10px;\n width: 100px;\n }\n\n\n // Modals ---------------\n\n atom-panel.modal {\n // makde them responsive in the styleguide\n position: relative;\n max-width: 100%;\n left: 0;\n margin: 0;\n }\n\n\n // Misc ---------------\n\n .popover-list {\n position: relative;\n }\n\n .popover-list,\n .select-list {\n atom-text-editor[mini] { height: 27px; }\n }\n\n .tooltip {\n position: relative;\n opacity: 1;\n display: inline-block;\n margin-right: @component-padding;\n }\n\n [data-name=\"error-messages\"] .example-rendered {\n min-height: 60px; // don't cut off centered messages\n }\n\n}\n","digest":"bf26369d71be6cb187463352133d755cb3fb1a4d"},"node_modules/styleguide/styles/styleguide.less":{"content":"@import \"variables/ui-variables\";\n@import \"variables/syntax-variables\";\n@import \"ui-variables\";\n@import \"syntax-variables\";\n\n@styleguide-spacing: @component-padding *1.5;\n@styleguide-bg: darken(@base-background-color, 2%);\n\n.styleguide {\n position: relative;\n display: flex;\n flex-direction: column;\n\n a {\n text-decoration: underline;\n }\n}\n\n.styleguide-controls {\n position: absolute;\n right: @component-padding;\n top: @component-padding;\n z-index: 100;\n}\n\n.styleguide-header {\n padding: @styleguide-spacing;\n border-bottom: 1px solid @base-border-color;\n h1 {\n font-size: 2em;\n margin: 0 0 .5em 0;\n color: @text-color-highlight;\n }\n p {\n font-size: 1.2em;\n &:last-of-type {\n margin-bottom: 0;\n }\n }\n}\n\n.styleguide-sections {\n flex: 1;\n overflow: auto;\n\n & > section {\n background-color: @styleguide-bg;\n padding: 0;\n border-bottom: 1px solid @base-border-color;\n border-top: none;\n\n &:last-child {\n margin-bottom: 0;\n }\n\n &.collapsed {\n background-color: @base-background-color;\n > .section-heading {\n display: block;\n margin: 0;\n padding-bottom: @styleguide-spacing;\n color: @text-color;\n &:hover {\n color: @text-color-highlight;\n background-color: @background-color-highlight;\n }\n &:active {\n background-color: @base-background-color;\n }\n }\n > * {\n display: none\n }\n }\n }\n\n .section-heading.section-heading {\n padding: @styleguide-spacing @styleguide-spacing 0 @styleguide-spacing;\n cursor: pointer;\n font-weight: normal;\n font-size: 1.8em;\n color: @text-color-highlight;\n }\n\n section > h2 {\n font-size: 1.5em;\n line-height: 1.2;\n margin: 1em @styleguide-spacing 0 @styleguide-spacing;\n color: @text-color-highlight;\n }\n\n section > p {\n font-size: 1.1em;\n margin: .5em @styleguide-spacing 1em @styleguide-spacing;\n }\n}\n\n// Example -------------------------------\n\n.styleguide .example {\n @example-background: @base-background-color;\n\n display: flex;\n flex-wrap: wrap;\n border-radius: @component-border-radius;\n padding: @component-padding / 2;\n\n .example-rendered,\n .example-code {\n position: relative;\n flex: 1 1 300px;\n min-width: 0;\n margin: @component-padding / 2;\n border-radius: @component-border-radius;\n border: 1px solid @tool-panel-border-color;\n }\n\n .example-rendered {\n padding: @component-padding;\n background: @example-background;\n overflow: hidden;\n }\n\n .example-code {\n background-color: @syntax-background-color;\n pre {\n border: none;\n background-color: inherit;\n }\n }\n}\n","digest":"70f8674ff2b98bc0af5bbbb850cebf5083e321af"},"node_modules/styleguide/styles/variables.less":{"content":"@import \"variables/ui-variables\";\n@import \"variables/syntax-variables\";\n@import \"ui-variables\";\n@import \"syntax-variables\";\n\n.styleguide [data-name=\"variables\"] {\n\n // Text colors\n .color( text-color );\n .color( text-color-subtle );\n .color( text-color-highlight );\n .color( text-color-selected );\n .color( text-color-info );\n .color( text-color-success );\n .color( text-color-warning );\n .color( text-color-error );\n\n // Background colors\n .color( background-color-info );\n .color( background-color-success );\n .color( background-color-warning );\n .color( background-color-error );\n .color( background-color-highlight );\n .color( background-color-selected );\n .color( app-background-color );\n\n // Base colors\n .color( base-background-color );\n .color( base-border-color );\n\n // Pane colors\n .color( pane-item-background-color );\n .color( pane-item-border-color );\n\n // Input colors\n .color( input-background-color );\n .color( input-border-color );\n\n // Panel colors\n .color( tool-panel-background-color );\n .color( tool-panel-border-color );\n .color( inset-panel-background-color );\n .color( inset-panel-border-color );\n .color( panel-heading-background-color );\n .color( panel-heading-border-color );\n .color( overlay-background-color );\n .color( overlay-border-color );\n\n // Button colors\n .color( button-background-color );\n .color( button-background-color-hover );\n .color( button-background-color-selected );\n .color( button-border-color );\n\n // Tab colors\n .color( tab-bar-background-color );\n .color( tab-bar-border-color );\n .color( tab-background-color );\n .color( tab-background-color-active );\n .color( tab-border-color );\n\n // Tree-view colors\n .color( tree-view-background-color );\n .color( tree-view-border-color );\n\n // Site colors\n .color( ui-site-color-1 );\n .color( ui-site-color-2 );\n .color( ui-site-color-3 );\n .color( ui-site-color-4 );\n .color( ui-site-color-5 );\n\n // Component sizes\n .size( disclosure-arrow-size );\n .size( component-padding );\n .size( component-icon-padding );\n .size( component-icon-size );\n .size( component-line-height );\n .size( tab-height );\n .size( font-size );\n\n // Misc\n .radius( component-border-radius );\n .font( font-family );\n\n\n // Visualize --------------------------------\n\n .is-color:before,\n .is-size:after,\n .is-radius:after {\n content: \"\";\n display: inline-block;\n height: 20px;\n vertical-align: middle;\n }\n .is-color:before {\n margin-right: @component-padding*1.5;\n width: 20%;\n }\n .is-size:after {\n margin-left: @component-padding*1.5;\n height: 4px;\n background-color: @text-color;\n }\n .is-radius:after {\n width: 20px;\n margin-left: @component-padding*1.5;\n background-color: @text-color;\n }\n .is-font:after {\n margin-left: @component-padding;\n color: @text-color-highlight;\n }\n\n\n // Mixins --------------------------------\n\n .color(@variable) {\n .is-color.@{variable}:before {\n background-color: @@variable;\n }\n }\n\n .size(@variable) {\n .is-size.@{variable}:after {\n width: @@variable;\n }\n }\n\n .radius(@variable) {\n .is-radius.@{variable}:after {\n border-radius: @@variable;\n }\n }\n\n .font(@variable) {\n .is-font.@{variable}:after {\n content: @@variable;\n font-family: @@variable;\n }\n }\n\n\n // Custom styling for vars --------------------------------\n\n .example-code {\n display: none; // remove, doesn't make much sense here\n }\n}\n","digest":"c29607cc1fadfb7abcb490864e92816e63e8c2e9"},"node_modules/symbols-view/styles/symbols-view.less":{"content":"@import \"variables/ui-variables\";\n@import \"variables/syntax-variables\";\n@import \"ui-variables\";\n\n// Highlight matched text\n.symbols-view .list-group .character-match {\n color: @text-color-highlight;\n font-weight: bold;\n}\n","digest":"0d42513a8411ac9f44466cbbddb994e532965ba2"},"node_modules/tabs/styles/layout.less":{"content":"@import \"variables/ui-variables\";\n@import \"variables/syntax-variables\";\n.tabs-layout-overlay {\n background: grey;\n position: absolute;\n z-index: 11; // Make sure this covers absolutely-positioned docks\n opacity: 0;\n pointer-events: none;\n transition: all 0.2s;\n &.visible {\n opacity: 0.1;\n }\n}\n","digest":"d314bc400d4e94580ab82e1b7a49ea4c98b7c2f2"},"node_modules/tabs/styles/tabs-mru-switcher.less":{"content":"@import \"variables/ui-variables\";\n@import \"variables/syntax-variables\";\n\n.tabs-mru-switcher {\n .list-group.list-group {\n margin-top: 0;\n\n // Fix to make the scrollbar appear\n // Not necessary for all themes\n backface-visibility: hidden;\n }\n}\n","digest":"3a300a3e1bea67913d4620ed192ae9e2522ef45a"},"node_modules/tabs/styles/tabs.less":{"content":"@import \"variables/ui-variables\";\n@import \"variables/syntax-variables\";\n@import \"ui-variables\";\n@import \"octicon-mixins\";\n\n@close-icon-size: 12px;\n\n.tab-bar {\n display: flex;\n -webkit-user-select: none;\n margin: 0;\n\n .tab {\n font-size: 11px;\n position: relative;\n padding-left: 10px;\n padding-right: 10px + @close-icon-size + 2px;\n -webkit-user-drag: element;\n flex: 1;\n max-width: 175px;\n min-width: 40px;\n transition: max-width .25s ease-in-out;\n\n &.active {\n flex: 2;\n width: -webkit-fit-content;\n\n .title {\n padding-right: 10px;\n }\n }\n\n .title {\n overflow: hidden;\n white-space: pre;\n text-overflow: ellipsis;\n &.temp {\n font-style: italic;\n }\n }\n\n .hide-icon {\n &.icon:before {\n display: none;\n }\n }\n\n .close-icon {\n .octicon(x, @close-icon-size);\n position: absolute;\n top: 1px;\n right: 10px;\n cursor: default;\n }\n\n &.modified:hover .close-icon {\n color: @background-color-info;\n }\n\n &.modified:not(:hover) .close-icon {\n &:before { display: none; }\n top: 11px;\n right: 11px;\n width: 8px;\n height: 8px;\n border: 2px solid @background-color-info;\n border-radius: 12px;\n }\n }\n\n /* Drag and Drop */\n .placeholder {\n position: relative;\n top: 0;\n padding: 0;\n height: @tab-height;\n z-index: 999;\n list-style: none;\n background: @background-color-info;\n pointer-events: none;\n\n // bar\n &:before {\n content: \"\";\n position: absolute;\n width: 2px;\n margin: -1px; padding: 0;\n height: inherit;\n background: inherit;\n }\n\n // dot\n &:after {\n content: \"\";\n position: absolute;\n top: @tab-height;\n margin-top: -1px;\n margin-left: -2px;\n z-index: 9999;\n width: 4px;\n height: 4px;\n background: inherit;\n border-radius: 4px;\n border: 1px solid transparent;\n }\n }\n\n &.hidden {\n display: none;\n }\n}\n","digest":"ef692077042a4fcc762e93a03d532c786c838578"},"node_modules/timecop/styles/timecop.less":{"content":"@import \"variables/ui-variables\";\n@import \"variables/syntax-variables\";\n@import \"ui-variables\";\n\n.timecop {\n .timecop-panel {\n background-color: @tool-panel-background-color;\n }\n\n overflow: auto;\n\n .panels {\n display: flex;\n flex-direction: row;\n }\n\n .package-panel {\n display: flex;\n flex-direction: row;\n flex: 1;\n\n .list-group {\n overflow: hidden;\n }\n\n .inset-panel {\n width: 100%;\n }\n }\n\n .text-info {\n margin-bottom: @component-padding;\n }\n\n .timing,\n .list-item {\n display: flex;\n justify-content: space-between;\n .inline-block:last-child {\n margin-right: 0;\n }\n }\n\n .timing {\n margin-bottom: @component-padding;\n }\n\n .list-item {\n margin-top: @component-padding / 2;;\n margin-bottom: @component-padding / 2;\n }\n\n .package {\n color: @text-color;\n &:hover {\n text-decoration: none;\n color: @text-color-selected;\n }\n }\n .timecop-line {\n flex: 1 1 0;\n margin-right: @component-padding;\n margin-top: .80em;\n border-top: 1px dashed fade(@text-color, 20%);\n }\n\n .package:hover + .timecop-line {\n border-color: fade(@text-color, 60%);\n }\n\n}\n","digest":"b845d0ed2349c16314642b453287adff298368cc"},"node_modules/tree-view/styles/tree-view.less":{"content":"@import \"variables/ui-variables\";\n@import \"variables/syntax-variables\";\n@import \"ui-variables\";\n\n.project-root-header {\n -webkit-user-drag: element;\n}\n\n.tree-view {\n contain: size;\n overflow: auto;\n z-index: 2;\n -webkit-user-select: none;\n\n display: flex;\n flex-direction: column;\n\n .tree-view-root {\n padding-left: @component-icon-padding;\n padding-right: @component-padding;\n background-color: inherit;\n\n /*\n * Force a new stacking context to prevent a large, duplicate paint layer from\n * being created for tree-view's scrolling contents that can make the cost of\n * layer tree updates scale at 3x the size of the layer rather than the\n * optimal 1x.\n *\n * On high resolution displays, Chromium handles layers for scrolling content\n * differently and inadvertently creates a duplicate paint layer the size of\n * .tree-view-scroller because descendants of the scroller overlap the\n * auto-created layer.\n */\n isolation: isolate;\n\n // Expands tree-view root to take up full height.\n // This makes sure that the context menu can still be openend in the empty\n // area underneath the files.\n flex-grow: 1;\n\n // Expands tree-view root to take up as much width as needed by the content.\n // This makes sure that the selected item's \"bar/background\" expands to full width.\n position: relative;\n min-width: min-content;\n }\n\n .header {\n position: relative;\n }\n\n .tree-view-root .list-tree {\n // Keeps selections expanded while dragging\n position: static;\n }\n\n .entry {\n // This fixes #110, see that issue for more details\n &::before {\n content: '';\n position: absolute;\n }\n }\n\n /* Drag and Drop */\n .placeholder {\n position: absolute;\n left: @component-icon-padding;\n padding: 0;\n z-index: 999;\n display: inline-block;\n\n width: calc(~\"100% -\" @component-icon-padding);\n background: @background-color-info;\n\n list-style: none;\n pointer-events: none;\n\n // bar\n &:before {\n content: \"\";\n position: absolute;\n height: 2px;\n margin: -1px; padding: 0;\n width: inherit;\n background: inherit;\n }\n\n &:after {\n content: \"\";\n position: absolute;\n left: 0;\n margin-top: -2px;\n margin-left: -1px;\n width: 4px;\n height: 4px;\n background: @background-color-info;\n border-radius: 4px;\n border: 1px solid transparent;\n }\n\n // ensure that placeholder doesn't disappear above the top of the view\n &:first-child {\n margin-top: 1px;\n }\n }\n}\n","digest":"f1313ca5057287a2c8a9e1a62469ebd00e4b4474"},"node_modules/update-package-dependencies/styles/update-package-dependencies.less":{"content":"@import \"variables/ui-variables\";\n@import \"variables/syntax-variables\";\n.update-package-dependencies-status .loading.inline-block {\n vertical-align: text-bottom;\n}\n","digest":"d83c2f136f2a1dd45e3a6521e8a89d7e740277c1"},"node_modules/welcome/styles/welcome.less":{"content":"@import \"variables/ui-variables\";\n@import \"variables/syntax-variables\";\n@import \"octicon-mixins\";\n@import \"ui-variables\";\n\n.welcome {\n display: flex;\n font-size: 1.25em;\n line-height: 1.4;\n color: @text-color;\n background-color: @base-background-color;\n overflow-x: auto;\n\n // Overrides ----------------------\n\n p {\n line-height: inherit;\n }\n\n a {\n color: @text-color-info;\n }\n\n ul {\n padding-left: 2em;\n }\n\n label {\n margin-top: 1em;\n font-weight: normal;\n }\n\n .input-checkbox {\n margin-top: -.2em;\n margin-right: .5em;\n }\n\n // Components ----------------------\n\n &-container {\n width: 100%;\n max-width: 580px;\n min-width: 300px;\n margin: auto;\n padding: 3em 2em;\n }\n\n &-header {\n margin: 0 0 3em 0;\n }\n\n &-logo {\n display: block;\n width: 100%;\n max-width: 280px;\n margin: 0 auto 2em auto;\n color: @text-color-highlight;\n }\n\n &-title {\n font-size: 1.4em;\n text-align: center;\n line-height: 1.3;\n margin: 1em 0;\n }\n\n &-panel {\n }\n\n &-card {\n margin: 1em 0;\n\n border-radius: @component-border-radius*2;\n border: 1px solid @base-border-color;\n background-color: lighten(@base-background-color, 3%);\n }\n\n &-summary {\n padding: 1em 1.5em;\n font-size: 1.1em;\n font-weight: 300;\n line-height: 1.4;\n cursor: pointer;\n &:hover {\n color: lighten(@text-color, 4%);\n }\n &::-webkit-details-marker {\n display: none\n }\n &:before {\n width: 20px;\n color: @text-color-subtle;\n details[open] & {\n color: @text-color-highlight;\n }\n }\n details[open] & {\n color: @text-color-highlight;\n }\n }\n\n &-highlight {\n color: @text-color-highlight;\n }\n\n &-detail {\n border-top: 1px solid @base-border-color;\n padding: 1.5em;\n .welcome-note {\n margin-bottom: 0;\n }\n .btn {\n margin-top: @component-padding/3;\n margin-bottom: @component-padding/3;\n }\n }\n\n &-img {\n display: block;\n max-width: 100%;\n border-radius: 3px;\n margin: 0 0 1em 0;\n border: 1px solid @base-border-color;\n }\n\n &-consent {\n margin-top: 3em;\n\n &-choices {\n display: flex;\n flex-direction: row;\n flex-wrap: wrap;\n margin: 1em -1em;\n\n button {\n width: 100%\n }\n\n div {\n margin: .5em 1em;\n flex: 1;\n }\n\n .welcome-note {\n margin-top: 1em;\n }\n }\n }\n\n &-key {\n display: inline-block;\n padding: .3em .4em;\n font-size: .8em;\n line-height: 1;\n border-radius: 3px;\n color: @text-color-highlight;\n border: 1px solid @text-color-subtle;\n background: hsla(0,0%,0%,.1);\n }\n\n &-love {\n color: @text-color-subtle;\n a { color: @text-color-subtle; }\n\n .icon::before {\n // Make these octicons look good inlined with text\n position: relative;\n top: 4px;\n width: auto;\n margin-right: 0;\n font-size: 1.5em;\n }\n\n .icon-logo-github::before {\n top: 2px;\n font-size: 3.6em;\n vertical-align: top;\n }\n }\n\n &-note {\n font-size: .86em;\n color: @text-color-subtle;\n\n .icon {\n margin-left: 5px;\n }\n\n .icon::before {\n margin-right: 0;\n }\n }\n\n &-footer {\n margin-top: 1em;\n text-align: center;\n }\n}\n","digest":"13f78956a7ccd8d76142e0f4c4466bd70f112ebd"},"node_modules/wrap-guide/styles/wrap-guide.less":{"content":"@import \"variables/ui-variables\";\n@import \"variables/syntax-variables\";\n@import \"syntax-variables\";\n\natom-text-editor {\n .wrap-guide {\n height: 100%;\n width: 1px;\n z-index: 3;\n position: absolute;\n top: 0;\n background-color: @syntax-wrap-guide-color;\n -webkit-transform: translateZ(0);\n pointer-events: none;\n }\n}\n","digest":"4f2ee93f69546025dc63fa9ef28b3e6d34bf6b4f"},"node_modules/atom-dark-ui/index.less":{"content":"@import \"variables/ui-variables\";\n@import \"variables/syntax-variables\";\n@import \"styles/atom\";\n@import \"styles/buttons\";\n@import \"styles/editor\";\n@import \"styles/git\";\n@import \"styles/lists\";\n@import \"styles/messages\";\n@import \"styles/nav\";\n@import \"styles/overlays\";\n@import \"styles/panels\";\n@import \"styles/panes\";\n@import \"styles/progress\";\n@import \"styles/sites\";\n@import \"styles/tabs\";\n@import \"styles/text\";\n@import \"styles/tooltips\";\n@import \"styles/tree-view\";\n@import \"styles/utilities\";\n","digest":"c50fb319f023e7bf055888583f20e937fdb4b774"},"node_modules/atom-dark-ui/styles/atom.less":{"content":"@import \"ui-variables\";\n\n* {\n\tbox-sizing: border-box;\n}\n\natom-workspace {\n background-color: @app-background-color;\n}\n\n.scrollbars-visible-always {\n ::-webkit-scrollbar {\n width: 10px;\n height: 10px;\n }\n\n ::-webkit-scrollbar-track,\n ::-webkit-scrollbar-corner {\n background: @scrollbar-background-color;\n }\n\n ::-webkit-scrollbar-thumb {\n background: @scrollbar-color;\n border-radius: 5px;\n box-shadow: 0 0 1px black inset;\n }\n}\n","digest":"28f3cf3978401c26f1777c1ad145db7ec81510b0"},"node_modules/atom-dark-ui/styles/buttons.less":{"content":"@import \"ui-variables\";\n@import \"ui-mixins\";\n\n.btn-background (@color, @hover-color, @selected-color, @text-color) {\n color: @text-color;\n background-color: transparent;\n background-image: -webkit-linear-gradient(@color, darken(@color, 5%));\n\n &:focus {\n color: @text-color;\n }\n &:hover {\n color: @text-color-highlight;\n background-image: -webkit-linear-gradient(@hover-color, darken(@hover-color, 5%));\n }\n &.selected,\n &.selected:hover {\n color: @text-color-highlight;\n background-image: -webkit-linear-gradient(darken(@selected-color, 5%), @selected-color);\n &:hover {\n background-image: -webkit-linear-gradient(@selected-color, darken(@selected-color, 5%));\n }\n }\n}\n\n.btn-variant (@color) {\n @bg: darken(@color, 10%);\n @hover: @color;\n @selected: @color;\n .btn-background(@bg, @hover, @selected, @text-color-highlight);\n}\n\n.btn {\n .btn-background(@button-background-color, @button-background-color-hover, @button-background-color-selected, @text-color);\n}\n\n.btn.btn-primary {\n .btn-variant(@background-color-info);\n}\n.btn.btn-info {\n .btn-variant(@background-color-info);\n}\n.btn.btn-success {\n .btn-variant(@background-color-success);\n}\n.btn.btn-warning {\n .btn-variant(@background-color-warning);\n}\n.btn.btn-error {\n .btn-variant(@background-color-error);\n}\n\n.caret {\n border-top: 5px solid #fff;\n margin-top: -1px;\n}\n","digest":"221da8f027143ea00f267af3428769c0bf5ea413"},"node_modules/atom-dark-ui/styles/dropdowns.less":{"content":"@import \"ui-variables\";\n@import \"ui-mixins\";\n@import \"octicon-mixins\";\n\n.dropdown-menu {\n background-color: @overlay-background-color;\n border-radius: @component-border-radius;\n border: 1px solid @base-border-color;\n padding: 0;\n\n > li > a {\n .text(normal);\n }\n\n > li > a:hover {\n .text(highlight);\n background-color: @background-color-highlight;\n }\n}\n","digest":"5eb5a7b0215ce07692c224d826cf22b5258ae687"},"node_modules/atom-dark-ui/styles/editor.less":{"content":"@import \"ui-variables\";\n@import \"ui-mixins\";\n\natom-text-editor[mini] {\n color: @text-color-highlight;\n background-color: @input-background-color;\n border: 1px solid @input-border-color;\n box-shadow: inset 0 1px 1px rgba(0, 0, 0, .075);\n border-radius: @component-border-radius;\n padding-left: @component-padding/2;\n\n .cursor { border-color: #fff; }\n .selection .region { background-color: lighten(@input-background-color, 10%); }\n}\n\natom-text-editor[mini].is-focused {\n background-color: lighten(@input-background-color, 5%);\n .selection .region { background-color: desaturate(@background-color-info, 50%); }\n}\n\n// FIXME: these should go in syntax themes?\natom-text-editor {\n .gutter.drop-shadow {\n -webkit-box-shadow: -2px 0 10px 2px #222;\n }\n}\n","digest":"2bcacf458053cee640e5a58326e1912338521a33"},"node_modules/atom-dark-ui/styles/git.less":{"content":"@import \"ui-mixins\";\n@import \"ui-variables\";\n\n.status { .text(normal); }\n.status-added { .text(success); }\n.status-ignored { .text(subtle); }\n.status-modified { .text(warning); }\n.status-removed { .text(error); }\n.status-renamed { .text(info); }\n","digest":"ed1ba6a0675bf1eb93fb84803c7830bc18adee6f"},"node_modules/atom-dark-ui/styles/lists.less":{"content":"@import \"ui-variables\";\n@import \"ui-mixins\";\n@import \"octicon-mixins\";\n\n.list-group, .list-tree {\n li:not(.list-nested-item),\n li.list-nested-item > .list-item {\n .text(normal);\n }\n\n .generate-list-item-text-color(@class) {\n li:not(.list-nested-item).text-@{class},\n li.list-nested-item.text-@{class} > .list-item {\n .text(@class);\n }\n }\n .generate-list-item-text-color(subtle);\n .generate-list-item-text-color(info);\n .generate-list-item-text-color(success);\n .generate-list-item-text-color(warning);\n .generate-list-item-text-color(error);\n .generate-list-item-text-color(selected);\n\n .generate-list-item-status-color(@color, @status) {\n li:not(.list-nested-item).status-@{status},\n li.list-nested-item.status-@{status} > .list-item {\n color: @color;\n }\n\n li:not(.list-nested-item).selected.status-@{status},\n li.list-nested-item.selected.status-@{status} > .list-item {\n color: @color;\n }\n }\n\n .generate-list-item-status-color(@text-color-subtle, ignored);\n .generate-list-item-status-color(@text-color-added, added);\n .generate-list-item-status-color(@text-color-renamed, renamed);\n .generate-list-item-status-color(@text-color-modified, modified);\n .generate-list-item-status-color(@text-color-removed, removed);\n\n li:not(.list-nested-item).selected,\n li.list-nested-item.selected > .list-item {\n .text(selected);\n }\n}\n\n.select-list ol.list-group,\n&.select-list ol.list-group {\n li.two-lines {\n .secondary-line { color: @text-color-subtle; }\n &.selected .secondary-line {\n color: @text-color;\n text-shadow: none;\n }\n }\n\n // We want to highlight the background of the list items because we dont\n // know their size.\n li.selected {\n background-color: @background-color-selected;\n &:before{ display: none; }\n }\n\n &.mark-active{\n @active-icon-size: 14px;\n\n // pad in front of the text where the icon would be We'll pad the non-\n // active items with a 'fake' icon so other classes can pad the item\n // without worrying about the icon padding.\n li:before {\n content: '';\n background-color: transparent;\n position: static;\n display: inline-block;\n left: auto; right: auto;\n height: @active-icon-size;\n width: @active-icon-size;\n }\n > li:not(.active):before {\n margin-right: @component-icon-padding;\n }\n li.active {\n .octicon(check, @active-icon-size);\n &:before {\n margin-right: @component-icon-padding;\n color: @text-color-success;\n }\n }\n }\n}\n\n.select-list.popover-list {\n background-color: @overlay-background-color;\n box-shadow: 0 0 10px @base-border-color;\n padding: @component-padding/2;\n border-radius: @component-border-radius;\n border: 1px solid @overlay-border-color;\n\n atom-text-editor {\n margin-bottom: @component-padding/2;\n }\n\n .list-group li {\n padding-left: @component-padding/2;\n }\n}\n\n.ui-sortable {\n li {\n line-height: 2.5;\n }\n\n // For sortable lists in the settings view\n li.ui-sortable-placeholder {\n visibility: visible !important;\n background-color: darken(@pane-item-background-color, 10%);\n }\n}\n\nli.ui-draggable-dragging, li.ui-sortable-helper {\n line-height: @component-line-height;\n height: @component-line-height;\n border: 0;\n border-radius: 0;\n list-style: none;\n padding: 0 @component-padding;\n background: @background-color-highlight;\n box-shadow: 0 0 1px @base-border-color;\n}\n","digest":"f5644d2b8c79033bcd93ed3c928a5d4a589bdee5"},"node_modules/atom-dark-ui/styles/messages.less":{"content":"@import \"ui-variables\";\n\nul.background-message {\n font-weight: bold;\n color: rgba(0, 0, 0, .2);\n}\n","digest":"7b7efbe5d0362474b77d2644e8f96733bc5c1a35"},"node_modules/atom-dark-ui/styles/nav.less":{"content":"@import \"ui-variables\";\n\n.nav-tabs {\n border-bottom: 1px solid @base-border-color;\n li {\n a,\n &.active a {\n border: none;\n margin-right: 0px;\n margin-bottom: 1px;\n }\n\n a:hover,\n &.active a,\n &.active a:hover {\n background-color: @background-color-highlight;\n border: none;\n color: @text-color-selected;\n border-bottom-left-radius: 0px;\n border-bottom-right-radius: 0px;\n }\n\n &.active a {\n background-color: @tab-background-color-active;\n }\n }\n}\n","digest":"60bb7686432f454039ff613baf1d160665857393"},"node_modules/atom-dark-ui/styles/overlays.less":{"content":"@import \"ui-variables\";\n\natom-panel.modal, .overlay {\n color: @text-color;\n background-color: @overlay-background-color;\n padding: @component-padding;\n border: 1px solid @overlay-border-color;\n box-shadow: 0 0 10px @base-border-color;\n border-radius: @component-border-radius;\n\n atom-text-editor[mini] {\n margin-bottom: @component-padding;\n }\n\n .select-list ol.list-group,\n &.select-list ol.list-group {\n\n background-color: lighten(@overlay-background-color, 3%);\n\n li {\n padding: @component-padding;\n border-bottom: 1px solid @overlay-background-color;\n\n &.two-lines { padding: @component-padding/2 @component-padding; }\n\n .status.icon {\n float: right;\n margin-left: @component-icon-padding;\n &:before {\n margin-right: 0;\n }\n }\n\n &.selected {\n .status.icon {\n color: @text-color-selected;\n }\n }\n }\n }\n}\n","digest":"69fc28fc152ce1a5cc2ff0507c9816c8ac01cc60"},"node_modules/atom-dark-ui/styles/panels.less":{"content":"@import \"ui-mixins\";\n@import \"ui-variables\";\n@import \"buttons\";\n\n.panel {\n &.bordered {\n border: 1px solid @base-border-color;\n border-radius: @component-border-radius;\n }\n}\n\natom-panel, .tool-panel {\n .text(normal);\n position: relative;\n\n background-color: @tool-panel-background-color;\n\n &.bottom, &.panel-bottom,\n &.footer, &.panel-footer {\n border-top: 1px solid @tool-panel-border-color;\n box-shadow: inset 0 1px 0 @background-color-highlight;\n }\n\n &.left, &.panel-left {\n border-right: 1px solid @tool-panel-border-color;\n }\n\n &.right, &.panel-right {\n border-left: 1px solid @tool-panel-border-color;\n }\n}\n\n.inset-panel {\n position: relative;\n background-color: @inset-panel-background-color;\n}\n\n.is-blurred {\n atom-panel,\n .inset-panel {\n }\n}\n\n.panel-heading {\n .text(normal);\n\n border-bottom: 1px solid @panel-heading-border-color;\n border-top: 1px solid fadein(@background-color-highlight, 10%);\n\n background-color: transparent;\n background-image: -webkit-linear-gradient(@panel-heading-background-color, darken(@panel-heading-background-color, 10%));\n\n .btn {\n padding-left: 8px;\n padding-right: 8px;\n\n @bg: lighten(@button-background-color, 10%);\n @hover: lighten(@button-background-color-hover, 10%);\n @selected: lighten(@button-background-color-selected, 10%);\n @text: lighten(@text-color, 10%);\n .btn-background(@bg, @hover, @selected, @text);\n }\n}\n","digest":"24edfdb16f6c025822e819f0322d3583b15f0258"},"node_modules/atom-dark-ui/styles/panes.less":{"content":"@import \"ui-mixins\";\n@import \"ui-variables\";\n@import \"buttons\";\n\n.pane-item {\n .panel {\n border-color: fadeout(@inset-panel-border-color, 30%);\n }\n}\n\natom-pane-container {\n atom-pane {\n background-color: lighten(@app-background-color, 4%);\n\n &:focus {\n background-color: @app-background-color;\n }\n }\n\n atom-pane-axis.horizontal > * {\n border-right: 1px solid @pane-item-border-color;\n &:last-child { border-right: none; }\n }\n\n atom-pane-axis.vertical > * {\n border-bottom: 1px solid @pane-item-border-color;\n &:last-child { border-bottom: none; }\n }\n}\n","digest":"6fe095a5aa088f37d0661af084801797231c140d"},"node_modules/atom-dark-ui/styles/progress.less":{"content":"@import \"ui-variables\";\n@import \"ui-mixins\";\n\n.loading-spinner(@size) {\n width: @size;\n height: @size;\n display: block;\n\n background-image: url(images/octocat-spinner-128.gif);\n background-repeat: no-repeat;\n background-size: cover;\n\n &.inline-block {\n display: inline-block;\n }\n}\n\n.loading-spinner-large {\n .loading-spinner(64px);\n}\n\n.loading-spinner-medium {\n .loading-spinner(50px);\n}\n\n.loading-spinner-small {\n .loading-spinner(32px);\n}\n\n.loading-spinner-tiny {\n .loading-spinner(20px);\n}\n\n// Much learning from:\n// http://css-tricks.com/html5-progress-element/\n\n@progress-height: 16px;\n@progress-shine-gradient: -webkit-linear-gradient(top, rgba(255, 255, 255, .15), rgba(0, 0, 0, .15));\n\nprogress {\n height: @progress-height;\n -webkit-appearance: none;\n border-radius: @component-border-radius;\n background-color: #666;\n background-image:\n -webkit-linear-gradient(-30deg,\n transparent 33%, rgba(0, 0, 0, .1) 33%,\n rgba(0,0, 0, .1) 66%, transparent 66%),\n @progress-shine-gradient;\n border-radius: 2px;\n background-size: 25px @progress-height, 100% 100%, 100% 100%;\n -webkit-animation: animate-stripes 5s linear 6; // stop animation after 6 runs (30s) to limit CPU usage\n}\n\nprogress::-webkit-progress-bar {\n background-color: transparent;\n}\n\nprogress::-webkit-progress-value {\n border-radius: @component-border-radius;\n background-image: @progress-shine-gradient;\n background-color: @background-color-success;\n}\n\nprogress[value] {\n background-image: @progress-shine-gradient;\n -webkit-animation: none;\n}\n\n@-webkit-keyframes animate-stripes {\n 100% { background-position: 100px 0px; }\n}\n","digest":"aac1a05afe50c9c4459db60b5490f3d04d47354b"},"node_modules/atom-dark-ui/styles/sites.less":{"content":"@import \"ui-mixins\";\n@import \"ui-variables\";\n\n.ui-site(@num, @color) {\n .ui-site-@{num} {\n background-color: @color;\n }\n}\n\n.ui-site(1, @ui-site-color-1);\n.ui-site(2, @ui-site-color-2);\n.ui-site(3, @ui-site-color-3);\n.ui-site(4, @ui-site-color-4);\n.ui-site(5, @ui-site-color-5);\n","digest":"3d13f4d6504d0f8e86aa5b9971eb50a445303fdd"},"node_modules/atom-dark-ui/styles/tabs.less":{"content":"@import \"ui-variables\";\n@tab-radius: 3px;\n@modified-icon-width: 8px;\n@tab-skew: 30deg;\n@tab-top-padding: 5px;\n@tab-bottom-border-height: 5px;\n@tab-border: 1px solid @tab-border-color;\n@tab-bar-bottom-border-color: #111;\n@tab-max-width: 160px;\n\n.tab-bar {\n height: @tab-height + @tab-top-padding + @tab-bottom-border-height;\n background: @tab-bar-background-color;\n box-shadow: inset 0 -8px 8px -4px rgba(0,0,0, .15);\n padding: 0 10px 0 25px;\n overflow-x: auto;\n overflow-y: hidden;\n\n &::-webkit-scrollbar {\n display: none;\n }\n\n &:after {\n content: \"\";\n position: absolute;\n bottom: 0;\n height: @tab-bottom-border-height;\n left: 0;\n right: 0;\n background-color: @tab-background-color-active;\n border-top: 1px solid @tab-border-color;\n border-bottom: 1px solid @tab-bar-bottom-border-color;\n pointer-events: none;\n }\n\n .tab {\n position: relative;\n top: @tab-top-padding;\n max-width: @tab-max-width;\n height: @tab-height;\n line-height: @tab-height;\n padding: 0;\n margin: 0 20px 0 5px;\n color: @text-color;\n\n transition: color .1s ease-in;\n border: none;\n\n &, &:before, &:after {\n background-image: -webkit-linear-gradient(top, lighten(#333, 7%), #333);\n height: @tab-height;\n }\n\n &:before, &:after {\n content: '';\n position: absolute;\n top: 0px;\n width: 25px;\n height: @tab-height;\n }\n\n // left angled edge\n &:before {\n left: -14px;\n border-top-left-radius: @tab-radius;\n box-shadow: inset 1px 1px 0 @tab-border-color, -4px 0px 4px rgba(0,0,0,.1);\n -webkit-transform: skewX(-@tab-skew);\n }\n\n // right angled edge\n &:after {\n right: -14px;\n border-top-right-radius: @tab-radius;\n box-shadow: inset -1px 1px 0 @tab-border-color, 4px 0px 4px rgba(0,0,0,.1);\n -webkit-transform: skewX(@tab-skew);\n }\n\n .close-icon {\n right: 0;\n z-index: 3;\n text-align: right;\n line-height: @tab-height;\n color: @text-color;\n\n &:hover {\n color: inherit;\n }\n }\n\n &.modified:not(:hover) .close-icon {\n right: 0;\n top: @tab-height/2 - @modified-icon-width/2 + 1px;\n width: @modified-icon-width;\n height: @modified-icon-width;\n }\n\n &.modified:hover .close-icon:hover {\n color: @text-color-highlight;\n }\n\n .title {\n position: relative;\n z-index: 1;\n margin-top: -@tab-top-padding;\n padding-top: @tab-top-padding;\n padding-right: 10px;\n }\n }\n\n .tab.active {\n z-index: 1;\n color: @text-color-highlight;\n box-shadow: inset -1px 1px 0 @tab-border-color, 4px -4px 4px rgba(0,0,0,.1);\n\n .close-icon {\n line-height: @tab-height - 1px;\n color: @text-color;\n }\n\n &, &:before, &:after {\n background-image: -webkit-linear-gradient(top, lighten(@tab-background-color-active, 7%), @tab-background-color-active);\n height: @tab-height + 1px;\n }\n\n &:before {\n box-shadow: inset 1px 1px 0 @tab-border-color, -4px -4px 4px rgba(0,0,0,.1);\n }\n\n &:after {\n box-shadow: inset -1px 1px 0 @tab-border-color, 4px -4px 4px rgba(0,0,0,.1);\n }\n }\n\n .tab:hover {\n color: @text-color-highlight;\n }\n\n .tab.active:hover .close-icon {\n color: @text-color;\n\n &:hover {\n color: inherit;\n }\n }\n\n .placeholder {\n height: @tab-height + @tab-top-padding + @tab-bottom-border-height;\n margin-left: -9px; // center between tabs\n pointer-events: none;\n &:after {\n top: @tab-height + @tab-top-padding + @tab-bottom-border-height - 2px;\n }\n }\n}\n","digest":"09a8bff3b142e02ca29b5365dc3b6247177e3900"},"node_modules/atom-dark-ui/styles/text.less":{"content":"@import \"ui-mixins\";\n@import \"ui-variables\";\n\nh1,\nh2,\nh3 {\n line-height: 1em;\n margin-bottom: 15px\n}\nh1 { font-size: 2em; }\nh2 { font-size: 1.5em; }\nh3 { font-size: 1.2em; }\n\np {\n line-height: 1.6;\n margin-bottom: 15px;\n}\n\nlabel {\n font-weight: normal;\n}\n\npre {\n box-shadow: none;\n color: @text-color;\n background: @inset-panel-background-color;\n border-radius: @component-border-radius;\n border: none;\n margin: 0;\n}\n\ncode {\n .text(highlight);\n background: @background-color-highlight;\n border-radius: @component-border-radius;\n}\n\n.markdown-preview code {\n text-shadow: none;\n}\n\n.selected { .text(highlight); }\n\n.text-smaller { font-size: 0.9em; }\n\n.text-subtle { .text(subtle); }\n.text-highlight { .text(highlight); }\n\n.text-error { .text(error); }\n.text-info {\n .text(info);\n &:hover { color: @text-color-info; }\n}\n.text-warning {\n .text(warning);\n &:hover { color: @text-color-warning; }\n}\n.text-success {\n .text(success);\n &:hover { color: @text-color-success; }\n}\n\n.highlight {\n color: @text-color-highlight;\n font-weight: bold;\n text-shadow: none;\n background-color: @background-color-highlight;\n border-radius: @component-border-radius;\n padding: 1px 3px;\n}\n\n.highlight-color(@name, @color, @text-color) {\n .highlight-@{name} {\n color: lighten(saturate(@text-color, 0%), 30%);\n font-weight: bold;\n text-shadow: none;\n background-color: fadeout(@color, 60%);\n border-radius: @component-border-radius;\n padding: 1px 3px;\n }\n}\n.highlight-color(info, @background-color-info, @text-color-info);\n.highlight-color(warning, @background-color-warning, @text-color-warning);\n.highlight-color(error, @background-color-error, @text-color-error);\n.highlight-color(success, @background-color-success, @text-color-success);\n\n.results-view .path-details.list-item {\n color: darken(@text-color-highlight, 18%);\n}\n","digest":"0790a5ddd2e69c251c0f577a0ebe0eb41c85bc22"},"node_modules/atom-dark-ui/styles/tooltips.less":{"content":"@import \"ui-variables\";\n\n.tooltip {\n @tip-background-color: #fff;\n @tip-text-color: #333;\n white-space: nowrap;\n\n .keystroke {\n font-family: Helvetica, Arial, sans-serif;\n font-size: 13px;\n color: #777;\n padding-left: 2px;\n }\n\n &.in { opacity: 1; }\n\n .tooltip-inner {\n line-height: 19px;\n border-radius: @component-border-radius;\n background-color: @tip-background-color;\n color: @tip-text-color;\n white-space: nowrap;\n max-width: none;\n }\n\n &.top .tooltip-arrow {\n border-top-color: @tip-background-color;\n }\n &.top-left .tooltip-arrow {\n border-top-color: @tip-background-color;\n }\n &.top-right .tooltip-arrow {\n border-top-color: @tip-background-color;\n }\n &.right .tooltip-arrow {\n border-right-color: @tip-background-color;\n }\n &.left .tooltip-arrow {\n border-left-color: @tip-background-color;\n }\n &.bottom .tooltip-arrow {\n border-bottom-color: @tip-background-color;\n }\n &.bottom-left .tooltip-arrow {\n border-bottom-color: @tip-background-color;\n }\n &.bottom-right .tooltip-arrow {\n border-bottom-color: @tip-background-color;\n }\n}\n","digest":"b443079aedbc164d14aa7673a2520a0476746baf"},"node_modules/atom-dark-ui/styles/tree-view.less":{"content":"@import \"ui-variables\";\n\n.tree-view {\n font-size: @font-size;\n background: @tree-view-background-color;\n\n .selected:before {\n background: #444;\n box-shadow: inset -3px 0 0 rgba(0,0,0, .05);\n }\n}\n\n.tree-view-resizer {\n .tree-view-resize-handle {\n width: 8px;\n }\n}\n\n.focusable-panel {\n opacity: 1;\n box-shadow: inset -3px 0 0 rgba(0,0,0, .05);\n\n &:focus {\n background: #282828;\n\n .selected:before {\n background: @background-color-selected;\n }\n }\n}\n\n[data-show-on-right-side=true] {\n .tree-view .selected:before,\n .focusable-panel {\n box-shadow: inset 3px 0 0 rgba(0,0,0, .05);\n }\n}\n","digest":"928b7169c4e5d346b8add6ff0815eabb98a9b0f1"},"node_modules/atom-dark-ui/styles/ui-mixins.less":{"content":"@import \"ui-variables\";\n\n// Pattern matching; ish is cray.\n// http://lesscss.org/#-pattern-matching-and-guard-expressions\n.text(normal) {\n font-weight: normal;\n color: @text-color;\n text-shadow: none;\n}\n.text(subtle) {\n font-weight: normal;\n color: @text-color-subtle;\n text-shadow: none;\n}\n.text(highlight) {\n font-weight: normal;\n color: @text-color-highlight;\n text-shadow: 0 1px 0 rgba(0,0,0, .5);\n}\n.text(selected) {\n .text(highlight)\n}\n\n.text(info) {\n color: @text-color-info;\n text-shadow: none;\n}\n.text(success) {\n color: @text-color-success;\n text-shadow: none;\n}\n.text(warning) {\n color: @text-color-warning;\n text-shadow: none;\n}\n.text(error) {\n color: @text-color-error;\n text-shadow: none;\n}\n","digest":"3f48cb5cad812dec73b6a807e88d40cba75fb46d"},"node_modules/atom-dark-ui/styles/ui-variables.less":{"content":"// Colors\n\n@text-color: #aaa;\n@text-color-subtle: #555;\n@text-color-highlight: #fff;\n@text-color-selected: @text-color-highlight;\n\n@text-color-info: #5293d8;\n@text-color-success: #2BDA77;\n@text-color-warning: #ff982d;\n@text-color-error: #c00;\n\n@text-color-ignored: @text-color-subtle;\n@text-color-added: @text-color-success;\n@text-color-renamed: @text-color-info;\n@text-color-modified: @text-color-warning;\n@text-color-removed: @text-color-error;\n\n@background-color-info: #0098ff;\n@background-color-success: #17ca65;\n@background-color-warning: #ffaa2c;\n@background-color-error: #c00;\n@background-color-highlight: rgba(255, 255, 255, 0.07);\n@background-color-selected: #4182C4;\n\n@app-background-color: #333;\n\n@base-background-color: lighten(@tool-panel-background-color, 5%);\n@base-border-color: rgba(0, 0, 0, 0.5);\n\n@pane-item-background-color: @base-background-color;\n@pane-item-border-color: rgba(0, 0, 0, 0.5);\n\n@input-background-color: #212224;\n@input-border-color: @base-border-color;\n\n@tool-panel-background-color: #1d1f21;\n@tool-panel-border-color: @base-border-color;\n\n@inset-panel-background-color: #161719;\n@inset-panel-border-color: @base-border-color;\n\n@panel-heading-background-color: #43484d;\n@panel-heading-border-color: fadein(@base-border-color, 10%);\n\n@overlay-background-color: #202123;\n@overlay-border-color: @background-color-highlight;\n\n@button-background-color: #43484d;\n@button-background-color-hover: lighten(@button-background-color, 5%);\n@button-background-color-selected: #5c6064;\n@button-border-color: @base-border-color;\n\n@tab-bar-background-color: #222;\n@tab-bar-border-color: darken(@tab-background-color-active, 10%);\n@tab-background-color: #333;\n@tab-background-color-active: #222;\n@tab-border-color: #484848;\n\n@tree-view-background-color: #303030;\n@tree-view-border-color: @tool-panel-border-color;\n\n@scrollbar-background-color: #222425; // Needs to be opaque -> atom/atom/issues/4578\n@scrollbar-color: rgba(92, 92, 92, 0.5);\n\n@ui-site-color-1: @background-color-success; // green\n@ui-site-color-2: @background-color-info; // blue\n@ui-site-color-3: @background-color-warning; // orange\n@ui-site-color-4: #db2ff4; // purple\n@ui-site-color-5: #f5e11d; // yellow\n\n\n// Sizes\n\n@font-size: 11px;\n@input-font-size: 14px;\n\n@disclosure-arrow-size: 12px;\n\n@component-padding: 10px;\n@component-icon-padding: 5px;\n@component-icon-size: 16px;\n@component-line-height: 25px;\n@component-border-radius: 2px;\n\n@tab-height: 26px;\n\n\n// Other\n\n@font-family: 'BlinkMacSystemFont', 'Lucida Grande', 'Segoe UI', Ubuntu, Cantarell, sans-serif;\n","digest":"0c243a8f3a5a84b2c9baeec134885f97c6ef0ca5"},"node_modules/atom-dark-ui/styles/utilities.less":{"content":"@import \"ui-mixins\";\n@import \"ui-variables\";\n\n.key-binding {\n background: -webkit-linear-gradient(\n rgba(100, 100, 100, 0.5),\n rgba(70,70,70, 0.5));\n -webkit-box-shadow: inset 1px 1px 0 rgba(255, 255, 255, 0.1);\n display: inline-block;\n line-height: 100%;\n border-radius: @component-border-radius;\n margin-left: @component-icon-padding;\n font-family: Helvetica, Arial, sans-serif;\n font-size: @font-size - 1px;\n padding: @component-padding / 2;\n}\n\n.badge {\n .text(highlight);\n background: @background-color-highlight;\n}\n","digest":"c01d9f555dce350fb75d06da785e4a73b6143802"},"node_modules/atom-dark-syntax/index.less":{"content":"@import \"variables/ui-variables\";\n@import \"variables/syntax-variables\";\n@import 'syntax-variables';\n\natom-text-editor {\n background-color: @syntax-background-color;\n color: @syntax-text-color;\n\n .invisible-character {\n color: @syntax-invisible-character-color;\n }\n\n .indent-guide {\n color: @syntax-indent-guide-color;\n }\n\n .wrap-guide {\n background-color: @syntax-wrap-guide-color;\n }\n\n .gutter {\n background-color: @syntax-gutter-background-color;\n }\n .gutter .cursor-line {\n background-color: @syntax-gutter-background-color-selected;\n }\n .line-number.cursor-line-no-selection {\n background-color: @syntax-gutter-background-color-selected;\n }\n\n .gutter .line-number.folded,\n .gutter .line-number:after,\n .fold-marker:after {\n color: #fba0e3;\n }\n\n .invisible {\n color: @syntax-text-color;\n }\n\n .cursor {\n border-color: @syntax-cursor-color;\n }\n\n .selection .region {\n background-color: @syntax-selection-color;\n }\n\n .bracket-matcher .region {\n border-bottom: 1px solid #f8de7e;\n margin-top: -1px;\n opacity: .7;\n }\n\n // Markdown Styles\n\n .syntax--source.syntax--gfm {\n color: #999;\n }\n\n .syntax--gfm {\n .syntax--markup.syntax--heading {\n color: #eee;\n }\n\n .syntax--link {\n color: #555;\n }\n\n .syntax--variable.syntax--list,\n .syntax--support.syntax--quote {\n color: #555;\n }\n\n .syntax--link .syntax--entity {\n color: #ddd;\n }\n\n .syntax--raw {\n color: #aaa;\n }\n }\n\n .syntax--markdown {\n .syntax--paragraph {\n color: #999;\n }\n\n .syntax--heading {\n color: #eee;\n }\n\n .syntax--raw {\n color: #aaa;\n }\n\n .syntax--link {\n color: #555;\n\n .syntax--string {\n color: #555;\n\n &.syntax--title {\n color: #ddd;\n }\n }\n }\n }\n}\n\n.syntax--comment {\n color: #7C7C7C;\n}\n\n.syntax--entity {\n color: #FFD2A7;\n\n &.syntax--name.syntax--type {\n text-decoration: underline;\n color: #FFFFB6;\n }\n\n &.syntax--other.syntax--inherited-class {\n color: #9B5C2E;\n }\n}\n\n.syntax--keyword {\n color: #96CBFE;\n\n &.syntax--control {\n color: #96CBFE;\n }\n\n &.syntax--operator {\n color: #EDEDED;\n }\n}\n\n.syntax--storage {\n color: #CFCB90;\n\n &.syntax--modifier {\n color: #96CBFE;\n }\n}\n\n.syntax--constant {\n color: #99CC99;\n\n &.syntax--numeric {\n color: #FF73FD;\n }\n}\n\n.syntax--variable {\n color: #C6C5FE;\n}\n\n.syntax--invalid.syntax--deprecated {\n text-decoration: underline;\n color: #FD5FF1;\n}\n\n.syntax--invalid.syntax--illegal {\n color: #FD5FF1;\n background-color: rgba(86, 45, 86, 0.75);\n}\n\n// String interpolation in Ruby, CoffeeScript, and others\n.syntax--string {\n .syntax--source,\n .syntax--meta.syntax--embedded.syntax--line {\n color: #EDEDED;\n }\n\n .syntax--punctuation.syntax--section.syntax--embedded {\n color: #00A0A0;\n\n .syntax--source {\n color: #00A0A0; // Required for the end of embedded strings in Ruby #716\n }\n }\n}\n\n.syntax--string {\n color: #A8FF60;\n\n .syntax--constant {\n color: #00A0A0;\n }\n\n &.syntax--regexp {\n color: #E9C062;\n\n .syntax--constant.syntax--character.syntax--escape,\n .syntax--source.syntax--ruby.syntax--embedded,\n .syntax--string.syntax--regexp.syntax--arbitrary-repetition {\n color: #FF8000;\n }\n\n &.syntax--group {\n color: #C6A24F;\n background-color: rgba(255, 255, 255, 0.06);\n }\n\n &.syntax--character-class {\n color: #B18A3D;\n }\n }\n\n .syntax--variable {\n color: #8A9A95;\n }\n}\n\n.syntax--support {\n color: #FFFFB6;\n\n &.syntax--function {\n color: #DAD085;\n }\n\n &.syntax--constant {\n color: #FFD2A7;\n }\n\n &.syntax--type.syntax--property-name.syntax--css {\n color: #EDEDED;\n }\n}\n\n.syntax--source .syntax--entity.syntax--name.syntax--tag,\n.syntax--source .syntax--punctuation.syntax--tag {\n color: #96CBFE;\n}\n.syntax--source .syntax--entity.syntax--other.syntax--attribute-name {\n color: #C6C5FE;\n}\n\n.syntax--entity {\n &.syntax--other.syntax--attribute-name {\n color: #C6C5FE;\n }\n\n &.syntax--name.syntax--tag.syntax--namespace,\n &.syntax--other.syntax--attribute-name.syntax--namespace {\n color: #E18964;\n }\n}\n\n.syntax--meta {\n &.syntax--preprocessor.syntax--c {\n color: #8996A8;\n }\n\n &.syntax--preprocessor.syntax--c .syntax--keyword {\n color: #AFC4DB;\n }\n\n &.syntax--cast {\n color: #676767;\n }\n\n &.syntax--sgml.syntax--html .syntax--meta.syntax--doctype,\n &.syntax--sgml.syntax--html .syntax--meta.syntax--doctype .syntax--entity,\n &.syntax--sgml.syntax--html .syntax--meta.syntax--doctype .syntax--string,\n &.syntax--xml-processing,\n &.syntax--xml-processing .syntax--entity,\n &.syntax--xml-processing .syntax--string {\n color: #494949;\n }\n\n &.syntax--tag .syntax--entity,\n &.syntax--tag > .syntax--punctuation,\n &.syntax--tag.syntax--inline .syntax--entity {\n color: #C6C5FE;\n }\n &.syntax--tag .syntax--name,\n &.syntax--tag.syntax--inline .syntax--name,\n &.syntax--tag > .syntax--punctuation {\n color: #96CBFE;\n }\n\n &.syntax--selector.syntax--css .syntax--entity.syntax--name.syntax--tag {\n text-decoration: underline;\n color: #96CBFE;\n }\n\n &.syntax--selector.syntax--css .syntax--entity.syntax--other.syntax--attribute-name.syntax--tag.syntax--pseudo-class {\n color: #8F9D6A;\n }\n\n &.syntax--selector.syntax--css .syntax--entity.syntax--other.syntax--attribute-name.syntax--id {\n color: #8B98AB;\n }\n\n &.syntax--selector.syntax--css .syntax--entity.syntax--other.syntax--attribute-name.syntax--class {\n color: #62B1FE;\n }\n\n &.syntax--property-group .syntax--support.syntax--constant.syntax--property-value.syntax--css,\n &.syntax--property-value .syntax--support.syntax--constant.syntax--property-value.syntax--css {\n color: #F9EE98;\n }\n\n &.syntax--preprocessor.syntax--at-rule .syntax--keyword.syntax--control.syntax--at-rule {\n color: #8693A5;\n }\n\n &.syntax--property-value .syntax--support.syntax--constant.syntax--named-color.syntax--css,\n &.syntax--property-value .syntax--constant {\n color: #87C38A;\n }\n\n &.syntax--constructor.syntax--argument.syntax--css {\n color: #8F9D6A;\n }\n\n &.syntax--diff,\n &.syntax--diff.syntax--header {\n color: #F8F8F8;\n background-color: #0E2231;\n }\n\n &.syntax--separator {\n color: #60A633;\n background-color: #242424;\n }\n\n &.syntax--line.syntax--entry.syntax--logfile,\n &.syntax--line.syntax--exit.syntax--logfile {\n background-color: rgba(238, 238, 238, 0.16);\n }\n\n &.syntax--line.syntax--error.syntax--logfile {\n background-color: #751012;\n }\n}\n","digest":"1c821a8c2a7eeead87c8d5f1418a77999fd54335"},"node_modules/atom-dark-syntax/styles/syntax-variables.less":{"content":"// This defines all syntax variables that syntax themes must implement when they\n// include a syntax-variables.less file.\n\n// General colors\n@syntax-text-color: #c5c8c6;\n@syntax-cursor-color: white;\n@syntax-selection-color: #444;\n@syntax-selection-flash-color: #eee;\n@syntax-background-color: #1d1f21;\n\n// Guide colors\n@syntax-wrap-guide-color: rgba(197, 200, 198, .1);\n@syntax-indent-guide-color: rgba(197, 200, 198, .2);\n@syntax-invisible-character-color: rgba(197, 200, 198, .2);\n\n// For find and replace markers\n@syntax-result-marker-color: #888;\n@syntax-result-marker-color-selected: white;\n\n// Gutter colors\n@syntax-gutter-text-color: @syntax-text-color;\n@syntax-gutter-text-color-selected: @syntax-gutter-text-color;\n@syntax-gutter-background-color: lighten(@syntax-background-color, 5%);\n@syntax-gutter-background-color-selected: rgba(255, 255, 255, 0.14);\n\n// For git diff info. i.e. in the gutter\n@syntax-color-renamed: #96CBFE;\n@syntax-color-added: #A8FF60;\n@syntax-color-modified: #E9C062;\n@syntax-color-removed: #CC6666;\n\n// For language entity colors\n@syntax-color-variable: #C6C5FE;\n@syntax-color-constant: #99CC99;\n@syntax-color-property: #EDEDED;\n@syntax-color-value: #F9EE98;\n@syntax-color-function: #DAD085;\n@syntax-color-method: @syntax-color-function;\n@syntax-color-class: #62B1FE;\n@syntax-color-keyword: #96CBFE;\n@syntax-color-tag: #96CBFE;\n@syntax-color-attribute: #C6C5FE;\n@syntax-color-import: @syntax-color-keyword;\n@syntax-color-snippet: @syntax-color-constant;\n","digest":"df71fe29adb4c75717824afcb98e8d17e62d9e5d"},"node_modules/atom-light-syntax/index.less":{"content":"@import \"variables/ui-variables\";\n@import \"variables/syntax-variables\";\n@import 'syntax-variables';\n\natom-text-editor {\n background-color: @syntax-background-color;\n color: @syntax-text-color;\n\n .invisible-character {\n color: @syntax-invisible-character-color;\n }\n\n .indent-guide {\n color: @syntax-indent-guide-color;\n }\n\n .wrap-guide {\n background-color: @syntax-wrap-guide-color;\n }\n\n .gutter {\n color: @syntax-gutter-text-color;\n background: @syntax-gutter-background-color;\n }\n\n .gutter .line-number.folded,\n .gutter .line-number:after,\n .fold-marker:after {\n color: #e87b00;\n }\n\n .invisible {\n color: #555;\n }\n\n .selection .region {\n background-color: #e1e1e1;\n }\n\n .bracket-matcher .region {\n background-color: #C9C9C9;\n opacity: .7;\n border-bottom: 0 none;\n }\n\n &.is-focused {\n .cursor {\n border-color: @syntax-cursor-color;\n }\n\n .selection .region {\n background-color: @syntax-selection-color;\n }\n\n .line-number.cursor-line-no-selection,\n .line.cursor-line {\n background-color: @syntax-gutter-background-color-selected;\n }\n }\n\n // Markdown\n .syntax--source.syntax--gfm {\n color: #444;\n }\n\n .syntax--gfm {\n .syntax--markup.syntax--heading {\n color: #111;\n }\n\n & .syntax--link {\n color: #888;\n }\n\n .syntax--variable.syntax--list {\n color: #888;\n }\n }\n\n .syntax--markdown {\n .syntax--paragraph {\n color: #444;\n }\n\n .syntax--heading {\n color: #111;\n }\n\n .syntax--link {\n color: #888;\n\n .syntax--string {\n color: #888;\n }\n }\n }\n}\n\n.syntax--comment {\n color: #999988;\n font-style: italic;\n}\n\n.syntax--string {\n color: #D14;\n}\n\n// String interpolation in Ruby, CoffeeScript, and others\n.syntax--string {\n .syntax--source,\n .syntax--meta.syntax--embedded.syntax--line {\n color: #5A5A5A;\n }\n\n .syntax--punctuation.syntax--section.syntax--embedded {\n color: #920B2D;\n\n .syntax--source {\n color: #920B2D; // Required for the end of embedded strings in Ruby #716\n }\n }\n}\n\n.syntax--constant {\n &.syntax--numeric {\n color: #D14;\n }\n\n &.syntax--language {\n color: #606aa1;\n }\n\n &.syntax--character,\n &.syntax--other {\n color: #606aa1;\n }\n\n &.syntax--symbol {\n color: #990073;\n }\n\n &.syntax--numeric.syntax--line-number.syntax--find-in-files .syntax--match {\n color: rgba(143, 190, 0, 0.63);\n }\n}\n\n.syntax--variable {\n color: #008080;\n\n &.syntax--parameter {\n color: #606aa1;\n }\n}\n\n// Keywords\n.syntax--keyword {\n color: #222;\n font-weight: bold;\n\n &.syntax--unit {\n color: #445588;\n }\n\n &.syntax--special-method {\n color: #0086B3;\n }\n}\n\n.syntax--storage {\n color: #222;\n\n &.syntax--type {\n color: #222;\n }\n}\n\n.syntax--entity {\n &.syntax--name.syntax--class {\n text-decoration: underline;\n color: #606aa1;\n }\n\n &.syntax--other.syntax--inherited-class {\n text-decoration: underline;\n color: #606aa1;\n }\n\n &.syntax--name.syntax--function {\n color: #900;\n }\n\n &.syntax--name.syntax--tag {\n color: #008080;\n }\n\n &.syntax--other.syntax--attribute-name {\n color: #458;\n font-weight: bold;\n }\n\n &.syntax--name.syntax--filename.syntax--find-in-files {\n color: #E6DB74;\n }\n}\n\n.syntax--support {\n &.syntax--constant,\n &.syntax--function,\n &.syntax--type {\n color: #458;\n }\n\n &.syntax--class {\n color: #008080;\n }\n}\n\n.syntax--invalid {\n color: #F8F8F0;\n background-color: #00A8C6;\n\n &.syntax--deprecated {\n color: #F8F8F0;\n background-color: #8FBE00;\n }\n}\n\n\n.syntax--meta {\n &.syntax--structure.syntax--dictionary.syntax--json > .syntax--string.syntax--quoted.syntax--double.syntax--json,\n &.syntax--structure.syntax--dictionary.syntax--json > .syntax--string.syntax--quoted.syntax--double.syntax--json .syntax--punctuation.syntax--string {\n color: #000080;\n }\n\n &.syntax--structure.syntax--dictionary.syntax--value.syntax--json > .syntax--string.syntax--quoted.syntax--double.syntax--json {\n color: #d14;\n }\n\n &.syntax--diff,\n &.syntax--diff.syntax--header {\n color: #75715E;\n }\n}\n\n// CSS Styles\n.syntax--css {\n &.syntax--support.syntax--property-name {\n font-weight: bold;\n color: #333;\n }\n\n &.syntax--constant {\n color: #099;\n }\n}\n","digest":"02b83dbf2b55618e4b45afe8b3e615b819494907"},"node_modules/atom-light-syntax/styles/syntax-variables.less":{"content":"// This defines all syntax variables that syntax themes must implement when they\n// include a syntax-variables.less file.\n\n// General colors\n@syntax-text-color: #555;\n@syntax-cursor-color: black;\n@syntax-selection-color: #afc4da;\n@syntax-selection-flash-color: #69c;\n@syntax-background-color: white;\n\n// Guide colors\n@syntax-wrap-guide-color: rgba(85, 85, 85, .2);\n@syntax-indent-guide-color: rgba(85, 85, 85, .2);\n@syntax-invisible-character-color: rgba(85, 85, 85, .2);\n\n// For find and replace markers\n@syntax-result-marker-color: #999;\n@syntax-result-marker-color-selected: black;\n\n// Gutter colors\n@syntax-gutter-text-color: @syntax-text-color;\n@syntax-gutter-text-color-selected: @syntax-gutter-text-color;\n@syntax-gutter-background-color: white;\n@syntax-gutter-background-color-selected: rgba(255, 255, 134, 0.34);\n\n// For git diff info. i.e. in the gutter\n@syntax-color-renamed: #96CBFE;\n@syntax-color-added: #718C00;\n@syntax-color-modified: #ff982d;\n@syntax-color-removed: #D14;\n\n// For language entity colors\n@syntax-color-variable: #008080;\n@syntax-color-constant: #099;\n@syntax-color-property: #333;\n@syntax-color-value: @syntax-color-constant;\n@syntax-color-function: #900;\n@syntax-color-method: @syntax-color-function;\n@syntax-color-class: #606aa1;\n@syntax-color-keyword: #222;\n@syntax-color-tag: #008080;\n@syntax-color-attribute: #458;\n@syntax-color-import: @syntax-color-keyword;\n@syntax-color-snippet: @syntax-color-constant;\n","digest":"622c25b2fa9b894bc851f17b9229b5392852aebe"},"node_modules/base16-tomorrow-dark-theme/index.less":{"content":"@import \"variables/ui-variables\";\n@import \"variables/syntax-variables\";\n\n// Base16 Tomorrow Dark theme\n\n@import \"styles/syntax-variables.less\";\n\n@import \"styles/editor.less\";\n\n@import \"styles/syntax/_base.less\";\n@import \"styles/syntax/cs.less\";\n@import \"styles/syntax/json.less\";\n","digest":"dd476301964de421e40efac1cf8716e909a1d386"},"node_modules/base16-tomorrow-dark-theme/styles/colors.less":{"content":"\n// Base16 Tomorrow\n// A color scheme by Chris Kempson (http://chriskempson.com)\n\n// Grayscale\n@black: #1d1f21; // 00\n@very-dark-gray: #282a2e; // 01\n@dark-gray: #373b41; // 02\n@gray: #969896; // 03\n@light-gray: #b4b7b4; // 04\n@very-light-gray: #c5c8c6; // 05\n@almost-white: #e0e0e0; // 06\n@white: #ffffff; // 07\n\n// Colors\n@red: #cc6666; // 08\n@orange: #de935f; // 09\n@yellow: #f0c674; // 0A\n@green: #b5bd68; // 0B\n@cyan: #8abeb7; // 0C\n@blue: #81a2be; // 0D\n@purple: #b294bb; // 0E\n@brown: #a3685a; // 0F\n","digest":"7065bcfeb89ff1d1b5f71d142576133e451415d7"},"node_modules/base16-tomorrow-dark-theme/styles/editor.less":{"content":"\n// Editor styles (background, gutter, guides)\n\natom-text-editor {\n background-color: @syntax-background-color;\n color: @syntax-text-color;\n\n .wrap-guide {\n background-color: @syntax-wrap-guide-color;\n }\n\n .indent-guide {\n color: @syntax-indent-guide-color;\n }\n\n .invisible-character {\n color: @syntax-invisible-character-color;\n }\n\n .gutter {\n background-color: @syntax-gutter-background-color;\n color: @syntax-gutter-text-color;\n\n .line-number {\n padding: 0 0.25em 0 0.5em;\n -webkit-font-smoothing: antialiased;\n &.cursor-line {\n background-color: @syntax-gutter-background-color-selected;\n color: @syntax-gutter-text-color-selected;\n }\n\n &.cursor-line-no-selection {\n color: @syntax-gutter-text-color-selected;\n }\n }\n }\n\n .gutter .line-number.folded,\n .gutter .line-number:after,\n .fold-marker:after {\n color: @syntax-result-marker-color;\n }\n\n .invisible {\n color: @syntax-text-color;\n }\n\n .cursor {\n color: @syntax-cursor-color;\n }\n\n .selection .region {\n background-color: @syntax-selection-color;\n }\n\n .bracket-matcher .region {\n border-color: @syntax-result-marker-color;\n }\n}\n","digest":"e169e4520f6a8966fbd8e49fc9f30aa162c85050"},"node_modules/base16-tomorrow-dark-theme/styles/syntax-variables.less":{"content":"@import \"colors.less\";\n\n// Official Syntax Variables\n\n// General colors\n@syntax-text-color: @very-light-gray;\n@syntax-cursor-color: @white;\n@syntax-selection-color: @dark-gray;\n@syntax-selection-flash-color: @very-light-gray;\n@syntax-background-color: @black;\n\n// Guide colors\n@syntax-wrap-guide-color: mix(@gray, @dark-gray);\n@syntax-indent-guide-color: mix(@gray, @dark-gray);\n@syntax-invisible-character-color: mix(@gray, @dark-gray);\n\n// For find and replace markers\n@syntax-result-marker-color: @gray;\n@syntax-result-marker-color-selected: @white;\n\n// Gutter colors\n@syntax-gutter-text-color: @gray;\n@syntax-gutter-text-color-selected: @very-light-gray;\n@syntax-gutter-background-color: @syntax-background-color;\n@syntax-gutter-background-color-selected: @syntax-selection-color;\n\n// For git diff info. i.e. in the gutter\n@syntax-color-renamed: @blue;\n@syntax-color-added: @green;\n@syntax-color-modified: @orange;\n@syntax-color-removed: @red;\n\n// For language entity colors\n@syntax-color-variable: @red;\n@syntax-color-constant: @orange;\n@syntax-color-property: @syntax-text-color;\n@syntax-color-value: @green;\n@syntax-color-function: @blue;\n@syntax-color-method: @blue;\n@syntax-color-class: @yellow;\n@syntax-color-keyword: @purple;\n@syntax-color-tag: @red;\n@syntax-color-attribute: @orange;\n@syntax-color-import: @purple;\n@syntax-color-snippet: @green;\n","digest":"9411e7e5f74fe122e80ee78f47c8deb31c6ec0b6"},"node_modules/base16-tomorrow-dark-theme/styles/syntax/_base.less":{"content":"\n// Language syntax highlighting\n\n.syntax--comment {\n color: @gray;\n\n .syntax--markup.syntax--link {\n color: @gray;\n }\n}\n\n.syntax--entity {\n\n &.syntax--name.syntax--type {\n color: @yellow;\n }\n\n &.syntax--other.syntax--inherited-class {\n color: @green;\n }\n}\n\n.syntax--keyword {\n color: @purple;\n\n &.syntax--control {\n color: @purple;\n }\n\n &.syntax--operator {\n color: @syntax-text-color;\n }\n\n &.syntax--other.syntax--special-method {\n color: @blue;\n }\n\n &.syntax--other.syntax--unit {\n color: @orange;\n }\n}\n\n.syntax--storage {\n color: @purple;\n}\n\n.syntax--constant {\n color: @orange;\n\n &.syntax--character.syntax--escape {\n color: @cyan;\n }\n\n &.syntax--numeric {\n color: @orange;\n }\n\n &.syntax--other.syntax--color {\n color: @cyan;\n }\n\n &.syntax--other.syntax--symbol {\n color: @green;\n }\n}\n\n.syntax--variable {\n color: @red;\n\n &.syntax--interpolation {\n color: @brown;\n }\n\n &.syntax--parameter.syntax--function {\n color: @syntax-text-color;\n }\n}\n\n.syntax--invalid.syntax--illegal {\n background-color: @red;\n color: @syntax-background-color;\n}\n\n.syntax--string {\n color: @green;\n\n\n &.syntax--regexp {\n color: @cyan;\n\n .syntax--source.syntax--ruby.syntax--embedded {\n color: @yellow;\n }\n }\n\n &.syntax--other.syntax--link {\n color: @red;\n }\n}\n\n.syntax--punctuation {\n &.syntax--definition {\n &.syntax--parameters,\n &.syntax--array {\n color: @syntax-text-color;\n }\n\n &.syntax--heading,\n &.syntax--identity {\n color: @blue;\n }\n\n &.syntax--bold {\n color: @yellow;\n font-weight: bold;\n }\n\n &.syntax--italic {\n color: @purple;\n font-style: italic;\n }\n }\n\n &.syntax--section {\n &.syntax--embedded {\n color: @brown;\n }\n\n &.syntax--method,\n &.syntax--class,\n &.syntax--inner-class {\n color: @syntax-text-color;\n }\n }\n}\n\n.syntax--support {\n &.syntax--class {\n color: @yellow;\n }\n\n &.syntax--function {\n color: @cyan;\n\n &.syntax--any-method {\n color: @blue;\n }\n }\n}\n\n.syntax--entity {\n\n &.syntax--name.syntax--function {\n color: @blue;\n }\n\n &.syntax--name.syntax--class, &.syntax--name.syntax--type.syntax--class {\n color: @yellow;\n }\n\n &.syntax--name.syntax--section {\n color: @blue;\n }\n\n &.syntax--name.syntax--tag {\n color: @red;\n }\n\n &.syntax--other.syntax--attribute-name {\n color: @orange;\n\n &.syntax--id {\n color: @blue;\n }\n }\n}\n\n.syntax--meta {\n &.syntax--class {\n color: @yellow;\n\n &.syntax--body {\n color: @syntax-text-color;\n }\n }\n\n &.syntax--link {\n color: @orange;\n }\n\n &.syntax--method-call,\n &.syntax--method {\n color: @syntax-text-color;\n }\n\n &.syntax--require {\n color: @blue;\n }\n\n &.syntax--selector {\n color: @purple;\n }\n\n &.syntax--separator {\n background-color: #373b41;\n color: @syntax-text-color;\n }\n\n &.syntax--tag {\n color: @syntax-text-color;\n }\n}\n\n.syntax--none {\n color: @syntax-text-color;\n}\n\n.syntax--markup {\n &.syntax--bold {\n color: @orange;\n font-weight: bold;\n }\n\n &.syntax--changed {\n color: @purple;\n }\n\n &.syntax--deleted {\n color: @red;\n }\n\n &.syntax--italic {\n color: @purple;\n font-style: italic;\n }\n\n &.syntax--heading {\n color: @red;\n\n .syntax--punctuation.syntax--definition.syntax--heading {\n color: @blue;\n }\n }\n\n &.syntax--link {\n color: @blue;\n }\n\n &.syntax--inserted {\n color: @green;\n }\n\n &.syntax--quote {\n color: @orange;\n }\n\n &.syntax--raw {\n color: @green;\n }\n}\n\n.syntax--source.syntax--gfm {\n .syntax--markup {\n -webkit-font-smoothing: auto;\n }\n\n .syntax--link .syntax--entity {\n color: @cyan;\n }\n}\n","digest":"d1306472e8c62c0f10a2cbac0b9eba5c4aa325d9"},"node_modules/base16-tomorrow-dark-theme/styles/syntax/cs.less":{"content":".syntax--source.syntax--cs {\n .syntax--keyword.syntax--operator {\n color: @purple;\n }\n}\n","digest":"ab8e60371daf69b881f4800e1ebbee4b27ca0596"},"node_modules/base16-tomorrow-dark-theme/styles/syntax/json.less":{"content":".syntax--source.syntax--json {\n .syntax--meta.syntax--structure.syntax--dictionary.syntax--json {\n & > .syntax--string.syntax--quoted.syntax--json {\n & > .syntax--punctuation.syntax--string {\n color: @red;\n }\n color: @red;\n }\n }\n\n .syntax--meta.syntax--structure.syntax--dictionary.syntax--json, .syntax--meta.syntax--structure.syntax--array.syntax--json {\n & > .syntax--value.syntax--json > .syntax--string.syntax--quoted.syntax--json,\n & > .syntax--value.syntax--json > .syntax--string.syntax--quoted.syntax--json > .syntax--punctuation {\n color: @green;\n }\n\n & > .syntax--constant.syntax--language.syntax--json {\n color: @cyan;\n }\n }\n}\n","digest":"98318eea0552874ff8e38add508f6b1f0b1cd0a5"},"node_modules/base16-tomorrow-light-theme/index.less":{"content":"@import \"variables/ui-variables\";\n@import \"variables/syntax-variables\";\n\n// Base16 Tomorrow Light\n\n@import \"styles/syntax-variables.less\";\n\n@import \"styles/editor.less\";\n\n@import \"styles/syntax/_base.less\";\n@import \"styles/syntax/cs.less\";\n@import \"styles/syntax/json.less\";\n","digest":"6892e2b19d038cf18f9f3a32e955dc02fe13c8b5"},"node_modules/base16-tomorrow-light-theme/styles/colors.less":{"content":"\n// Base16 Tomorrow\n// A color scheme by Chris Kempson (http://chriskempson.com)\n\n// Grayscale\n@black: #1d1f21; // 00\n@very-dark-gray: #282a2e; // 01\n@dark-gray: #373b41; // 02\n@gray: #969896; // 03\n@light-gray: #b4b7b4; // 04\n@very-light-gray: #c5c8c6; // 05\n@almost-white: #e0e0e0; // 06\n@white: #ffffff; // 07\n\n// Colors\n@red: #cc6666; // 08\n@orange: #de935f; // 09\n@yellow: #f0c674; // 0A\n@green: #b5bd68; // 0B\n@cyan: #8abeb7; // 0C\n@blue: #81a2be; // 0D\n@purple: #b294bb; // 0E\n@brown: #a3685a; // 0F\n","digest":"7065bcfeb89ff1d1b5f71d142576133e451415d7"},"node_modules/base16-tomorrow-light-theme/styles/editor.less":{"content":"\n// Editor styles (background, gutter, guides)\n\natom-text-editor {\n background-color: @syntax-background-color;\n color: @syntax-text-color;\n\n .wrap-guide {\n background-color: @syntax-wrap-guide-color;\n }\n\n .indent-guide {\n color: @syntax-indent-guide-color;\n }\n\n .invisible-character {\n color: @syntax-invisible-character-color;\n }\n\n .gutter {\n background-color: @syntax-gutter-background-color;\n color: @syntax-gutter-text-color;\n\n .line-number {\n padding: 0 0.25em 0 0.5em;\n -webkit-font-smoothing: antialiased;\n &.cursor-line {\n background-color: @syntax-gutter-background-color-selected;\n color: @syntax-gutter-text-color-selected;\n }\n\n &.cursor-line-no-selection {\n color: @syntax-gutter-text-color-selected;\n }\n }\n }\n\n .gutter .line-number.folded,\n .gutter .line-number:after,\n .fold-marker:after {\n color: @syntax-result-marker-color;\n }\n\n .invisible {\n color: @syntax-text-color;\n }\n\n .cursor {\n color: @syntax-cursor-color;\n }\n\n .selection .region {\n background-color: @syntax-selection-color;\n }\n\n .bracket-matcher .region {\n border-color: @syntax-result-marker-color;\n }\n}\n","digest":"e169e4520f6a8966fbd8e49fc9f30aa162c85050"},"node_modules/base16-tomorrow-light-theme/styles/syntax-variables.less":{"content":"@import \"colors.less\";\n\n// Official Syntax Variables\n\n// General colors\n@syntax-text-color: @black;\n@syntax-cursor-color: @black;\n@syntax-selection-color: @almost-white;\n@syntax-selection-flash-color: @very-dark-gray;\n@syntax-background-color: @white;\n\n// Guide colors\n@syntax-wrap-guide-color: @very-light-gray;\n@syntax-indent-guide-color: @very-light-gray;\n@syntax-invisible-character-color: @very-light-gray;\n\n// For find and replace markers\n@syntax-result-marker-color: @light-gray;\n@syntax-result-marker-color-selected: @very-light-gray;\n\n// Gutter colors\n@syntax-gutter-text-color: @light-gray;\n@syntax-gutter-text-color-selected: @dark-gray;\n@syntax-gutter-background-color: @syntax-background-color;\n@syntax-gutter-background-color-selected: @syntax-selection-color;\n\n// For git diff info. i.e. in the gutter\n@syntax-color-renamed: @blue;\n@syntax-color-added: @green;\n@syntax-color-modified: @orange;\n@syntax-color-removed: @red;\n\n// For language entity colors\n@syntax-color-variable: @red;\n@syntax-color-constant: @orange;\n@syntax-color-property: @syntax-text-color;\n@syntax-color-value: @green;\n@syntax-color-function: @blue;\n@syntax-color-method: @blue;\n@syntax-color-class: @yellow;\n@syntax-color-keyword: @purple;\n@syntax-color-tag: @red;\n@syntax-color-attribute: @orange;\n@syntax-color-import: @purple;\n@syntax-color-snippet: @green;\n","digest":"d09bce39e451df301e4e01787640d3c81c19a0d8"},"node_modules/base16-tomorrow-light-theme/styles/syntax/_base.less":{"content":"\n// Language syntax highlighting\n\n.syntax--comment {\n color: @gray;\n\n .syntax--markup.syntax--link {\n color: @gray;\n }\n}\n\n.syntax--entity {\n\n &.syntax--name.syntax--type {\n color: @yellow;\n }\n\n &.syntax--other.syntax--inherited-class {\n color: @green;\n }\n}\n\n.syntax--keyword {\n color: @purple;\n\n &.syntax--control {\n color: @purple;\n }\n\n &.syntax--operator {\n color: @syntax-text-color;\n }\n\n &.syntax--other.syntax--special-method {\n color: @blue;\n }\n\n &.syntax--other.syntax--unit {\n color: @orange;\n }\n}\n\n.syntax--storage {\n color: @purple;\n}\n\n.syntax--constant {\n color: @orange;\n\n &.syntax--character.syntax--escape {\n color: @cyan;\n }\n\n &.syntax--numeric {\n color: @orange;\n }\n\n &.syntax--other.syntax--color {\n color: @cyan;\n }\n\n &.syntax--other.syntax--symbol {\n color: @green;\n }\n}\n\n.syntax--variable {\n color: @red;\n\n &.syntax--interpolation {\n color: @brown;\n }\n\n &.syntax--parameter.syntax--function {\n color: @syntax-text-color;\n }\n}\n\n.syntax--invalid.syntax--illegal {\n background-color: @red;\n color: @syntax-background-color;\n}\n\n.syntax--string {\n color: @green;\n\n\n &.syntax--regexp {\n color: @cyan;\n\n .syntax--source.syntax--ruby.syntax--embedded {\n color: @yellow;\n }\n }\n\n &.syntax--other.syntax--link {\n color: @red;\n }\n}\n\n.syntax--punctuation {\n &.syntax--definition {\n &.syntax--parameters,\n &.syntax--array {\n color: @syntax-text-color;\n }\n\n &.syntax--heading,\n &.syntax--identity {\n color: @blue;\n }\n\n &.syntax--bold {\n color: @yellow;\n font-weight: bold;\n }\n\n &.syntax--italic {\n color: @purple;\n font-style: italic;\n }\n }\n\n &.syntax--section {\n &.syntax--embedded {\n color: @brown;\n }\n\n &.syntax--method,\n &.syntax--class,\n &.syntax--inner-class {\n color: @syntax-text-color;\n }\n }\n}\n\n.syntax--support {\n &.syntax--class {\n color: @yellow;\n }\n\n &.syntax--function {\n color: @cyan;\n\n &.syntax--any-method {\n color: @blue;\n }\n }\n}\n\n.syntax--entity {\n\n &.syntax--name.syntax--function {\n color: @blue;\n }\n\n &.syntax--name.syntax--class, &.syntax--name.syntax--type.syntax--class {\n color: @yellow;\n }\n\n &.syntax--name.syntax--section {\n color: @blue;\n }\n\n &.syntax--name.syntax--tag {\n color: @red;\n }\n\n &.syntax--other.syntax--attribute-name {\n color: @orange;\n\n &.syntax--id {\n color: @blue;\n }\n }\n}\n\n.syntax--meta {\n &.syntax--class {\n color: @yellow;\n\n &.syntax--body {\n color: @syntax-text-color;\n }\n }\n\n &.syntax--link {\n color: @orange;\n }\n\n &.syntax--method-call,\n &.syntax--method {\n color: @syntax-text-color;\n }\n\n &.syntax--require {\n color: @blue;\n }\n\n &.syntax--selector {\n color: @purple;\n }\n\n &.syntax--separator {\n background-color: #373b41;\n color: @syntax-text-color;\n }\n\n &.syntax--tag {\n color: @syntax-text-color;\n }\n}\n\n.syntax--none {\n color: @syntax-text-color;\n}\n\n.syntax--markup {\n &.syntax--bold {\n color: @orange;\n font-weight: bold;\n }\n\n &.syntax--changed {\n color: @purple;\n }\n\n &.syntax--deleted {\n color: @red;\n }\n\n &.syntax--italic {\n color: @purple;\n font-style: italic;\n }\n\n &.syntax--heading {\n color: @red;\n\n .syntax--punctuation.syntax--definition.syntax--heading {\n color: @blue;\n }\n }\n\n &.syntax--link {\n color: @blue;\n }\n\n &.syntax--inserted {\n color: @green;\n }\n\n &.syntax--quote {\n color: @orange;\n }\n\n &.syntax--raw {\n color: @green;\n }\n}\n\n.syntax--source.syntax--gfm {\n .syntax--markup {\n -webkit-font-smoothing: auto;\n }\n\n .syntax--link .syntax--entity {\n color: @cyan;\n }\n}\n","digest":"d1306472e8c62c0f10a2cbac0b9eba5c4aa325d9"},"node_modules/base16-tomorrow-light-theme/styles/syntax/cs.less":{"content":".syntax--source.syntax--cs {\n .syntax--keyword.syntax--operator {\n color: @purple;\n }\n}\n","digest":"ab8e60371daf69b881f4800e1ebbee4b27ca0596"},"node_modules/base16-tomorrow-light-theme/styles/syntax/json.less":{"content":".syntax--source.syntax--json {\n .syntax--meta.syntax--structure.syntax--dictionary.syntax--json {\n & > .syntax--string.syntax--quoted.syntax--json {\n & > .syntax--punctuation.syntax--string {\n color: @red;\n }\n color: @red;\n }\n }\n\n .syntax--meta.syntax--structure.syntax--dictionary.syntax--json, .syntax--meta.syntax--structure.syntax--array.syntax--json {\n & > .syntax--value.syntax--json > .syntax--string.syntax--quoted.syntax--json,\n & > .syntax--value.syntax--json > .syntax--string.syntax--quoted.syntax--json > .syntax--punctuation {\n color: @green;\n }\n\n & > .syntax--constant.syntax--language.syntax--json {\n color: @cyan;\n }\n }\n}\n","digest":"98318eea0552874ff8e38add508f6b1f0b1cd0a5"},"node_modules/one-dark-syntax/index.less":{"content":"@import \"variables/ui-variables\";\n@import \"variables/syntax-variables\";\n\n// Atom Syntax Theme: One\n\n@import \"styles/syntax-variables.less\";\n\n@import \"styles/editor.less\";\n\n@import \"styles/syntax/_base.less\";\n@import \"styles/syntax/c.less\";\n@import \"styles/syntax/cpp.less\";\n@import \"styles/syntax/cs.less\";\n@import \"styles/syntax/css.less\";\n@import \"styles/syntax/elixir.less\";\n@import \"styles/syntax/gfm.less\";\n@import \"styles/syntax/go.less\";\n@import \"styles/syntax/ini.less\";\n@import \"styles/syntax/java.less\";\n@import \"styles/syntax/javascript.less\";\n@import \"styles/syntax/json.less\";\n@import \"styles/syntax/ruby.less\";\n@import \"styles/syntax/python.less\";\n","digest":"a916d5c6a5b8d6ea37a60088aa6e4eaab8e86ff2"},"node_modules/one-dark-syntax/styles/colors.less":{"content":"\n// Config -----------------------------------\n@syntax-hue: 220;\n@syntax-saturation: 13%;\n@syntax-brightness: 18%;\n\n\n// Monochrome -----------------------------------\n@mono-1: hsl(@syntax-hue, 14%, 71%); // default text\n@mono-2: hsl(@syntax-hue, 9%, 55%);\n@mono-3: hsl(@syntax-hue, 10%, 40%);\n\n// Colors -----------------------------------\n@hue-1: hsl(187, 47%, 55%); // <-cyan\n@hue-2: hsl(207, 82%, 66%); // <-blue\n@hue-3: hsl(286, 60%, 67%); // <-purple\n@hue-4: hsl( 95, 38%, 62%); // <-green\n\n@hue-5: hsl(355, 65%, 65%); // <-red 1\n@hue-5-2: hsl( 5, 48%, 51%); // <-red 2\n\n@hue-6: hsl( 29, 54%, 61%); // <-orange 1\n@hue-6-2: hsl( 39, 67%, 69%); // <-orange 2\n\n\n// Base colors -----------------------------------\n@syntax-fg: @mono-1;\n@syntax-bg: hsl(@syntax-hue, @syntax-saturation, @syntax-brightness);\n@syntax-gutter: darken(@syntax-fg, 26%);\n@syntax-guide: fade(@syntax-fg, 15%);\n@syntax-accent: hsl(@syntax-hue, 100%, 66% );\n","digest":"66bba03e9aabff000a84c2839a9d3e9a9fa08e0e"},"node_modules/one-dark-syntax/styles/editor.less":{"content":"\n// Editor styles (background, gutter, guides)\n\natom-text-editor {\n background-color: @syntax-background-color;\n color: @syntax-text-color;\n\n .line.cursor-line {\n background-color: @syntax-cursor-line;\n }\n\n .invisible {\n color: @syntax-text-color;\n }\n\n .cursor {\n border-left: 2px solid @syntax-cursor-color;\n }\n\n .selection .region {\n background-color: @syntax-selection-color;\n }\n\n .bracket-matcher .region {\n border-bottom: 1px solid @syntax-cursor-color;\n box-sizing: border-box;\n }\n\n .invisible-character {\n color: @syntax-invisible-character-color;\n }\n\n .indent-guide {\n color: @syntax-indent-guide-color;\n }\n\n .wrap-guide {\n background-color: @syntax-wrap-guide-color;\n }\n\n // find + replace\n .find-result .region.region.region,\n .current-result .region.region.region {\n border-radius: 2px;\n background-color: @syntax-result-marker-color;\n transition: border-color .4s;\n }\n .find-result .region.region.region {\n border: 2px solid transparent;\n }\n .current-result .region.region.region {\n border: 2px solid @syntax-result-marker-color-selected;\n transition-duration: .1s;\n }\n\n .gutter {\n\n .line-number {\n color: @syntax-gutter-text-color;\n -webkit-font-smoothing: antialiased;\n\n &.cursor-line {\n color: @syntax-gutter-text-color-selected;\n background-color: @syntax-gutter-background-color-selected;\n }\n &.cursor-line-no-selection {\n background-color: transparent;\n }\n\n .icon-right {\n color: @syntax-text-color;\n }\n }\n\n &:not(.git-diff-icon) .line-number.git-line-removed {\n &.git-line-removed::before {\n bottom: -3px;\n }\n &::after {\n content: \"\";\n position: absolute;\n left: 0px;\n bottom: 0px;\n width: 25px;\n border-bottom: 1px dotted fade(@syntax-color-removed, 50%);\n pointer-events: none;\n }\n }\n }\n\n .gutter .line-number.folded,\n .gutter .line-number:after,\n .fold-marker:after {\n color: @syntax-gutter-text-color-selected;\n }\n}\n","digest":"1b282b3b38c12bf9fbb3431b172c69a70d5f81d1"},"node_modules/one-dark-syntax/styles/syntax-variables.less":{"content":"@import \"colors.less\";\n\n// Official Syntax Variables -----------------------------------\n\n// General colors\n@syntax-text-color: @syntax-fg;\n@syntax-cursor-color: @syntax-accent;\n@syntax-selection-color: lighten(@syntax-background-color, 10%);\n@syntax-selection-flash-color: @syntax-accent;\n@syntax-background-color: @syntax-bg;\n\n// Guide colors\n@syntax-wrap-guide-color: @syntax-guide;\n@syntax-indent-guide-color: @syntax-guide;\n@syntax-invisible-character-color: @syntax-guide;\n\n// For find and replace markers\n@syntax-result-marker-color: fade(@syntax-accent, 24%);\n@syntax-result-marker-color-selected: @syntax-accent;\n\n// Gutter colors\n@syntax-gutter-text-color: @syntax-gutter;\n@syntax-gutter-text-color-selected: @syntax-fg;\n@syntax-gutter-background-color: @syntax-bg; // unused\n@syntax-gutter-background-color-selected: lighten(@syntax-bg, 2%);\n\n// Git colors - For git diff info. i.e. in the gutter\n@syntax-color-renamed: hsl(208, 100%, 60%);\n@syntax-color-added: hsl(150, 60%, 54%);\n@syntax-color-modified: hsl(40, 60%, 70%);\n@syntax-color-removed: hsl(0, 70%, 60%);\n\n// For language entity colors\n@syntax-color-variable: @hue-5;\n@syntax-color-constant: @hue-6;\n@syntax-color-property: @syntax-fg;\n@syntax-color-value: @syntax-fg;\n@syntax-color-function: @hue-2;\n@syntax-color-method: @hue-2;\n@syntax-color-class: @hue-6-2;\n@syntax-color-keyword: @hue-3;\n@syntax-color-tag: @hue-5;\n@syntax-color-attribute: @hue-6;\n@syntax-color-import: @hue-3;\n@syntax-color-snippet: @hue-4;\n\n\n// Custom Syntax Variables -----------------------------------\n// Don't use in packages\n\n@syntax-cursor-line: hsla(@syntax-hue, 100%, 80%, .04); // needs to be semi-transparent to show search results\n\n@syntax-deprecated-fg: darken(@syntax-color-modified, 50%);\n@syntax-deprecated-bg: @syntax-color-modified;\n@syntax-illegal-fg: white;\n@syntax-illegal-bg: @syntax-color-removed;\n","digest":"27d6d6b87eb3e97ba0e8ef0abb31464437901513"},"node_modules/one-dark-syntax/styles/syntax/_base.less":{"content":"// Language syntax highlighting\n\n.syntax--comment {\n color: @mono-3;\n font-style: italic;\n\n .syntax--markup.syntax--link {\n color: @mono-3;\n }\n}\n\n.syntax--entity {\n\n &.syntax--name.syntax--type {\n color: @hue-6-2;\n }\n\n &.syntax--other.syntax--inherited-class {\n color: @hue-4;\n }\n}\n\n.syntax--keyword {\n color: @hue-3;\n\n &.syntax--control {\n color: @hue-3;\n }\n\n &.syntax--operator {\n color: @mono-1;\n }\n\n &.syntax--other.syntax--special-method {\n color: @hue-2;\n }\n\n &.syntax--other.syntax--unit {\n color: @hue-6;\n }\n}\n\n.syntax--storage {\n color: @hue-3;\n\n &.syntax--type {\n &.syntax--annotation,\n &.syntax--primitive {\n color: @hue-3;\n }\n }\n\n &.syntax--modifier {\n &.syntax--package,\n &.syntax--import {\n color: @mono-1;\n }\n }\n}\n\n.syntax--constant {\n color: @hue-6;\n\n &.syntax--variable {\n color: @hue-6;\n }\n\n &.syntax--character.syntax--escape {\n color: @hue-1;\n }\n\n &.syntax--numeric {\n color: @hue-6;\n }\n\n &.syntax--other.syntax--color {\n color: @hue-1;\n }\n\n &.syntax--other.syntax--symbol {\n color: @hue-1;\n }\n}\n\n.syntax--variable {\n color: @hue-5;\n\n &.syntax--interpolation {\n color: @hue-5-2;\n }\n\n &.syntax--parameter {\n color: @mono-1;\n }\n}\n\n.syntax--string {\n color: @hue-4;\n\n\n &.syntax--regexp {\n color: @hue-1;\n\n .syntax--source.syntax--ruby.syntax--embedded {\n color: @hue-6-2;\n }\n }\n\n &.syntax--other.syntax--link {\n color: @hue-5;\n }\n}\n\n.syntax--punctuation {\n &.syntax--definition {\n &.syntax--comment {\n color: @mono-3;\n }\n\n &.syntax--method-parameters,\n &.syntax--function-parameters,\n &.syntax--parameters,\n &.syntax--separator,\n &.syntax--seperator,\n &.syntax--array {\n color: @mono-1;\n }\n\n &.syntax--heading,\n &.syntax--identity {\n color: @hue-2;\n }\n\n &.syntax--bold {\n color: @hue-6-2;\n font-weight: bold;\n }\n\n &.syntax--italic {\n color: @hue-3;\n font-style: italic;\n }\n }\n\n &.syntax--section {\n &.syntax--embedded {\n color: @hue-5-2;\n }\n\n &.syntax--method,\n &.syntax--class,\n &.syntax--inner-class {\n color: @mono-1;\n }\n }\n}\n\n.syntax--support {\n &.syntax--class {\n color: @hue-6-2;\n }\n\n &.syntax--type {\n color: @hue-1;\n }\n\n &.syntax--function {\n color: @hue-1;\n\n &.syntax--any-method {\n color: @hue-2;\n }\n }\n}\n\n.syntax--entity {\n &.syntax--name.syntax--function {\n color: @hue-2;\n }\n\n &.syntax--name.syntax--class,\n &.syntax--name.syntax--type.syntax--class {\n color: @hue-6-2;\n }\n\n &.syntax--name.syntax--section {\n color: @hue-2;\n }\n\n &.syntax--name.syntax--tag {\n color: @hue-5;\n }\n\n &.syntax--other.syntax--attribute-name {\n color: @hue-6;\n\n &.syntax--id {\n color: @hue-2;\n }\n }\n}\n\n.syntax--meta {\n &.syntax--class {\n color: @hue-6-2;\n\n &.syntax--body {\n color: @mono-1;\n }\n }\n\n &.syntax--method-call,\n &.syntax--method {\n color: @mono-1;\n }\n\n &.syntax--definition {\n &.syntax--variable {\n color: @hue-5;\n }\n }\n\n &.syntax--link {\n color: @hue-6;\n }\n\n &.syntax--require {\n color: @hue-2;\n }\n\n &.syntax--selector {\n color: @hue-3;\n }\n\n &.syntax--separator {\n background-color: #373b41;\n color: @mono-1;\n }\n\n &.syntax--tag {\n color: @mono-1;\n }\n}\n\n.syntax--underline {\n text-decoration: underline;\n}\n\n.syntax--none {\n color: @mono-1;\n}\n\n.syntax--invalid {\n &.syntax--deprecated {\n color: @syntax-deprecated-fg !important;\n background-color: @syntax-deprecated-bg !important;\n }\n &.syntax--illegal {\n color: @syntax-illegal-fg !important;\n background-color: @syntax-illegal-bg !important;\n }\n}\n\n// Languages -------------------------------------------------\n\n.syntax--markup {\n &.syntax--bold {\n color: @hue-6;\n font-weight: bold;\n }\n\n &.syntax--changed {\n color: @hue-3;\n }\n\n &.syntax--deleted {\n color: @hue-5;\n }\n\n &.syntax--italic {\n color: @hue-3;\n font-style: italic;\n }\n\n &.syntax--heading {\n color: @hue-5;\n\n .syntax--punctuation.syntax--definition.syntax--heading {\n color: @hue-2;\n }\n }\n\n &.syntax--link {\n color: @hue-1;\n }\n\n &.syntax--inserted {\n color: @hue-4;\n }\n\n &.syntax--quote {\n color: @hue-6;\n }\n\n &.syntax--raw {\n color: @hue-4;\n }\n}\n","digest":"1b75db9c051ef98291f571966e03d51afb2586b3"},"node_modules/one-dark-syntax/styles/syntax/c.less":{"content":".syntax--source.syntax--c {\n .syntax--keyword.syntax--operator {\n color: @hue-3;\n }\n}\n","digest":"ad63462d9a7352e4cd1f4ec52ea6daced57a2e51"},"node_modules/one-dark-syntax/styles/syntax/cpp.less":{"content":".syntax--source.syntax--cpp {\n .syntax--keyword.syntax--operator {\n color: @hue-3;\n }\n}\n","digest":"3832ba5f453df1e76fee01bea74dbfd67d606c43"},"node_modules/one-dark-syntax/styles/syntax/cs.less":{"content":".syntax--source.syntax--cs {\n .syntax--keyword.syntax--operator {\n color: @hue-3;\n }\n}\n","digest":"c92e873b912bb6f727365589722e17220a862b65"},"node_modules/one-dark-syntax/styles/syntax/css.less":{"content":".syntax--source.syntax--css {\n // highlight properties/values if they are supported\n .syntax--property-name,\n .syntax--property-value {\n color: @mono-2;\n &.syntax--support {\n color: @mono-1;\n }\n }\n}\n","digest":"16298135832131cbf568bb0869c4019725fb5d3c"},"node_modules/one-dark-syntax/styles/syntax/elixir.less":{"content":".syntax--source.syntax--elixir {\n .syntax--source.syntax--embedded.syntax--source {\n color: @mono-1;\n }\n .syntax--constant.syntax--language,\n .syntax--constant.syntax--numeric,\n .syntax--constant.syntax--definition {\n color: @hue-2;\n }\n .syntax--variable.syntax--definition,\n .syntax--variable.syntax--anonymous{\n color: @hue-3;\n }\n .syntax--quoted{\n color: @hue-4;\n }\n .syntax--keyword.syntax--special-method,\n .syntax--embedded.syntax--section,\n .syntax--embedded.syntax--source.syntax--empty, {\n color: @hue-5;\n }\n .syntax--readwrite.syntax--module {\n .syntax--punctuation {\n color: @hue-5;\n }\n }\n .syntax--regexp.syntax--section,\n .syntax--regexp.syntax--string {\n color: @hue-5-2;\n }\n .syntax--separator,\n .syntax--keyword.syntax--operator {\n color: @hue-6;\n }\n .syntax--variable.syntax--constant {\n color: @hue-6-2;\n }\n .syntax--array,\n .syntax--scope,\n .syntax--section {\n color: @mono-2;\n }\n}\n","digest":"9c7a58879463690306239be47060f7f9ea80b85a"},"node_modules/one-dark-syntax/styles/syntax/gfm.less":{"content":".syntax--source.syntax--gfm {\n .syntax--markup {\n -webkit-font-smoothing: auto;\n }\n\n .syntax--link .syntax--entity {\n color: @hue-2;\n }\n}\n","digest":"c2da438ee70805f1b45524468243c2d97e711640"},"node_modules/one-dark-syntax/styles/syntax/go.less":{"content":".syntax--source.syntax--go {\n .syntax--storage.syntax--type.syntax--string {\n color: @hue-3;\n }\n}\n","digest":"a268ce9af009eaed960a681895dfdbb02c7e84a7"},"node_modules/one-dark-syntax/styles/syntax/ini.less":{"content":".syntax--source.syntax--ini {\n .syntax--keyword.syntax--other.syntax--definition.syntax--ini {\n color: @hue-5;\n }\n}\n","digest":"de894a7575d3add3eb4cc450e548334a674c2c43"},"node_modules/one-dark-syntax/styles/syntax/java.less":{"content":".syntax--source.syntax--java {\n .syntax--storage {\n &.syntax--modifier.syntax--import {\n color: @hue-6-2;\n }\n\n &.syntax--type {\n color: @hue-6-2;\n }\n }\n .syntax--keyword.syntax--operator.syntax--instanceof {\n color: @hue-3;\n }\n}\n\n.syntax--source.syntax--java-properties {\n .syntax--meta.syntax--key-pair {\n color: @hue-5;\n\n & > .syntax--punctuation {\n color: @mono-1;\n }\n }\n}\n","digest":"9d10d34cea50c9e3dfc500dcb00e671a564249ef"},"node_modules/one-dark-syntax/styles/syntax/javascript.less":{"content":".syntax--source.syntax--js {\n .syntax--keyword.syntax--operator {\n color: @hue-1;\n\n // keywords are definded in https://github.com/atom/language-javascript/blob/master/grammars/javascript.cson\n // search \"instanceof\" for location\n &.syntax--delete,\n &.syntax--in,\n &.syntax--of,\n &.syntax--instanceof,\n &.syntax--new,\n &.syntax--typeof,\n &.syntax--void {\n color: @hue-3;\n }\n }\n}\n","digest":"9f2eb70092bdcddf40197f0a028f437a5ee065d6"},"node_modules/one-dark-syntax/styles/syntax/json.less":{"content":".syntax--source.syntax--json {\n .syntax--meta.syntax--structure.syntax--dictionary.syntax--json {\n & > .syntax--string.syntax--quoted.syntax--json {\n & > .syntax--punctuation.syntax--string {\n color: @hue-5;\n }\n color: @hue-5;\n }\n }\n\n .syntax--meta.syntax--structure.syntax--dictionary.syntax--json, .syntax--meta.syntax--structure.syntax--array.syntax--json {\n & > .syntax--value.syntax--json > .syntax--string.syntax--quoted.syntax--json,\n & > .syntax--value.syntax--json > .syntax--string.syntax--quoted.syntax--json > .syntax--punctuation {\n color: @hue-4;\n }\n\n & > .syntax--constant.syntax--language.syntax--json {\n color: @hue-1;\n }\n }\n}\n","digest":"8e5404389094e83bbfce993ff30de61c512d2e80"},"node_modules/one-dark-syntax/styles/syntax/python.less":{"content":".syntax--source.syntax--python {\n .syntax--keyword.syntax--operator.syntax--logical.syntax--python {\n color: @hue-3;\n }\n\n .syntax--variable.syntax--parameter {\n color: @hue-6;\n }\n}\n","digest":"b2a19ed1dfdc9938fe3714e8903f756e3a61dd8e"},"node_modules/one-dark-syntax/styles/syntax/ruby.less":{"content":".syntax--source.syntax--ruby {\n .syntax--constant.syntax--other.syntax--symbol > .syntax--punctuation {\n color: inherit;\n }\n}\n","digest":"7037880883b3ecfe2912904f9e403271d293a4f0"},"node_modules/one-light-syntax/index.less":{"content":"@import \"variables/ui-variables\";\n@import \"variables/syntax-variables\";\n\n// Atom Syntax Theme: One\n\n@import \"styles/syntax-variables.less\";\n\n@import \"styles/editor.less\";\n\n@import \"styles/syntax/_base.less\";\n@import \"styles/syntax/c.less\";\n@import \"styles/syntax/cpp.less\";\n@import \"styles/syntax/cs.less\";\n@import \"styles/syntax/css.less\";\n@import \"styles/syntax/elixir.less\";\n@import \"styles/syntax/gfm.less\";\n@import \"styles/syntax/go.less\";\n@import \"styles/syntax/ini.less\";\n@import \"styles/syntax/java.less\";\n@import \"styles/syntax/javascript.less\";\n@import \"styles/syntax/json.less\";\n@import \"styles/syntax/ruby.less\";\n@import \"styles/syntax/python.less\";\n","digest":"a916d5c6a5b8d6ea37a60088aa6e4eaab8e86ff2"},"node_modules/one-light-syntax/styles/colors.less":{"content":"\n// Config -----------------------------------\n@syntax-hue: 230;\n@syntax-saturation: 1%;\n@syntax-brightness: 98%;\n\n\n// Monochrome -----------------------------------\n@mono-1: hsl(@syntax-hue, 8%, 24%);\n@mono-2: hsl(@syntax-hue, 6%, 44%);\n@mono-3: hsl(@syntax-hue, 4%, 64%);\n\n// Colors -----------------------------------\n@hue-1: hsl(198, 99%, 37%); // <-cyan\n@hue-2: hsl(221, 87%, 60%); // <-blue\n@hue-3: hsl(301, 63%, 40%); // <-purple\n@hue-4: hsl(119, 34%, 47%); // <-green\n\n@hue-5: hsl( 5, 74%, 59%); // <-red 1\n@hue-5-2: hsl(344, 84%, 43%); // <-red 2\n\n@hue-6: hsl(41, 99%, 30%); // <-orange 1\n@hue-6-2: hsl(41, 99%, 38%); // <-orange 2\n\n\n// Base colors -----------------------------------\n@syntax-fg: @mono-1;\n@syntax-bg: hsl(@syntax-hue, @syntax-saturation, @syntax-brightness);\n@syntax-gutter: darken(@syntax-bg, 36%);\n@syntax-guide: fade(@syntax-fg, 20%);\n@syntax-accent: hsl(@syntax-hue, 100%, 66% );\n","digest":"6e53c2e7473d04130f2592930c3470ed86daffdf"},"node_modules/one-light-syntax/styles/editor.less":{"content":"// Editor styles (background, gutter, guides)\n\natom-text-editor {\n background-color: @syntax-background-color;\n color: @syntax-text-color;\n\n .line.cursor-line {\n background-color: @syntax-cursor-line;\n }\n\n .invisible {\n color: @syntax-text-color;\n }\n\n .cursor {\n border-left: 2px solid @syntax-cursor-color;\n }\n\n .selection .region {\n background-color: @syntax-selection-color;\n }\n\n .bracket-matcher .region {\n border-bottom: 1px solid @syntax-cursor-color;\n box-sizing: border-box;\n }\n\n .invisible-character {\n color: @syntax-invisible-character-color;\n }\n\n .indent-guide {\n color: @syntax-indent-guide-color;\n }\n\n .wrap-guide {\n background-color: @syntax-wrap-guide-color;\n }\n\n // find + replace\n .find-result .region.region.region,\n .current-result .region.region.region {\n border-radius: 2px;\n background-color: @syntax-result-marker-color;\n transition: border-color .4s;\n }\n .find-result .region.region.region {\n border: 2px solid transparent;\n }\n .current-result .region.region.region {\n border: 2px solid @syntax-result-marker-color-selected;\n transition-duration: .1s;\n }\n\n .gutter {\n .line-number {\n color: @syntax-gutter-text-color;\n -webkit-font-smoothing: antialiased;\n\n &.cursor-line {\n color: @syntax-gutter-text-color-selected;\n background-color: @syntax-gutter-background-color-selected;\n }\n &.cursor-line-no-selection {\n background-color: transparent;\n }\n\n .icon-right {\n color: @syntax-text-color;\n }\n }\n\n &:not(.git-diff-icon) .line-number.git-line-removed {\n &.git-line-removed::before {\n bottom: -3px;\n }\n &::after {\n content: \"\";\n position: absolute;\n left: 0px;\n bottom: 0px;\n width: 25px;\n border-bottom: 1px dotted fade(@syntax-color-removed, 50%);\n pointer-events: none;\n }\n }\n }\n\n .gutter .line-number.folded,\n .gutter .line-number:after,\n .fold-marker:after {\n color: @syntax-gutter-text-color-selected;\n }\n}\n","digest":"25e308c6140f46096a1f31e987ac6add9bf130f4"},"node_modules/one-light-syntax/styles/syntax-variables.less":{"content":"@import \"colors.less\";\n\n// Official Syntax Variables -----------------------------------\n\n// General colors\n@syntax-text-color: @syntax-fg;\n@syntax-cursor-color: @syntax-accent;\n@syntax-selection-color: darken(@syntax-bg, 8%);\n@syntax-selection-flash-color: @syntax-accent;\n@syntax-background-color: @syntax-bg;\n\n// Guide colors\n@syntax-wrap-guide-color: @syntax-guide;\n@syntax-indent-guide-color: @syntax-guide;\n@syntax-invisible-character-color: @syntax-guide;\n\n// For find and replace markers\n@syntax-result-marker-color: fade(@syntax-accent, 20%);\n@syntax-result-marker-color-selected: @syntax-accent;\n\n// Gutter colors -----------------------------------\n@syntax-gutter-text-color: @syntax-gutter;\n@syntax-gutter-text-color-selected: @syntax-fg;\n@syntax-gutter-background-color: @syntax-bg; // unused\n@syntax-gutter-background-color-selected: darken(@syntax-bg, 3%);\n\n// Git colors - For git diff info. i.e. in the gutter\n@syntax-color-renamed: hsl(208, 100%, 66%);\n@syntax-color-added: hsl(132, 60%, 44%);\n@syntax-color-modified: hsl( 40, 90%, 50%);\n@syntax-color-removed: hsl( 0, 100%, 54%);\n\n// For language entity colors\n@syntax-color-variable: @hue-5;\n@syntax-color-constant: @hue-6;\n@syntax-color-property: @syntax-fg;\n@syntax-color-value: @syntax-fg;\n@syntax-color-function: @hue-2;\n@syntax-color-method: @hue-2;\n@syntax-color-class: @hue-6-2;\n@syntax-color-keyword: @hue-3;\n@syntax-color-tag: @hue-5;\n@syntax-color-attribute: @hue-6;\n@syntax-color-import: @hue-3;\n@syntax-color-snippet: @hue-4;\n\n\n// Custom Syntax Variables -----------------------------------\n// Don't use in packages\n\n@syntax-cursor-line: fade(@syntax-fg, 5%); // needs to be semi-transparent to show search results\n\n@syntax-deprecated-fg: darken(@syntax-color-modified, 50%);\n@syntax-deprecated-bg: @syntax-color-modified;\n@syntax-illegal-fg: white;\n@syntax-illegal-bg: @syntax-color-removed;\n","digest":"53a4849f954b408b31964142490fe356135f4b41"},"node_modules/one-light-syntax/styles/syntax/_base.less":{"content":"// Language syntax highlighting\n\n.syntax--comment {\n color: @mono-3;\n font-style: italic;\n\n .syntax--markup.syntax--link {\n color: @mono-3;\n }\n}\n\n.syntax--entity {\n\n &.syntax--name.syntax--type {\n color: @hue-6-2;\n }\n\n &.syntax--other.syntax--inherited-class {\n color: @hue-4;\n }\n}\n\n.syntax--keyword {\n color: @hue-3;\n\n &.syntax--control {\n color: @hue-3;\n }\n\n &.syntax--operator {\n color: @mono-1;\n }\n\n &.syntax--other.syntax--special-method {\n color: @hue-2;\n }\n\n &.syntax--other.syntax--unit {\n color: @hue-6;\n }\n}\n\n.syntax--storage {\n color: @hue-3;\n\n &.syntax--type {\n &.syntax--annotation,\n &.syntax--primitive {\n color: @hue-3;\n }\n }\n\n &.syntax--modifier {\n &.syntax--package,\n &.syntax--import {\n color: @mono-1;\n }\n }\n}\n\n.syntax--constant {\n color: @hue-6;\n\n &.syntax--variable {\n color: @hue-6;\n }\n\n &.syntax--character.syntax--escape {\n color: @hue-1;\n }\n\n &.syntax--numeric {\n color: @hue-6;\n }\n\n &.syntax--other.syntax--color {\n color: @hue-1;\n }\n\n &.syntax--other.syntax--symbol {\n color: @hue-1;\n }\n}\n\n.syntax--variable {\n color: @hue-5;\n\n &.syntax--interpolation {\n color: @hue-5-2;\n }\n\n &.syntax--parameter {\n color: @mono-1;\n }\n}\n\n.syntax--string {\n color: @hue-4;\n\n &.syntax--regexp {\n color: @hue-1;\n\n .syntax--source.syntax--ruby.syntax--embedded {\n color: @hue-6-2;\n }\n }\n\n &.syntax--other.syntax--link {\n color: @hue-5;\n }\n}\n\n.syntax--punctuation {\n &.syntax--definition {\n &.syntax--comment {\n color: @mono-3;\n }\n\n &.syntax--method-parameters,\n &.syntax--function-parameters,\n &.syntax--parameters,\n &.syntax--separator,\n &.syntax--seperator,\n &.syntax--array {\n color: @mono-1;\n }\n\n &.syntax--heading,\n &.syntax--identity {\n color: @hue-2;\n }\n\n &.syntax--bold {\n color: @hue-6-2;\n font-weight: bold;\n }\n\n &.syntax--italic {\n color: @hue-3;\n font-style: italic;\n }\n }\n\n &.syntax--section {\n &.syntax--embedded {\n color: @hue-5-2;\n }\n\n &.syntax--method,\n &.syntax--class,\n &.syntax--inner-class {\n color: @mono-1;\n }\n }\n}\n\n.syntax--support {\n &.syntax--class {\n color: @hue-6-2;\n }\n\n &.syntax--type {\n color: @hue-1;\n }\n\n &.syntax--function {\n color: @hue-1;\n\n &.syntax--any-method {\n color: @hue-2;\n }\n }\n}\n\n.syntax--entity {\n &.syntax--name.syntax--function {\n color: @hue-2;\n }\n\n &.syntax--name.syntax--class,\n &.syntax--name.syntax--type.syntax--class {\n color: @hue-6-2;\n }\n\n &.syntax--name.syntax--section {\n color: @hue-2;\n }\n\n &.syntax--name.syntax--tag {\n color: @hue-5;\n }\n\n &.syntax--other.syntax--attribute-name {\n color: @hue-6;\n\n &.syntax--id {\n color: @hue-2;\n }\n }\n}\n\n.syntax--meta {\n &.syntax--class {\n color: @hue-6-2;\n\n &.syntax--body {\n color: @mono-1;\n }\n }\n\n &.syntax--method-call,\n &.syntax--method {\n color: @mono-1;\n }\n\n &.syntax--definition {\n &.syntax--variable {\n color: @hue-5;\n }\n }\n\n &.syntax--link {\n color: @hue-6;\n }\n\n &.syntax--require {\n color: @hue-2;\n }\n\n &.syntax--selector {\n color: @hue-3;\n }\n\n &.syntax--separator {\n background-color: #373b41;\n color: @mono-1;\n }\n\n &.syntax--tag {\n color: @mono-1;\n }\n}\n\n.syntax--underline {\n text-decoration: underline;\n}\n\n.syntax--none {\n color: @mono-1;\n}\n\n.syntax--invalid {\n &.syntax--deprecated {\n color: @syntax-deprecated-fg !important;\n background-color: @syntax-deprecated-bg !important;\n }\n &.syntax--illegal {\n color: @syntax-illegal-fg !important;\n background-color: @syntax-illegal-bg !important;\n }\n}\n\n// Languages -------------------------------------------------\n\n.syntax--markup {\n &.syntax--bold {\n color: @hue-6;\n font-weight: bold;\n }\n\n &.syntax--changed {\n color: @hue-3;\n }\n\n &.syntax--deleted {\n color: @hue-5;\n }\n\n &.syntax--italic {\n color: @hue-3;\n font-style: italic;\n }\n\n &.syntax--heading {\n color: @hue-5;\n\n .syntax--punctuation.syntax--definition.syntax--heading {\n color: @hue-2;\n }\n }\n\n &.syntax--link {\n color: @hue-1;\n }\n\n &.syntax--inserted {\n color: @hue-4;\n }\n\n &.syntax--quote {\n color: @hue-6;\n }\n\n &.syntax--raw {\n color: @hue-4;\n }\n}\n","digest":"d6152f31c84aa1185203c63ad7423d854c5eab0c"},"node_modules/one-light-syntax/styles/syntax/c.less":{"content":".syntax--source.syntax--c {\n .syntax--keyword.syntax--operator {\n color: @hue-3;\n }\n}\n","digest":"ad63462d9a7352e4cd1f4ec52ea6daced57a2e51"},"node_modules/one-light-syntax/styles/syntax/cpp.less":{"content":".syntax--source.syntax--cpp {\n .syntax--keyword.syntax--operator {\n color: @hue-3;\n }\n}\n","digest":"3832ba5f453df1e76fee01bea74dbfd67d606c43"},"node_modules/one-light-syntax/styles/syntax/cs.less":{"content":".syntax--source.syntax--cs {\n .syntax--keyword.syntax--operator {\n color: @hue-3;\n }\n}\n","digest":"c92e873b912bb6f727365589722e17220a862b65"},"node_modules/one-light-syntax/styles/syntax/css.less":{"content":".syntax--source.syntax--css {\n\n // highlight properties/values if they are supported\n .syntax--property-name,\n .syntax--property-value {\n color: @mono-2;\n &.syntax--support {\n color: @mono-1;\n }\n }\n\n}\n","digest":"d805d108e69c6469f8f840aa50d3ee9725164563"},"node_modules/one-light-syntax/styles/syntax/elixir.less":{"content":".syntax--source.syntax--elixir {\n .syntax--source.syntax--embedded.syntax--source {\n color: @mono-1;\n }\n .syntax--constant.syntax--language,\n .syntax--constant.syntax--numeric,\n .syntax--constant.syntax--definition {\n color: @hue-2;\n }\n .syntax--variable.syntax--definition,\n .syntax--variable.syntax--anonymous{\n color: @hue-3;\n }\n .syntax--quoted{\n color: @hue-4;\n }\n .syntax--keyword.syntax--special-method,\n .syntax--embedded.syntax--section,\n .syntax--embedded.syntax--source.syntax--empty, {\n color: @hue-5;\n }\n .syntax--readwrite.syntax--module {\n .syntax--punctuation {\n color: @hue-5;\n }\n }\n .syntax--regexp.syntax--section,\n .syntax--regexp.syntax--string {\n color: @hue-5-2;\n }\n .syntax--separator,\n .syntax--keyword.syntax--operator {\n color: @hue-6;\n }\n .syntax--variable.syntax--constant {\n color: @hue-6-2;\n }\n .syntax--array,\n .syntax--scope,\n .syntax--section {\n color: @mono-2;\n }\n}\n","digest":"9c7a58879463690306239be47060f7f9ea80b85a"},"node_modules/one-light-syntax/styles/syntax/gfm.less":{"content":".syntax--source.syntax--gfm {\n .syntax--markup {\n -webkit-font-smoothing: auto;\n }\n\n .syntax--link .syntax--entity {\n color: @hue-2;\n }\n}\n","digest":"c2da438ee70805f1b45524468243c2d97e711640"},"node_modules/one-light-syntax/styles/syntax/go.less":{"content":".syntax--source.syntax--go {\n .syntax--storage.syntax--type.syntax--string {\n color: @hue-3;\n }\n}\n","digest":"a268ce9af009eaed960a681895dfdbb02c7e84a7"},"node_modules/one-light-syntax/styles/syntax/ini.less":{"content":".syntax--source.syntax--ini {\n .syntax--keyword.syntax--other.syntax--definition.syntax--ini {\n color: @hue-5;\n }\n}\n","digest":"de894a7575d3add3eb4cc450e548334a674c2c43"},"node_modules/one-light-syntax/styles/syntax/java.less":{"content":".syntax--source.syntax--java {\n .syntax--storage {\n &.syntax--modifier.syntax--import {\n color: @hue-6-2;\n }\n\n &.syntax--type {\n color: @hue-6-2;\n }\n }\n .syntax--keyword.syntax--operator.syntax--instanceof {\n color: @hue-3;\n }\n}\n\n.syntax--source.syntax--java-properties {\n .syntax--meta.syntax--key-pair {\n color: @hue-5;\n\n & > .syntax--punctuation {\n color: @mono-1;\n }\n }\n}\n","digest":"9d10d34cea50c9e3dfc500dcb00e671a564249ef"},"node_modules/one-light-syntax/styles/syntax/javascript.less":{"content":".syntax--source.syntax--js {\n .syntax--keyword.syntax--operator {\n color: @hue-1;\n\n // keywords are definded in https://github.com/atom/language-javascript/blob/master/grammars/javascript.cson\n // search \"instanceof\" for location\n &.syntax--delete,\n &.syntax--in,\n &.syntax--of,\n &.syntax--instanceof,\n &.syntax--new,\n &.syntax--typeof,\n &.syntax--void {\n color: @hue-3;\n }\n }\n}\n","digest":"9f2eb70092bdcddf40197f0a028f437a5ee065d6"},"node_modules/one-light-syntax/styles/syntax/json.less":{"content":".syntax--source.syntax--json {\n .syntax--meta.syntax--structure.syntax--dictionary.syntax--json {\n & > .syntax--string.syntax--quoted.syntax--json {\n & > .syntax--punctuation.syntax--string {\n color: @hue-5;\n }\n color: @hue-5;\n }\n }\n\n .syntax--meta.syntax--structure.syntax--dictionary.syntax--json,\n .syntax--meta.syntax--structure.syntax--array.syntax--json {\n & > .syntax--value.syntax--json > .syntax--string.syntax--quoted.syntax--json,\n & > .syntax--value.syntax--json > .syntax--string.syntax--quoted.syntax--json > .syntax--punctuation {\n color: @hue-4;\n }\n\n & > .syntax--constant.syntax--language.syntax--json {\n color: @hue-1;\n }\n }\n}\n","digest":"b2e4cb0fef7a06bfc26a30a299f82650552363a4"},"node_modules/one-light-syntax/styles/syntax/python.less":{"content":".syntax--source.syntax--python {\n .syntax--keyword.syntax--operator.syntax--logical.syntax--python {\n color: @hue-3;\n }\n\n .syntax--variable.syntax--parameter {\n color: @hue-6;\n }\n}\n","digest":"b2a19ed1dfdc9938fe3714e8903f756e3a61dd8e"},"node_modules/one-light-syntax/styles/syntax/ruby.less":{"content":".syntax--source.syntax--ruby {\n .syntax--constant.syntax--other.syntax--symbol > .syntax--punctuation {\n color: inherit;\n }\n}\n","digest":"7037880883b3ecfe2912904f9e403271d293a4f0"},"node_modules/solarized-dark-syntax/index.less":{"content":"@import \"variables/ui-variables\";\n@import \"variables/syntax-variables\";\n\n// Solarized Syntax Theme\n\n@import \"styles/syntax-variables.less\";\n\n// Editor\n@import \"styles/editor.less\";\n\n// Languages\n@import \"styles/syntax/_base.less\";\n@import \"styles/syntax/c.less\";\n@import \"styles/syntax/coffee.less\";\n@import \"styles/syntax/css.less\";\n@import \"styles/syntax/go.less\";\n@import \"styles/syntax/java.less\";\n@import \"styles/syntax/javascript.less\";\n@import \"styles/syntax/markdown.less\";\n@import \"styles/syntax/markup.less\";\n@import \"styles/syntax/php.less\";\n@import \"styles/syntax/python.less\";\n@import \"styles/syntax/ruby.less\";\n@import \"styles/syntax/scala.less\";\n","digest":"a71910d7884e81ff362d6059ef1b0440c81f9223"},"node_modules/solarized-dark-syntax/styles/colors.less":{"content":"\n// Solarized color scheme\n// http://ethanschoonover.com/solarized#the-values\n\n// Background/Foreground Tones\n@base03: #002b36;\n@base02: #073642;\n\n// Content Tones\n@base01: #586e75;\n@base00: #657b83;\n@base0: #839496;\n@base1: #93a1a1;\n\n// Background/Foreground Tones\n@base2: #eee8d5;\n@base3: #fdf6e3;\n\n// Accent Colors\n@yellow: #b58900;\n@orange: #cb4b16;\n@red: #dc322f;\n@magenta: #d33682;\n@violet: #6c71c4;\n@blue: #268bd2;\n@cyan: #2aa198;\n@green: #859900;\n","digest":"b88cf362fd45cb5f470f88ca4bf885ed33b48652"},"node_modules/solarized-dark-syntax/styles/editor.less":{"content":"atom-text-editor {\n color: @syntax-text-color;\n background-color: @syntax-background-color;\n\n .gutter {\n color: @syntax-gutter-text-color;\n background-color: @syntax-gutter-background-color;\n\n .line-number {\n &.cursor-line {\n background-color: @syntax-gutter-background-color-selected;\n }\n }\n }\n\n .invisible-character {\n color: @syntax-invisible-character-color;\n }\n\n .indent-guide {\n color: @syntax-indent-guide-color;\n }\n\n .cursor {\n border-color: @syntax-cursor-color;\n }\n\n .selection .region {\n background-color: @syntax-selection-color;\n }\n\n .fold-marker:after,\n .gutter .line-number.folded {\n color: @magenta;\n }\n\n .bracket-matcher .region {\n border-color: @magenta;\n }\n}\n","digest":"ecdc841891ddd65c51150615e73e588bad414e4e"},"node_modules/solarized-dark-syntax/styles/syntax-variables.less":{"content":"@import \"colors.less\";\n\n// This defines all syntax variables that syntax themes must implement when they\n// include a syntax-variables.less file.\n\n// General colors\n@syntax-text-color: @base0;\n@syntax-cursor-color: @base3;\n@syntax-selection-color: lighten(@base02, 1%);\n@syntax-selection-flash-color: @base1;\n@syntax-background-color: @base03;\n\n// Guide colors\n@syntax-wrap-guide-color: lighten(@base02, 6%);\n@syntax-indent-guide-color: lighten(@base02, 6%);\n@syntax-invisible-character-color: lighten(@base02, 6%);\n\n// For find and replace markers\n@syntax-result-marker-color: @cyan;\n@syntax-result-marker-color-selected: @base3;\n\n// Gutter colors\n@syntax-gutter-text-color: @base0;\n@syntax-gutter-text-color-selected: @syntax-gutter-text-color;\n@syntax-gutter-background-color: @base02;\n@syntax-gutter-background-color-selected: lighten(@base02, 3%);\n\n// For git diff info. i.e. in the gutter\n@syntax-color-added: @green;\n@syntax-color-renamed: @blue;\n@syntax-color-modified: @yellow;\n@syntax-color-removed: @red;\n\n// For language entity colors\n@syntax-color-variable: @blue;\n@syntax-color-constant: @yellow;\n@syntax-color-property: @yellow;\n@syntax-color-value: @cyan;\n@syntax-color-function: @blue;\n@syntax-color-method: @blue;\n@syntax-color-class: @blue;\n@syntax-color-keyword: @green;\n@syntax-color-tag: @blue;\n@syntax-color-attribute: @syntax-comment-color;\n@syntax-color-import: @red;\n@syntax-color-snippet: @syntax-color-keyword;\n\n\n// Custom variables\n// Warning: Don't use in packages\n\n@syntax-comment-color: @base01;\n@syntax-subtle-color: @base00;\n@syntax-emphasized-color: @base1;\n","digest":"3df6c20791fd3108a466d0b306dfaf78d5eb9797"},"node_modules/solarized-dark-syntax/styles/syntax/_base.less":{"content":"\n.syntax--comment {\n color: @syntax-comment-color;\n font-style: italic;\n\n .syntax--markup.syntax--link {\n color: @syntax-comment-color;\n }\n}\n\n.syntax--string {\n color: @cyan;\n &.syntax--regexp {\n color: @red;\n }\n}\n\n.syntax--constant {\n &.syntax--numeric {\n color: @magenta;\n }\n &.syntax--language {\n color: @yellow;\n }\n &.syntax--character,\n &.syntax--other {\n color: @orange;\n }\n}\n\n.syntax--variable {\n color: @blue;\n}\n\n.syntax--keyword {\n color: @green;\n}\n\n.syntax--storage {\n color: @green;\n}\n\n.syntax--entity {\n &.syntax--name {\n &.syntax--class,\n &.syntax--type,\n &.syntax--function {\n color: @blue;\n }\n }\n &.syntax--other.syntax--attribute-name {\n color: @syntax-subtle-color;\n }\n}\n\n.syntax--support {\n &.syntax--function {\n color: @blue;\n &.syntax--builtin {\n color: @green;\n }\n }\n &.syntax--type,\n &.syntax--class {\n color: @green;\n }\n}\n\n.syntax--tag {\n &.syntax--entity.syntax--name {\n color: @blue;\n }\n &.syntax--punctuation.syntax--definition {\n &.syntax--html,\n &.syntax--begin,\n &.syntax--end {\n color: @syntax-comment-color;\n }\n }\n}\n\n.syntax--invalid {\n &.syntax--deprecated {\n color: @yellow;\n text-decoration: underline;\n }\n &.syntax--illegal {\n color: @red;\n text-decoration: underline;\n }\n}\n\n.syntax--none {\n color: @syntax-text-color;\n}\n","digest":"b7422f8dafb69db51d42f6afa850388e558f4456"},"node_modules/solarized-dark-syntax/styles/syntax/c.less":{"content":".syntax--source.syntax--c,\n.syntax--source.syntax--cpp {\n .syntax--meta.syntax--preprocessor {\n color: @red;\n }\n .syntax--keyword.syntax--control.syntax--directive {\n color: @orange;\n }\n .syntax--punctuation.syntax--string {\n color: @cyan;\n }\n .syntax--constant {\n color: @orange;\n\n &.syntax--numeric, &.syntax--language.syntax--c {\n color: @cyan;\n }\n }\n .syntax--storage {\n color: @yellow;\n }\n .syntax--entity {\n color: @syntax-text-color;\n\n &.syntax--name.syntax--function.syntax--preprocessor {\n color: @red;\n }\n }\n .syntax--support.syntax--type {\n color: @yellow;\n\n &.syntax--posix-reserved {\n color: @syntax-text-color;\n }\n }\n .syntax--variable {\n &.syntax--other.syntax--dot-access {\n color: @syntax-text-color;\n }\n &.syntax--parameter.syntax--preprocessor {\n color: @red;\n }\n }\n}\n","digest":"839d65ac623e01b74b7e42269590d9feff8fa65c"},"node_modules/solarized-dark-syntax/styles/syntax/coffee.less":{"content":".syntax--source.syntax--coffee {\n .syntax--support.syntax--class {\n color: @green;\n }\n\n .syntax--variable,\n .syntax--entity.syntax--name.syntax--function,\n .syntax--entity.syntax--name.syntax--class {\n color: @blue;\n }\n .syntax--variable.syntax--parameter.syntax--function {\n color: @syntax-text-color;\n }\n .syntax--variable.syntax--other.syntax--readwrite {\n color: @green;\n }\n\n .syntax--storage.syntax--type.syntax--function {\n color: @green;\n }\n\n .syntax--entity.syntax--name {\n color: @syntax-text-color;\n }\n\n .syntax--meta.syntax--brace {\n &.syntax--round,\n &.syntax--square {\n color: @syntax-text-color;\n }\n }\n .syntax--meta.syntax--delimiter {\n color: @syntax-text-color;\n }\n\n .syntax--storage.syntax--type.syntax--class {\n color: @green;\n }\n\n .syntax--punctuation.syntax--terminator {\n color: @syntax-text-color;\n }\n\n .syntax--punctuation.syntax--section.syntax--embedded {\n color: @red;\n }\n .syntax--embedded.syntax--source {\n color: @syntax-text-color;\n }\n\n .syntax--constant.syntax--numeric {\n color: @magenta;\n }\n\n .syntax--constant.syntax--language.syntax--boolean {\n color: @yellow;\n }\n}\n","digest":"2736764cbf69f7adaac92819ca676cbce669b54b"},"node_modules/solarized-dark-syntax/styles/syntax/css.less":{"content":".syntax--source.syntax--css {\n\n .syntax--punctuation {\n &.syntax--separator,\n &.syntax--terminator {\n color: @syntax-text-color;\n }\n &.syntax--property-list.syntax--begin,\n &.syntax--property-list.syntax--end {\n color: @red;\n }\n &.syntax--section.syntax--function {\n color: @cyan;\n }\n }\n\n .syntax--entity.syntax--name {\n color: @green;\n }\n .syntax--attribute-name.syntax--class,\n .syntax--id {\n color: @blue;\n }\n .syntax--pseudo-element,\n .syntax--pseudo-class {\n color: @orange;\n }\n\n .syntax--property-value {\n color: @cyan;\n }\n .syntax--constant.syntax--numeric {\n color: @cyan;\n .syntax--unit {\n color: @cyan;\n }\n }\n .syntax--rgb-value {\n color: @cyan;\n }\n .syntax--support.syntax--constant {\n color: @cyan;\n &.syntax--media {\n color: @red;\n }\n }\n\n .syntax--keyword.syntax--important {\n color: @red;\n }\n\n}\n\n\n// Less/Sass should have their own files,\n// but for just a single override, here should be fine too\n\n.syntax--source.syntax--less,\n.syntax--source.syntax--scss {\n .syntax--keyword.syntax--unit {\n color: @cyan;\n }\n}\n","digest":"b6fac27e3e87d879c7bc7c62b4fb67106cdbb3c7"},"node_modules/solarized-dark-syntax/styles/syntax/go.less":{"content":".syntax--source.syntax--go {\n\n .syntax--operator {\n color: @syntax-text-color;\n &.syntax--assignment {\n color: @green;\n }\n }\n\n}\n","digest":"2a8e5aaf48786eb497de8fc9bf8f1003a8ece54b"},"node_modules/solarized-dark-syntax/styles/syntax/java.less":{"content":".syntax--source.syntax--java {\n .syntax--keyword.syntax--operator{\n color:@green;\n }\n .syntax--keyword.syntax--import{\n color: @orange;\n }\n .syntax--storage.syntax--modifier.syntax--import{\n color: @syntax-comment-color;\n }\n .syntax--meta.syntax--class{\n .syntax--storage.syntax--modifier{\n color: @yellow;\n }\n .syntax--meta.syntax--class.syntax--identifier{\n .syntax--entity.syntax--name.syntax--type.syntax--class{\n color: @blue;\n }\n }\n }\n .syntax--storage.syntax--type.syntax--primitive.syntax--array{\n color:@green;\n }\n .syntax--constant.syntax--numeric{\n color:@magenta;\n }\n .syntax--constant.syntax--other{\n color:@orange;\n }\n .syntax--storage.syntax--type{\n color:@green;\n }\n .syntax--meta.syntax--method-call{\n //@ibocon: method parameter's color\n color:@red;\n //@ibocon: method and variable use different hightlight\n .syntax--meta.syntax--method{\n color:@violet;\n }\n .syntax--punctuation.syntax--definition.syntax--seperator.syntax--parameter{\n color:@green;\n }\n }\n .syntax--punctuation.syntax--definition.syntax--method-parameters{\n color: @syntax-emphasized-color;\n }\n}\n","digest":"7ed0d0331bfcc2ca5bfa85dddaa51e547df18593"},"node_modules/solarized-dark-syntax/styles/syntax/javascript.less":{"content":".syntax--source.syntax--js {\n .syntax--constant {\n color: @green;\n }\n\n .syntax--comma {\n color: @syntax-text-color;\n }\n\n .syntax--support.syntax--class {\n color: @green;\n }\n\n .syntax--entity.syntax--name.syntax--type {\n color: @yellow;\n }\n .syntax--entity.syntax--name {\n color: @syntax-text-color;\n }\n\n .syntax--meta.syntax--brace {\n color: @syntax-text-color;\n }\n\n .syntax--keyword {\n color: @syntax-text-color;\n }\n .syntax--keyword.syntax--operator.syntax--new {\n color: @green;\n }\n .syntax--keyword.syntax--control {\n color: @green;\n }\n .syntax--keyword.syntax--control.syntax--regexp {\n color: @cyan;\n }\n\n .syntax--variable {\n color: @blue;\n }\n .syntax--variable.syntax--parameter {\n color: @syntax-text-color;\n }\n\n .syntax--regexp {\n color: @cyan;\n }\n\n .syntax--support.syntax--function {\n color: @violet;\n }\n .syntax--support.syntax--constant {\n color: @syntax-text-color;\n }\n\n .syntax--constant.syntax--numeric {\n color: @syntax-text-color;\n }\n\n .syntax--punctuation.syntax--terminator.syntax--statement {\n color: @syntax-text-color;\n }\n\n .syntax--meta.syntax--delimiter.syntax--method.syntax--period {\n color: @syntax-text-color;\n }\n .syntax--meta.syntax--brace.syntax--square {\n color: @blue;\n }\n .syntax--meta.syntax--brace.syntax--curly {\n color: @blue;\n }\n .syntax--string.syntax--quoted.syntax--template {\n .syntax--embedded.syntax--source {\n color: @syntax-text-color;\n & > .syntax--embedded.syntax--punctuation {\n color: @red;\n }\n }\n }\n &.syntax--embedded .syntax--entity.syntax--name.syntax--tag {\n color: @blue;\n }\n}\n.syntax--source.syntax--js.syntax--jsx {\n .syntax--entity.syntax--name.syntax--tag {\n color: @blue;\n }\n}\n","digest":"532bc7043760ab4871e93837007d95efa23dcb23"},"node_modules/solarized-dark-syntax/styles/syntax/markdown.less":{"content":".syntax--gfm {\n .syntax--link .syntax--entity {\n color: @violet;\n }\n\n .syntax--list {\n &.syntax--ordered {\n color: @green;\n }\n &.syntax--unordered {\n color: @yellow;\n }\n }\n\n .syntax--raw {\n font-style: italic;\n }\n\n &.syntax--support {\n color:@syntax-comment-color;\n &.syntax--quote {\n color: @violet;\n }\n }\n}\n","digest":"6a33df58ae2d94dc7b7e7264a72d39942acc0c9e"},"node_modules/solarized-dark-syntax/styles/syntax/markup.less":{"content":".syntax--markup {\n\n &.syntax--bold {\n font-weight: bold;\n }\n &.syntax--italic {\n font-style: italic;\n }\n\n &.syntax--heading {\n color: @blue;\n }\n\n &.syntax--link {\n color: @cyan;\n }\n\n &.syntax--deleted {\n color: @red;\n }\n\n &.syntax--changed {\n color: @yellow;\n }\n\n &.syntax--inserted {\n color: @cyan;\n }\n\n}\n","digest":"2b1893b8d2de8d42b582efbd90608833a8e26fdc"},"node_modules/solarized-dark-syntax/styles/syntax/php.less":{"content":".syntax--source.syntax--php {\n .syntax--storage {\n &.syntax--type {\n &.syntax--class {\n color: @yellow;\n }\n &.syntax--function {\n color: @orange;\n }\n }\n &.syntax--modifier {\n color: @yellow;\n }\n }\n .syntax--entity {\n &.syntax--name {\n &.syntax--type.syntax--class {\n color: @syntax-text-color;\n }\n &.syntax--function {\n color: @syntax-text-color;\n }\n }\n &.syntax--other {\n color: @syntax-text-color;\n }\n }\n .syntax--variable {\n color: @blue;\n }\n .syntax--punctuation.syntax--definition {\n color: @syntax-text-color;\n &.syntax--comment {\n color: @syntax-comment-color;\n }\n &.syntax--array {\n color: @red;\n }\n &.syntax--string {\n color: @syntax-text-color;\n }\n &.syntax--variable {\n color: @green;\n }\n }\n .syntax--support.syntax--function {\n &.syntax--construct {\n color: @yellow;\n }\n &.syntax--array {\n color: @green;\n }\n }\n .syntax--keyword {\n &.syntax--operator {\n &.syntax--class {\n color: @yellow;\n }\n &.syntax--assignment {\n color: @green;\n }\n }\n &.syntax--other {\n color: @red;\n }\n }\n}\n","digest":"4c57fce11fabe63d59d4e0d964477d7a54ee8f83"},"node_modules/solarized-dark-syntax/styles/syntax/python.less":{"content":".syntax--source.syntax--python {\n .syntax--entity {\n color: @syntax-text-color;\n\n &.syntax--name {\n color: @blue;\n }\n &.syntax--other {\n color: @blue;\n }\n }\n\n .syntax--function {\n color: @blue;\n\n &.syntax--magic {\n color: @blue;\n }\n }\n\n .syntax--punctuation.syntax--string {\n color: @cyan;\n }\n .syntax--keyword {\n &.syntax--operator {\n color: @syntax-text-color;\n &.syntax--quantifier {\n color: @cyan;\n }\n &.syntax--logical {\n color: @green;\n }\n }\n &.syntax--control.syntax--import {\n color: @orange;\n }\n &.syntax--other {\n color: @green;\n }\n }\n .syntax--constant {\n &.syntax--language {\n color: @blue;\n }\n &.syntax--character {\n color: @cyan;\n }\n &.syntax--other {\n color: @red;\n }\n }\n\n .syntax--entity.syntax--name.syntax--type.syntax--class {\n color: @blue;\n }\n .syntax--variable {\n color: @syntax-text-color;\n }\n .syntax--support {\n &.syntax--function.syntax--builtin {\n color: @blue;\n }\n &.syntax--type {\n &.syntax--exception.syntax--python {\n color: @yellow;\n }\n &.syntax--python {\n color: @blue;\n }\n }\n }\n .syntax--storage.syntax--type.syntax--string {\n color: @cyan;\n }\n\n .syntax--storage.syntax--type.syntax--class {\n color: @green;\n &.syntax--todo {\n color: @magenta;\n }\n }\n\n .syntax--storage.syntax--type.syntax--function {\n color: @green;\n }\n\n .syntax--punctuation.syntax--definition.syntax--parameters {\n color: @syntax-text-color;\n }\n\n .syntax--punctuation.syntax--section.syntax--function.syntax--begin {\n color: @syntax-text-color;\n }\n\n .syntax--punctuation.syntax--separator.syntax--parameters {\n color: @syntax-text-color;\n }\n\n\n}\n","digest":"33190f5b629f061f135b7bbd8be544b6c06ed4f8"},"node_modules/solarized-dark-syntax/styles/syntax/ruby.less":{"content":".syntax--source.syntax--ruby {\n\n .syntax--meta.syntax--embedded {\n .syntax--punctuation.syntax--section {\n color: @red;\n }\n }\n .syntax--punctuation.syntax--definition {\n color: @syntax-text-color;\n &.syntax--string {\n color: @red;\n }\n }\n .syntax--punctuation.syntax--definition.syntax--comment {\n color: @syntax-comment-color;\n }\n .syntax--entity.syntax--inherited-class {\n color: @yellow;\n }\n .syntax--variable {\n &.syntax--parameter {\n color: @syntax-text-color;\n }\n }\n .syntax--variable.syntax--constant {\n color: @yellow;\n }\n .syntax--constant.syntax--boolean {\n color: @cyan;\n }\n .syntax--instance {\n .syntax--punctuation.syntax--definition {\n color: @blue;\n }\n }\n .syntax--class {\n color: @yellow;\n &.syntax--control {\n color: @syntax-text-color;\n }\n }\n .syntax--module {\n color: @yellow;\n }\n .syntax--require {\n .syntax--keyword.syntax--other.syntax--special-method {\n color: @orange;\n }\n }\n .syntax--keyword.syntax--other.syntax--special-method {\n color: @orange;\n }\n .syntax--keyword.syntax--other {\n color: @green;\n }\n .syntax--keyword.syntax--control {\n color: @green;\n }\n .syntax--keyword.syntax--operator {\n color: @syntax-text-color;\n }\n .syntax--special-method {\n color: @blue;\n }\n .syntax--symbol {\n color: @cyan;\n .syntax--punctuation.syntax--definition {\n color: @cyan;\n }\n }\n .syntax--hashkey {\n color: @red;\n .syntax--punctuation.syntax--definition {\n color: @red;\n }\n }\n .syntax--string.syntax--regexp {\n color: @red;\n }\n .syntax--todo {\n color: @magenta;\n }\n .syntax--variable.syntax--ruby.syntax--global {\n color: @blue;\n .syntax--punctuation {\n color: @blue;\n }\n }\n .syntax--variable.syntax--block {\n color: @blue;\n }\n .syntax--variable.syntax--self {\n color: @cyan;\n }\n .syntax--punctuation.syntax--separator {\n color: @syntax-text-color;\n }\n .syntax--numeric {\n color: @cyan;\n }\n .syntax--punctuation.syntax--section.syntax--regexp {\n color: @red;\n }\n .syntax--string.syntax--interpolated {\n color: @cyan;\n }\n .syntax--string.syntax--interpolated {\n .syntax--embedded.syntax--line.syntax--ruby {\n .syntax--punctuation {\n .syntax--source.syntax--ruby {\n color: @red;\n }\n }\n .syntax--source.syntax--ruby {\n .syntax--punctuation.syntax--array,\n .syntax--punctuation.syntax--function {\n color: @syntax-text-color;\n }\n color: @syntax-text-color;\n }\n }\n }\n .syntax--support.syntax--function {\n color: @syntax-text-color;\n }\n .syntax--support.syntax--function.syntax--kernel {\n color: @green;\n }\n}\n","digest":"cfe9b7caebcae391298920cc1ad3ed4f945a1219"},"node_modules/solarized-dark-syntax/styles/syntax/scala.less":{"content":".syntax--source.syntax--scala {\n .syntax--variable {\n color: @syntax-emphasized-color;\n }\n\n .syntax--declaration {\n color: @syntax-emphasized-color;\n font-weight: bold;\n }\n .syntax--comparison {\n color: @syntax-emphasized-color;\n }\n .syntax--class, .syntax--type {\n color: @yellow;\n }\n .syntax--val {\n font-weight: normal;\n }\n .syntax--variable {\n font-weight: bold;\n }\n .syntax--variable.syntax--parameter {\n color: @violet;\n font-weight: normal;\n }\n .syntax--control.syntax--flow {\n color: @syntax-emphasized-color;\n font-weight: bold;\n }\n .syntax--constant.syntax--language {\n color: @syntax-emphasized-color;\n font-weight: bold;\n }\n .syntax--function.syntax--declaration {\n color: @violet;\n }\n .syntax--modifier.syntax--other {\n font-weight: bold;\n }\n .syntax--package {\n color: @syntax-emphasized-color;\n }\n .syntax--variable.syntax--import {\n font-weight: normal;\n }\n\n .syntax--type {\n .syntax--bounds, .syntax--class {\n color: @violet;\n }\n }\n\n .syntax--documentation {\n :not(.syntax--embedded) {\n // out of scope ?\n // https://github.syntax--com/atom/link\n &.syntax--link.syntax--entity {\n color: @blue;\n text-decoration: underline;\n }\n .syntax--class, .syntax--parameter {\n color: @syntax-emphasized-color;\n }\n .syntax--description {\n color: @syntax-comment-color;\n }\n }\n }\n\n .syntax--embedded {\n color: darken(@syntax-emphasized-color, 15%);\n\n // so we dont confused it with normal expressions\n font-style: italic;\n .syntax--margin, .syntax--delimiters {\n font-style: normal;\n }\n }\n}\n","digest":"6edaa134daab31cecf6827ac74b9ee9653d42dab"},"node_modules/solarized-light-syntax/index.less":{"content":"@import \"variables/ui-variables\";\n@import \"variables/syntax-variables\";\n\n// Solarized Syntax Theme\n\n@import \"styles/syntax-variables.less\";\n\n// Editor\n@import \"styles/editor.less\";\n\n// Languages\n@import \"styles/syntax/_base.less\";\n@import \"styles/syntax/c.less\";\n@import \"styles/syntax/coffee.less\";\n@import \"styles/syntax/css.less\";\n@import \"styles/syntax/go.less\";\n@import \"styles/syntax/java.less\";\n@import \"styles/syntax/javascript.less\";\n@import \"styles/syntax/markdown.less\";\n@import \"styles/syntax/markup.less\";\n@import \"styles/syntax/php.less\";\n@import \"styles/syntax/python.less\";\n@import \"styles/syntax/ruby.less\";\n@import \"styles/syntax/scala.less\";\n","digest":"a71910d7884e81ff362d6059ef1b0440c81f9223"},"node_modules/solarized-light-syntax/styles/colors.less":{"content":"\n// Solarized color scheme\n// http://ethanschoonover.com/solarized#the-values\n\n// Background/Foreground Tones\n@base03: #002b36;\n@base02: #073642;\n\n// Content Tones\n@base01: #586e75;\n@base00: #657b83;\n@base0: #839496;\n@base1: #93a1a1;\n\n// Background/Foreground Tones\n@base2: #eee8d5;\n@base3: #fdf6e3;\n\n// Accent Colors\n@yellow: #b58900;\n@orange: #cb4b16;\n@red: #dc322f;\n@magenta: #d33682;\n@violet: #6c71c4;\n@blue: #268bd2;\n@cyan: #2aa198;\n@green: #859900;\n","digest":"b88cf362fd45cb5f470f88ca4bf885ed33b48652"},"node_modules/solarized-light-syntax/styles/editor.less":{"content":"atom-text-editor {\n color: @syntax-text-color;\n background-color: @syntax-background-color;\n\n .gutter {\n color: @syntax-gutter-text-color;\n background-color: @syntax-gutter-background-color;\n\n .line-number {\n &.cursor-line {\n background-color: @syntax-gutter-background-color-selected;\n }\n }\n }\n\n .invisible-character {\n color: @syntax-invisible-character-color;\n }\n\n .indent-guide {\n color: @syntax-indent-guide-color;\n }\n\n .cursor {\n border-color: @syntax-cursor-color;\n }\n\n .selection .region {\n background-color: @syntax-selection-color;\n }\n\n .fold-marker:after,\n .gutter .line-number.folded {\n color: @magenta;\n }\n\n .bracket-matcher .region {\n border-color: @magenta;\n }\n}\n","digest":"ecdc841891ddd65c51150615e73e588bad414e4e"},"node_modules/solarized-light-syntax/styles/syntax-variables.less":{"content":"@import \"colors.less\";\n\n// This defines all syntax variables that syntax themes must implement when they\n// include a syntax-variables.less file.\n\n// General colors\n@syntax-text-color: @base00;\n@syntax-cursor-color: @base03;\n@syntax-selection-color: @base2;\n@syntax-selection-flash-color: @base0;\n@syntax-background-color: @base3;\n\n// Guide colors\n@syntax-wrap-guide-color: darken(@base2, 12%);\n@syntax-indent-guide-color: darken(@base2, 12%);\n@syntax-invisible-character-color: darken(@base2, 12%);\n\n// For find and replace markers\n@syntax-result-marker-color: @base1;\n@syntax-result-marker-color-selected: @base03;\n\n// Gutter colors\n@syntax-gutter-text-color: @base00;\n@syntax-gutter-text-color-selected: @base01;\n@syntax-gutter-background-color: @base2;\n@syntax-gutter-background-color-selected: darken(@syntax-gutter-background-color, 4%);\n\n// For git diff info. i.e. in the gutter\n@syntax-color-added: @green;\n@syntax-color-renamed: @blue;\n@syntax-color-modified: @yellow;\n@syntax-color-removed: @red;\n\n// For language entity colors\n@syntax-color-variable: @blue;\n@syntax-color-constant: @yellow;\n@syntax-color-property: @yellow;\n@syntax-color-value: @cyan;\n@syntax-color-function: @blue;\n@syntax-color-method: @blue;\n@syntax-color-class: @blue;\n@syntax-color-keyword: @green;\n@syntax-color-tag: @blue;\n@syntax-color-attribute: @syntax-comment-color;\n@syntax-color-import: @red;\n@syntax-color-snippet: @syntax-color-keyword;\n\n\n// Custom variables\n// Warning: Don't use in packages\n\n@syntax-comment-color: @base1;\n@syntax-subtle-color: @base00;\n@syntax-emphasized-color: @base01;\n","digest":"06ab8a6bd7281bba5402f79a968fafdada8e91c6"},"node_modules/solarized-light-syntax/styles/syntax/_base.less":{"content":"\n.syntax--comment {\n color: @syntax-comment-color;\n font-style: italic;\n\n .syntax--markup.syntax--link {\n color: @syntax-comment-color;\n }\n}\n\n.syntax--string {\n color: @cyan;\n &.syntax--regexp {\n color: @red;\n }\n}\n\n.syntax--constant {\n &.syntax--numeric {\n color: @magenta;\n }\n &.syntax--language {\n color: @yellow;\n }\n &.syntax--character,\n &.syntax--other {\n color: @orange;\n }\n}\n\n.syntax--variable {\n color: @blue;\n}\n\n.syntax--keyword {\n color: @green;\n}\n\n.syntax--storage {\n color: @green;\n}\n\n.syntax--entity {\n &.syntax--name {\n &.syntax--class,\n &.syntax--type,\n &.syntax--function {\n color: @blue;\n }\n }\n &.syntax--other.syntax--attribute-name {\n color: @syntax-subtle-color;\n }\n}\n\n.syntax--support {\n &.syntax--function {\n color: @blue;\n &.syntax--builtin {\n color: @green;\n }\n }\n &.syntax--type,\n &.syntax--class {\n color: @green;\n }\n}\n\n.syntax--tag {\n &.syntax--entity.syntax--name {\n color: @blue;\n }\n &.syntax--punctuation.syntax--definition {\n &.syntax--html,\n &.syntax--begin,\n &.syntax--end {\n color: @syntax-comment-color;\n }\n }\n}\n\n.syntax--invalid {\n &.syntax--deprecated {\n color: @yellow;\n text-decoration: underline;\n }\n &.syntax--illegal {\n color: @red;\n text-decoration: underline;\n }\n}\n\n.syntax--none {\n color: @syntax-text-color;\n}\n","digest":"b7422f8dafb69db51d42f6afa850388e558f4456"},"node_modules/solarized-light-syntax/styles/syntax/c.less":{"content":".syntax--source.syntax--c,\n.syntax--source.syntax--cpp {\n .syntax--meta.syntax--preprocessor {\n color: @red;\n }\n .syntax--keyword.syntax--control.syntax--directive {\n color: @orange;\n }\n .syntax--punctuation.syntax--string {\n color: @cyan;\n }\n .syntax--constant {\n color: @orange;\n\n &.syntax--numeric, &.syntax--language.syntax--c {\n color: @cyan;\n }\n }\n .syntax--storage {\n color: @yellow;\n }\n .syntax--entity {\n color: @syntax-text-color;\n\n &.syntax--name.syntax--function.syntax--preprocessor {\n color: @red;\n }\n }\n .syntax--support.syntax--type {\n color: @yellow;\n\n &.syntax--posix-reserved {\n color: @syntax-text-color;\n }\n }\n .syntax--variable {\n &.syntax--other.syntax--dot-access {\n color: @syntax-text-color;\n }\n &.syntax--parameter.syntax--preprocessor {\n color: @red;\n }\n }\n}\n","digest":"839d65ac623e01b74b7e42269590d9feff8fa65c"},"node_modules/solarized-light-syntax/styles/syntax/coffee.less":{"content":".syntax--source.syntax--coffee {\n .syntax--support.syntax--class {\n color: @green;\n }\n\n .syntax--variable,\n .syntax--entity.syntax--name.syntax--function,\n .syntax--entity.syntax--name.syntax--class {\n color: @blue;\n }\n .syntax--variable.syntax--parameter.syntax--function {\n color: @syntax-text-color;\n }\n .syntax--variable.syntax--other.syntax--readwrite {\n color: @green;\n }\n\n .syntax--storage.syntax--type.syntax--function {\n color: @green;\n }\n\n .syntax--entity.syntax--name {\n color: @syntax-text-color;\n }\n\n .syntax--meta.syntax--brace {\n &.syntax--round,\n &.syntax--square {\n color: @syntax-text-color;\n }\n }\n .syntax--meta.syntax--delimiter {\n color: @syntax-text-color;\n }\n\n .syntax--storage.syntax--type.syntax--class {\n color: @green;\n }\n\n .syntax--punctuation.syntax--terminator {\n color: @syntax-text-color;\n }\n\n .syntax--punctuation.syntax--section.syntax--embedded {\n color: @red;\n }\n .syntax--embedded.syntax--source {\n color: @syntax-text-color;\n }\n\n .syntax--constant.syntax--numeric {\n color: @magenta;\n }\n\n .syntax--constant.syntax--language.syntax--boolean {\n color: @yellow;\n }\n}\n","digest":"2736764cbf69f7adaac92819ca676cbce669b54b"},"node_modules/solarized-light-syntax/styles/syntax/css.less":{"content":".syntax--source.syntax--css {\n\n .syntax--punctuation {\n &.syntax--separator,\n &.syntax--terminator {\n color: @syntax-text-color;\n }\n &.syntax--property-list.syntax--begin,\n &.syntax--property-list.syntax--end {\n color: @red;\n }\n &.syntax--section.syntax--function {\n color: @cyan;\n }\n }\n\n .syntax--entity.syntax--name {\n color: @green;\n }\n .syntax--attribute-name.syntax--class,\n .syntax--id {\n color: @blue;\n }\n .syntax--pseudo-element,\n .syntax--pseudo-class {\n color: @orange;\n }\n\n .syntax--property-value {\n color: @cyan;\n }\n .syntax--constant.syntax--numeric {\n color: @cyan;\n .syntax--unit {\n color: @cyan;\n }\n }\n .syntax--rgb-value {\n color: @cyan;\n }\n .syntax--support.syntax--constant {\n color: @cyan;\n &.syntax--media {\n color: @red;\n }\n }\n\n .syntax--keyword.syntax--important {\n color: @red;\n }\n\n}\n\n\n// Less/Sass should have their own files,\n// but for just a single override, here should be fine too\n\n.syntax--source.syntax--less,\n.syntax--source.syntax--scss {\n .syntax--keyword.syntax--unit {\n color: @cyan;\n }\n}\n","digest":"b6fac27e3e87d879c7bc7c62b4fb67106cdbb3c7"},"node_modules/solarized-light-syntax/styles/syntax/go.less":{"content":".syntax--source.syntax--go {\n\n .syntax--operator {\n color: @syntax-text-color;\n &.syntax--assignment {\n color: @green;\n }\n }\n\n}\n","digest":"2a8e5aaf48786eb497de8fc9bf8f1003a8ece54b"},"node_modules/solarized-light-syntax/styles/syntax/java.less":{"content":".syntax--source.syntax--java {\n .syntax--keyword.syntax--operator{\n color:@green;\n }\n .syntax--keyword.syntax--import{\n color: @orange;\n }\n .syntax--storage.syntax--modifier.syntax--import{\n color: @syntax-comment-color;\n }\n .syntax--meta.syntax--class{\n .syntax--storage.syntax--modifier{\n color: @yellow;\n }\n .syntax--meta.syntax--class.syntax--identifier{\n .syntax--entity.syntax--name.syntax--type.syntax--class{\n color: @blue;\n }\n }\n }\n .syntax--storage.syntax--type.syntax--primitive.syntax--array{\n color:@green;\n }\n .syntax--constant.syntax--numeric{\n color:@magenta;\n }\n .syntax--constant.syntax--other{\n color:@orange;\n }\n .syntax--storage.syntax--type{\n color:@green;\n }\n .syntax--meta.syntax--method-call{\n //@ibocon: method parameter's color\n color:@red;\n //@ibocon: method and variable use different hightlight\n .syntax--meta.syntax--method{\n color:@violet;\n }\n .syntax--punctuation.syntax--definition.syntax--seperator.syntax--parameter{\n color:@green;\n }\n }\n .syntax--punctuation.syntax--definition.syntax--method-parameters{\n color: @syntax-emphasized-color;\n }\n}\n","digest":"7ed0d0331bfcc2ca5bfa85dddaa51e547df18593"},"node_modules/solarized-light-syntax/styles/syntax/javascript.less":{"content":".syntax--source.syntax--js {\n .syntax--constant {\n color: @green;\n }\n\n .syntax--comma {\n color: @syntax-text-color;\n }\n\n .syntax--support.syntax--class {\n color: @green;\n }\n\n .syntax--entity.syntax--name.syntax--type {\n color: @yellow;\n }\n .syntax--entity.syntax--name {\n color: @syntax-text-color;\n }\n\n .syntax--meta.syntax--brace {\n color: @syntax-text-color;\n }\n\n .syntax--keyword {\n color: @syntax-text-color;\n }\n .syntax--keyword.syntax--operator.syntax--new {\n color: @green;\n }\n .syntax--keyword.syntax--control {\n color: @green;\n }\n .syntax--keyword.syntax--control.syntax--regexp {\n color: @cyan;\n }\n\n .syntax--variable {\n color: @blue;\n }\n .syntax--variable.syntax--parameter {\n color: @syntax-text-color;\n }\n\n .syntax--regexp {\n color: @cyan;\n }\n\n .syntax--support.syntax--function {\n color: @violet;\n }\n .syntax--support.syntax--constant {\n color: @syntax-text-color;\n }\n\n .syntax--constant.syntax--numeric {\n color: @syntax-text-color;\n }\n\n .syntax--punctuation.syntax--terminator.syntax--statement {\n color: @syntax-text-color;\n }\n\n .syntax--meta.syntax--delimiter.syntax--method.syntax--period {\n color: @syntax-text-color;\n }\n .syntax--meta.syntax--brace.syntax--square {\n color: @blue;\n }\n .syntax--meta.syntax--brace.syntax--curly {\n color: @blue;\n }\n .syntax--string.syntax--quoted.syntax--template {\n .syntax--embedded.syntax--source {\n color: @syntax-text-color;\n & > .syntax--embedded.syntax--punctuation {\n color: @red;\n }\n }\n }\n &.syntax--embedded .syntax--entity.syntax--name.syntax--tag {\n color: @blue;\n }\n}\n.syntax--source.syntax--js.syntax--jsx {\n .syntax--entity.syntax--name.syntax--tag {\n color: @blue;\n }\n}\n","digest":"532bc7043760ab4871e93837007d95efa23dcb23"},"node_modules/solarized-light-syntax/styles/syntax/markdown.less":{"content":".syntax--gfm {\n .syntax--link .syntax--entity {\n color: @violet;\n }\n\n .syntax--list {\n &.syntax--ordered {\n color: @green;\n }\n &.syntax--unordered {\n color: @yellow;\n }\n }\n\n .syntax--raw {\n font-style: italic;\n }\n\n &.syntax--support {\n color:@syntax-comment-color;\n &.syntax--quote {\n color: @violet;\n }\n }\n}\n","digest":"6a33df58ae2d94dc7b7e7264a72d39942acc0c9e"},"node_modules/solarized-light-syntax/styles/syntax/markup.less":{"content":".syntax--markup {\n\n &.syntax--bold {\n font-weight: bold;\n }\n &.syntax--italic {\n font-style: italic;\n }\n\n &.syntax--heading {\n color: @blue;\n }\n\n &.syntax--link {\n color: @cyan;\n }\n\n &.syntax--deleted {\n color: @red;\n }\n\n &.syntax--changed {\n color: @yellow;\n }\n\n &.syntax--inserted {\n color: @cyan;\n }\n\n}\n","digest":"2b1893b8d2de8d42b582efbd90608833a8e26fdc"},"node_modules/solarized-light-syntax/styles/syntax/php.less":{"content":".syntax--source.syntax--php {\n .syntax--storage {\n &.syntax--type {\n &.syntax--class {\n color: @yellow;\n }\n &.syntax--function {\n color: @orange;\n }\n }\n &.syntax--modifier {\n color: @yellow;\n }\n }\n .syntax--entity {\n &.syntax--name {\n &.syntax--type.syntax--class {\n color: @syntax-text-color;\n }\n &.syntax--function {\n color: @syntax-text-color;\n }\n }\n &.syntax--other {\n color: @syntax-text-color;\n }\n }\n .syntax--variable {\n color: @blue;\n }\n .syntax--punctuation.syntax--definition {\n color: @syntax-text-color;\n &.syntax--comment {\n color: @syntax-comment-color;\n }\n &.syntax--array {\n color: @red;\n }\n &.syntax--string {\n color: @syntax-text-color;\n }\n &.syntax--variable {\n color: @green;\n }\n }\n .syntax--support.syntax--function {\n &.syntax--construct {\n color: @yellow;\n }\n &.syntax--array {\n color: @green;\n }\n }\n .syntax--keyword {\n &.syntax--operator {\n &.syntax--class {\n color: @yellow;\n }\n &.syntax--assignment {\n color: @green;\n }\n }\n &.syntax--other {\n color: @red;\n }\n }\n}\n","digest":"4c57fce11fabe63d59d4e0d964477d7a54ee8f83"},"node_modules/solarized-light-syntax/styles/syntax/python.less":{"content":".syntax--source.syntax--python {\n .syntax--entity {\n color: @syntax-text-color;\n\n &.syntax--name {\n color: @blue;\n }\n &.syntax--other {\n color: @blue;\n }\n }\n\n .syntax--function {\n color: @blue;\n\n &.syntax--magic {\n color: @blue;\n }\n }\n\n .syntax--punctuation.syntax--string {\n color: @cyan;\n }\n .syntax--keyword {\n &.syntax--operator {\n color: @syntax-text-color;\n &.syntax--quantifier {\n color: @cyan;\n }\n &.syntax--logical {\n color: @green;\n }\n }\n &.syntax--control.syntax--import {\n color: @orange;\n }\n &.syntax--other {\n color: @green;\n }\n }\n .syntax--constant {\n &.syntax--language {\n color: @blue;\n }\n &.syntax--character {\n color: @cyan;\n }\n &.syntax--other {\n color: @red;\n }\n }\n\n .syntax--entity.syntax--name.syntax--type.syntax--class {\n color: @blue;\n }\n .syntax--variable {\n color: @syntax-text-color;\n }\n .syntax--support {\n &.syntax--function.syntax--builtin {\n color: @blue;\n }\n &.syntax--type {\n &.syntax--exception.syntax--python {\n color: @yellow;\n }\n &.syntax--python {\n color: @blue;\n }\n }\n }\n .syntax--storage.syntax--type.syntax--string {\n color: @cyan;\n }\n\n .syntax--storage.syntax--type.syntax--class {\n color: @green;\n &.syntax--todo {\n color: @magenta;\n }\n }\n\n .syntax--storage.syntax--type.syntax--function {\n color: @green;\n }\n\n .syntax--punctuation.syntax--definition.syntax--parameters {\n color: @syntax-text-color;\n }\n\n .syntax--punctuation.syntax--section.syntax--function.syntax--begin {\n color: @syntax-text-color;\n }\n\n .syntax--punctuation.syntax--separator.syntax--parameters {\n color: @syntax-text-color;\n }\n\n\n}\n","digest":"33190f5b629f061f135b7bbd8be544b6c06ed4f8"},"node_modules/solarized-light-syntax/styles/syntax/ruby.less":{"content":".syntax--source.syntax--ruby {\n\n .syntax--meta.syntax--embedded {\n .syntax--punctuation.syntax--section {\n color: @red;\n }\n }\n .syntax--punctuation.syntax--definition {\n color: @syntax-text-color;\n &.syntax--string {\n color: @red;\n }\n }\n .syntax--punctuation.syntax--definition.syntax--comment {\n color: @syntax-comment-color;\n }\n .syntax--entity.syntax--inherited-class {\n color: @yellow;\n }\n .syntax--variable {\n &.syntax--parameter {\n color: @syntax-text-color;\n }\n }\n .syntax--variable.syntax--constant {\n color: @yellow;\n }\n .syntax--constant.syntax--boolean {\n color: @cyan;\n }\n .syntax--instance {\n .syntax--punctuation.syntax--definition {\n color: @blue;\n }\n }\n .syntax--class {\n color: @yellow;\n &.syntax--control {\n color: @syntax-text-color;\n }\n }\n .syntax--module {\n color: @yellow;\n }\n .syntax--require {\n .syntax--keyword.syntax--other.syntax--special-method {\n color: @orange;\n }\n }\n .syntax--keyword.syntax--other.syntax--special-method {\n color: @orange;\n }\n .syntax--keyword.syntax--other {\n color: @green;\n }\n .syntax--keyword.syntax--control {\n color: @green;\n }\n .syntax--keyword.syntax--operator {\n color: @syntax-text-color;\n }\n .syntax--special-method {\n color: @blue;\n }\n .syntax--symbol {\n color: @cyan;\n .syntax--punctuation.syntax--definition {\n color: @cyan;\n }\n }\n .syntax--hashkey {\n color: @red;\n .syntax--punctuation.syntax--definition {\n color: @red;\n }\n }\n .syntax--string.syntax--regexp {\n color: @red;\n }\n .syntax--todo {\n color: @magenta;\n }\n .syntax--variable.syntax--ruby.syntax--global {\n color: @blue;\n .syntax--punctuation {\n color: @blue;\n }\n }\n .syntax--variable.syntax--block {\n color: @blue;\n }\n .syntax--variable.syntax--self {\n color: @cyan;\n }\n .syntax--punctuation.syntax--separator {\n color: @syntax-text-color;\n }\n .syntax--numeric {\n color: @cyan;\n }\n .syntax--punctuation.syntax--section.syntax--regexp {\n color: @red;\n }\n .syntax--string.syntax--interpolated {\n color: @cyan;\n }\n .syntax--string.syntax--interpolated {\n .syntax--embedded.syntax--line.syntax--ruby {\n .syntax--punctuation {\n .syntax--source.syntax--ruby {\n color: @red;\n }\n }\n .syntax--source.syntax--ruby {\n .syntax--punctuation.syntax--array,\n .syntax--punctuation.syntax--function {\n color: @syntax-text-color;\n }\n color: @syntax-text-color;\n }\n }\n }\n .syntax--support.syntax--function {\n color: @syntax-text-color;\n }\n .syntax--support.syntax--function.syntax--kernel {\n color: @green;\n }\n}\n","digest":"cfe9b7caebcae391298920cc1ad3ed4f945a1219"},"node_modules/solarized-light-syntax/styles/syntax/scala.less":{"content":".syntax--source.syntax--scala {\n .syntax--variable {\n color: @syntax-emphasized-color;\n }\n\n .syntax--declaration {\n color: @syntax-emphasized-color;\n font-weight: bold;\n }\n .syntax--comparison {\n color: @syntax-emphasized-color;\n }\n .syntax--class, .syntax--type {\n color: @yellow;\n }\n .syntax--val {\n font-weight: normal;\n }\n .syntax--variable {\n font-weight: bold;\n }\n .syntax--variable.syntax--parameter {\n color: @violet;\n font-weight: normal;\n }\n .syntax--control.syntax--flow {\n color: @syntax-emphasized-color;\n font-weight: bold;\n }\n .syntax--constant.syntax--language {\n color: @syntax-emphasized-color;\n font-weight: bold;\n }\n .syntax--function.syntax--declaration {\n color: @violet;\n }\n .syntax--modifier.syntax--other {\n font-weight: bold;\n }\n .syntax--package {\n color: @syntax-emphasized-color;\n }\n .syntax--variable.syntax--import {\n font-weight: normal;\n }\n\n .syntax--type {\n .syntax--bounds, .syntax--class {\n color: @violet;\n }\n }\n\n .syntax--documentation {\n :not(.syntax--embedded) {\n // out of scope ?\n // https://github.syntax--com/atom/link\n &.syntax--link.syntax--entity {\n color: @blue;\n text-decoration: underline;\n }\n .syntax--class, .syntax--parameter {\n color: @syntax-emphasized-color;\n }\n .syntax--description {\n color: @syntax-comment-color;\n }\n }\n }\n\n .syntax--embedded {\n color: darken(@syntax-emphasized-color, 15%);\n\n // so we dont confused it with normal expressions\n font-style: italic;\n .syntax--margin, .syntax--delimiters {\n font-style: normal;\n }\n }\n}\n","digest":"6edaa134daab31cecf6827ac74b9ee9653d42dab"},"node_modules/atom-light-ui/index.less":{"content":"@import \"variables/ui-variables\";\n@import \"variables/syntax-variables\";\n@import \"styles/atom\";\n@import \"styles/utilities\";\n@import \"styles/text\";\n@import \"styles/git\";\n@import \"styles/sites\";\n@import \"styles/messages\";\n@import \"styles/progress\";\n@import \"styles/buttons\";\n@import \"styles/panels\";\n@import \"styles/panes\";\n@import \"styles/lists\";\n@import \"styles/overlays\";\n@import \"styles/editor\";\n@import \"styles/tabs\";\n@import \"styles/tooltips\";\n@import \"styles/tree-view\";\n","digest":"d25330939de17fc578686c2587d98d54c447a2d7"},"node_modules/atom-light-ui/styles/atom.less":{"content":"@import \"ui-variables\";\n\natom-workspace {\n background-color: @app-background-color;\n}\n\n.scrollbars-visible-always {\n ::-webkit-scrollbar {\n width: 10px;\n height: 10px;\n }\n\n ::-webkit-scrollbar-track,\n ::-webkit-scrollbar-corner {\n background: @scrollbar-background-color;\n }\n\n ::-webkit-scrollbar-thumb {\n background: @scrollbar-color;\n border-radius: 5px;\n\t\tbox-shadow: 0 0 1px white inset;\n }\n}\n","digest":"34f8850d50ad85ee0445f1c4b91efd2d227b9646"},"node_modules/atom-light-ui/styles/buttons.less":{"content":"@import \"ui-variables\";\n@import \"ui-mixins\";\n\n.btn-background (@color, @hover-color, @selected-color, @border-color, @text-color, @text-color-hover) {\n @border-shadow: inset 0 0 0 1px @border-color;\n @active-shadow: inset 0 3px 5px rgba(0, 0, 0, .125);\n color: @text-color;\n background-color: transparent;\n background-image: -webkit-linear-gradient(@color, darken(@color, 8%));\n box-shadow: @border-shadow;\n\n &:hover {\n color: @text-color-hover;\n background-image: -webkit-linear-gradient(@hover-color, darken(@hover-color, 8%));\n }\n &:active,\n &.selected:hover:active {\n box-shadow: @active-shadow, @border-shadow;\n }\n &.selected,\n &.selected:hover {\n color: @text-color-selected;\n box-shadow: inset 0 2px 5px rgba(0, 0, 0,.3), @border-shadow;\n text-shadow: 0 0 2px rgba(0, 0, 0, 0.3);\n background-image: -webkit-linear-gradient(darken(@selected-color, 8%), @selected-color);\n }\n &.selected:hover {\n box-shadow: @border-shadow;\n background-image: -webkit-linear-gradient(@selected-color, darken(@selected-color, 8%));\n }\n}\n\n.btn-variant (@color) {\n @bg: darken(@color, 10%);\n @hover: @color;\n @selected: @color;\n @border: fadeout(darken(@color, 20%), 50%);\n .btn-background(@bg, @hover, @selected, @border, @text-color-selected, @text-color-selected);\n}\n\n.btn {\n .btn-background(@button-background-color, @button-background-color-hover, @button-background-color-selected, @button-border-color, @text-color, @text-color-highlight);\n}\n\n.btn.btn-primary {\n .btn-variant(@background-color-info);\n}\n.btn.btn-info {\n .btn-variant(@background-color-info);\n}\n.btn.btn-success {\n .btn-variant(@background-color-success);\n}\n.btn.btn-warning {\n .btn-variant(@background-color-warning);\n}\n.btn.btn-error {\n .btn-variant(@background-color-error);\n}\n\n.btn-group > .btn {\n border: none;\n}\n","digest":"7aa58cf65c682c0342d3d7c8ae5eadc7b8cbf454"},"node_modules/atom-light-ui/styles/editor.less":{"content":"@import \"ui-variables\";\n@import \"ui-mixins\";\n\natom-text-editor[mini] {\n color: lighten(@text-color, 15%);\n background-color: darken(@input-background-color, 1%);\n border: 1px solid lighten(@input-border-color, 10%);\n\n box-shadow: inset 0 1px 1px rgba(0, 0, 0, .075);\n border-radius: @component-border-radius;\n padding-left: @component-padding/2;\n\n .cursor { border-color: #000; }\n .selection .region { background-color: rgba(0, 0, 0, .2); }\n .placeholder-text {\n color: lighten(@text-color-subtle, 10%);\n }\n}\n\natom-text-editor[mini].is-focused {\n color: @text-color;\n background-color: @input-background-color;\n border-color: @input-border-color;\n .placeholder-text {\n color: @text-color-subtle;\n }\n .selection .region {\n background-color: lighten(@background-color-info, 30%);\n }\n}\n\n// FIXME: these should go in syntax themes?\natom-text-editor {\n .gutter.drop-shadow {\n -webkit-box-shadow: -2px 0 10px 2px #222;\n }\n}\n","digest":"37bd11a43907a16e6b6251b5219a4a190ab1a3cc"},"node_modules/atom-light-ui/styles/git.less":{"content":"@import \"ui-mixins\";\n@import \"ui-variables\";\n\n.status { .text(normal); }\n.status-added { .text(success); }\n.status-ignored { .text(subtle); }\n.status-modified { .text(warning); }\n.status-removed { .text(error); }\n.status-renamed { .text(info); }\n","digest":"ed1ba6a0675bf1eb93fb84803c7830bc18adee6f"},"node_modules/atom-light-ui/styles/lists.less":{"content":"@import \"ui-variables\";\n@import \"ui-mixins\";\n@import \"octicon-mixins\";\n\n.list-group, .list-tree {\n li:not(.list-nested-item),\n li.list-nested-item > .list-item {\n .text(normal);\n }\n\n .generate-list-item-text-color(@class) {\n li:not(.list-nested-item).text-@{class},\n li.list-nested-item.text-@{class} > .list-item {\n .text(@class);\n }\n }\n .generate-list-item-text-color(subtle);\n .generate-list-item-text-color(info);\n .generate-list-item-text-color(success);\n .generate-list-item-text-color(warning);\n .generate-list-item-text-color(error);\n .generate-list-item-text-color(selected);\n\n .generate-list-item-status-color(@color, @status) {\n li:not(.list-nested-item).status-@{status},\n li.list-nested-item.status-@{status} > .list-item {\n color: @color;\n }\n\n li:not(.list-nested-item).selected.status-@{status},\n li.list-nested-item.selected.status-@{status} > .list-item {\n color: darken(@color, 7%);\n }\n }\n .generate-list-item-status-color(@text-color-subtle, ignored);\n .generate-list-item-status-color(@text-color-added, added);\n .generate-list-item-status-color(@text-color-renamed, renamed);\n .generate-list-item-status-color(@text-color-modified, modified);\n .generate-list-item-status-color(@text-color-removed, removed);\n\n li:not(.list-nested-item).selected,\n li.list-nested-item.selected > .list-item {\n .text(selected);\n }\n}\n\n.select-list ol.list-group,\n&.select-list ol.list-group {\n li.two-lines {\n .secondary-line { color: @text-color-subtle; }\n &.selected .secondary-line {\n color: lighten(@text-color-subtle, 10%);\n text-shadow: none;\n }\n }\n\n // We want to highlight the background of the list items because we dont\n // know their size.\n li.selected {\n background-color: @background-color-selected;\n &:before{ display: none; }\n }\n\n &.mark-active{\n @active-icon-size: 14px;\n\n // pad in front of the text where the icon would be We'll pad the non-\n // active items with a 'fake' icon so other classes can pad the item\n // without worrying about the icon padding.\n li:before {\n content: '';\n background-color: transparent;\n position: static;\n display: inline-block;\n left: auto; right: auto;\n height: @active-icon-size;\n width: @active-icon-size;\n }\n > li:not(.active):before {\n margin-right: @component-icon-padding;\n }\n li.active {\n .octicon(check, @active-icon-size);\n &:before {\n margin-right: @component-icon-padding;\n color: @text-color-success;\n }\n }\n }\n}\n\n.select-list.popover-list {\n background-color: @overlay-background-color;\n box-shadow: 0 0 10px @base-border-color;\n padding: @component-padding/2;\n border-radius: @component-border-radius;\n border: 1px solid @overlay-border-color;\n\n atom-text-editor {\n margin-bottom: @component-padding/2;\n }\n\n .list-group li {\n padding-left: @component-padding/2;\n }\n}\n\n.ui-sortable {\n li {\n line-height: 2.5;\n }\n\n // For sortable lists in the settings view\n li.ui-sortable-placeholder {\n visibility: visible !important;\n background-color: darken(@pane-item-background-color, 10%);\n }\n}\n\nli.ui-draggable-dragging, li.ui-sortable-helper {\n line-height: @component-line-height;\n height: @component-line-height;\n border: 0;\n border-radius: 0;\n list-style: none;\n padding: 0 @component-padding;\n background: @background-color-highlight;\n box-shadow: 0 0 1px @base-border-color;\n}\n","digest":"dbe592a33984fd82e6f51ba6eb9f7d40a2e7f40e"},"node_modules/atom-light-ui/styles/messages.less":{"content":"@import \"ui-variables\";\n\nul.background-message {\n font-weight: bold;\n color: rgba(0, 0, 0, .18);\n}\n","digest":"eafecb0865fc91954f31cdc032e2037ae51a93b8"},"node_modules/atom-light-ui/styles/overlays.less":{"content":"@import \"ui-variables\";\n\natom-panel.modal, .overlay {\n color: @text-color;\n background-color: @overlay-background-color;\n padding: @component-padding;\n border: 1px solid @overlay-border-color;\n box-shadow: 0 0 10px @base-border-color;\n border-radius: @component-border-radius;\n\n atom-text-editor[mini] {\n margin-bottom: @component-padding;\n }\n\n .select-list ol.list-group,\n &.select-list ol.list-group {\n\n background-color: @inset-panel-background-color;\n\n li {\n padding: @component-padding;\n border-top: 1px solid @inset-panel-border-color;\n border-left: 1px solid @inset-panel-border-color;\n border-right: 1px solid @inset-panel-border-color;\n &:last-child { border-bottom: 1px solid @inset-panel-border-color; }\n\n &.two-lines { padding: @component-padding/2 @component-padding; }\n &.selected {\n color: @text-color;\n background-color: @background-color-highlight;\n }\n\n .status.icon {\n float: right;\n margin-left: @component-icon-padding;\n &:before {\n margin-right: 0;\n }\n }\n }\n\n }\n}\n","digest":"369ed7edbe06e3901a5786d751d7214583bfcc64"},"node_modules/atom-light-ui/styles/panels.less":{"content":"@import \"ui-mixins\";\n@import \"ui-variables\";\n@import \"buttons\";\n\n.panel {\n &.bordered {\n border: 1px solid @base-border-color;\n border-radius: @component-border-radius;\n }\n}\n\natom-panel, .tool-panel {\n .text(normal);\n position: relative;\n\n background-color: @tool-panel-background-color;\n\n &.bottom, &.panel-bottom,\n &.footer, &.footer-bottom {\n border-top: 1px solid @tool-panel-border-color;\n }\n\n &.left, &.panel-left {\n border-right: 1px solid @tool-panel-border-color;\n }\n\n &.right, &.panel-right {\n border-left: 1px solid @tool-panel-border-color;\n }\n\n .inset-panel {\n border-radius: @component-border-radius;\n\n border: 1px solid @tool-panel-border-color;\n }\n}\n\n.inset-panel {\n position: relative;\n background-color: @inset-panel-background-color;\n}\n\n.panel-heading {\n border-bottom: none;\n padding: @component-padding - 2px @component-padding;\n\n background-color: transparent;\n background-image: -webkit-linear-gradient(@panel-heading-background-color, darken(@panel-heading-background-color, 10%));\n\n .btn {\n @bg: lighten(@button-background-color, 10%);\n @hover: lighten(@button-background-color-hover, 10%);\n @selected: lighten(@button-background-color-selected, 10%);\n @text: lighten(@text-color, 10%);\n .btn-background(@bg, @hover, @selected, @button-border-color, @text, @text);\n }\n}\n","digest":"b2cb423407ada7c4a0f0b3c9d817b0cffb577a4b"},"node_modules/atom-light-ui/styles/panes.less":{"content":"@import \"ui-mixins\";\n@import \"ui-variables\";\n@import \"buttons\";\n\natom-pane-container {\n atom-pane {\n background-color: lighten(@app-background-color, 3%);\n\n &:focus {\n background-color: @app-background-color;\n }\n }\n\n atom-pane-axis.horizontal > * {\n border-right: 1px solid @pane-item-border-color;\n &:last-child { border-right: none; }\n }\n\n atom-pane-axis.vertical > * {\n border-bottom: 1px solid @pane-item-border-color;\n &:last-child { border-bottom: none; }\n }\n}\n","digest":"4d99e32069dceadb0704ae10f4cbe2f50a94fded"},"node_modules/atom-light-ui/styles/progress.less":{"content":"@import \"ui-variables\";\n@import \"ui-mixins\";\n\n.loading-spinner(@size) {\n width: @size;\n height: @size;\n display: block;\n\n background-image: url(images/octocat-spinner-128.gif);\n background-repeat: no-repeat;\n background-size: cover;\n\n &.inline-block {\n display: inline-block;\n }\n}\n\n.loading-spinner-large {\n .loading-spinner(64px);\n}\n\n.loading-spinner-medium {\n .loading-spinner(50px);\n}\n\n.loading-spinner-small {\n .loading-spinner(32px);\n}\n\n.loading-spinner-tiny {\n .loading-spinner(20px);\n}\n\n// Much learning from:\n// http://css-tricks.com/html5-progress-element/\n\n@progress-height: 16px;\n@progress-shine-gradient: -webkit-linear-gradient(top, rgba(255, 255, 255, .15), rgba(0, 0, 0, .15));\n\nprogress {\n height: @progress-height;\n -webkit-appearance: none;\n border-radius: @component-border-radius;\n background-color: #ccc;\n background-image:\n -webkit-linear-gradient(-30deg,\n transparent 33%, rgba(0, 0, 0, .1) 33%,\n rgba(0,0, 0, .1) 66%, transparent 66%),\n @progress-shine-gradient;\n border-radius: 2px;\n background-size: 25px @progress-height, 100% 100%, 100% 100%;\n -webkit-animation: animate-stripes 5s linear 6; // stop animation after 6 runs (30s) to limit CPU usage\n}\n\nprogress::-webkit-progress-bar {\n background-color: transparent;\n}\n\nprogress::-webkit-progress-value {\n border-radius: @component-border-radius;\n background-image: @progress-shine-gradient;\n background-color: @background-color-info;\n}\n\nprogress[value] {\n background-image: @progress-shine-gradient;\n -webkit-animation: none;\n}\n\n@-webkit-keyframes animate-stripes {\n 100% { background-position: 100px 0px; }\n}\n","digest":"e8d84d52c7384e39fd5d1fa56af007ba7651b1b7"},"node_modules/atom-light-ui/styles/sites.less":{"content":"@import \"ui-mixins\";\n@import \"ui-variables\";\n\n.ui-site(@num, @color) {\n .ui-site-@{num} {\n background-color: @color;\n }\n}\n\n.ui-site(1, @ui-site-color-1);\n.ui-site(2, @ui-site-color-2);\n.ui-site(3, @ui-site-color-3);\n.ui-site(4, @ui-site-color-4);\n.ui-site(5, @ui-site-color-5);\n","digest":"3d13f4d6504d0f8e86aa5b9971eb50a445303fdd"},"node_modules/atom-light-ui/styles/tabs.less":{"content":"@import \"ui-variables\";\n@tab-radius: 3px;\n@modified-icon-width: 8px;\n@tab-skew: 30deg;\n@tab-top-padding: 5px;\n@tab-bottom-border-height: 5px;\n@tab-border: 1px solid @tab-border-color;\n@tab-max-width: 160px;\n\n.tab-bar {\n height: @tab-height + @tab-top-padding + @tab-bottom-border-height;\n background-image: -webkit-linear-gradient(top, @tab-bar-background-color, lighten(@tab-bar-background-color, 9%));\n box-shadow: inset 0 -8px 8px -4px rgba(0,0,0, .15);\n padding: 0 10px 0 25px;\n overflow-x: auto;\n overflow-y: hidden;\n\n &::-webkit-scrollbar {\n display: none;\n }\n\n &:after {\n content: \"\";\n position: absolute;\n bottom: 0;\n height: @tab-bottom-border-height;\n left: 0;\n right: 0;\n background-color: @tab-background-color-active;\n border-bottom: 1px solid @tab-bar-border-color;\n border-top: 1px solid @tab-border-color;\n pointer-events: none;\n }\n\n .tab {\n position: relative;\n top: @tab-top-padding;\n max-width: @tab-max-width;\n height: @tab-height;\n line-height: @tab-height;\n color: @text-color;\n padding: 0;\n margin: 0 20px 0 5px;\n\n box-shadow: inset -1px -1px 1px rgba(0,0,0, .05);\n transition: color .1s ease-in;\n\n &, &:before, &:after {\n background-image: -webkit-linear-gradient(top, @tab-background-color, darken(@tab-background-color, 6%));\n border-top: @tab-border;\n }\n\n &:before, &:after {\n content: '';\n position: absolute;\n top: -1px;\n width: 25px;\n height: @tab-height;\n }\n\n // left angled edge\n &:before {\n left: -14px;\n border-top-left-radius: @tab-radius;\n border-left: @tab-border;\n box-shadow: inset 1px -1px 1px rgba(0,0,0, .05);\n -webkit-transform: skewX(-@tab-skew);\n }\n\n // right angled edge\n &:after {\n right: -14px;\n border-top-right-radius: @tab-radius;\n border-right: @tab-border;\n box-shadow: inset -1px -1px 1px rgba(0,0,0, .05);\n -webkit-transform: skewX(@tab-skew);\n }\n\n .close-icon {\n right: 0;\n z-index: 3;\n text-align: right;\n line-height: @tab-height;\n color: @text-color;\n\n &:hover {\n color: inherit;\n }\n }\n\n &.modified:not(:hover) .close-icon {\n right: 0;\n top: @tab-height/2 - @modified-icon-width/2 + 1px;\n width: @modified-icon-width;\n height: @modified-icon-width;\n }\n\n &.modified:hover .close-icon:hover {\n color: @text-color-highlight;\n }\n\n .title {\n position: relative;\n z-index: 1;\n margin-top: -@tab-top-padding - 1px;\n padding-top: @tab-top-padding + 1px;\n padding-right: 10px;\n }\n }\n\n .tab.active {\n z-index: 1;\n color: @text-color-highlight;\n\n .close-icon {\n line-height: @tab-height - 1px;\n color: @text-color;\n }\n\n &, &:before, &:after {\n background: @tab-background-color-active;\n height: @tab-height + 1px;\n box-shadow: none;\n }\n }\n\n .tab:hover {\n color: @text-color-highlight;\n }\n\n .tab.active:hover .close-icon {\n color: @text-color;\n\n &:hover {\n color: inherit;\n }\n }\n\n .placeholder {\n height: @tab-height + @tab-top-padding + @tab-bottom-border-height;\n margin-left: -9px; // center between tabs\n pointer-events: none;\n &:after {\n top: @tab-height + @tab-top-padding + @tab-bottom-border-height - 2px;\n }\n }\n}\n","digest":"78fa4fc0ad6954c8595d32643d774c3f23a2ce4e"},"node_modules/atom-light-ui/styles/text.less":{"content":"@import \"ui-mixins\";\n@import \"ui-variables\";\n\nh1,\nh2,\nh3 {\n line-height: 1em;\n margin-bottom: 15px\n}\nh1 { font-size: 2em; }\nh2 { font-size: 1.5em; }\nh3 { font-size: 1.2em; }\n\np {\n line-height: 1.6;\n margin-bottom: 15px;\n}\n\nlabel {\n font-weight: normal;\n}\n\npre {\n box-shadow: none;\n color: @text-color;\n background: @inset-panel-background-color;\n border-radius: @component-border-radius;\n border: none;\n margin: 0;\n}\n\ncode {\n .text(highlight);\n background: @background-color-highlight;\n border-radius: @component-border-radius;\n}\n\n.selected { .text(highlight); }\n\n.text-smaller { font-size: 0.9em; }\n\n.text-subtle { .text(subtle); }\n.text-highlight { .text(highlight); }\n\n.text-error { .text(error); }\n.text-info {\n .text(info);\n &:hover { color: @text-color-info; }\n}\n.text-warning {\n .text(warning);\n &:hover { color: @text-color-warning; }\n}\n.text-success {\n .text(success);\n &:hover { color: @text-color-success; }\n}\n\n.highlight {\n color: @text-color-highlight;\n font-weight: bold;\n text-shadow: none;\n background-color: @background-color-highlight;\n border-radius: @component-border-radius;\n padding: 1px 3px;\n}\n\n.highlight-color(@name, @color) {\n .highlight-@{name} {\n color: @text-color-highlight;\n font-weight: bold;\n text-shadow: none;\n background-color: @color;\n border-radius: @component-border-radius;\n padding: 1px 3px;\n }\n}\n.highlight-color(info, @background-color-info);\n.highlight-color(warning, @background-color-warning);\n.highlight-color(error, @background-color-error);\n.highlight-color(success, @background-color-success);\n","digest":"7af63d586b405150455e954e6325962c821dc7d0"},"node_modules/atom-light-ui/styles/tooltips.less":{"content":"@import \"ui-variables\";\n\n.tooltip {\n @tip-background-color: #333;\n @tip-text-color: #fff;\n white-space: nowrap;\n\n .keystroke {\n font-family: Helvetica, Arial, sans-serif;\n font-size: 13px;\n color: #c0c0c0;\n padding-left: 2px;\n }\n\n &.in { opacity: 1; }\n\n .tooltip-inner {\n line-height: 19px;\n border-radius: @component-border-radius;\n background-color: @tip-background-color;\n color: @tip-text-color;\n white-space: nowrap;\n max-width: none;\n }\n\n &.top .tooltip-arrow {\n border-top-color: @tip-background-color;\n }\n &.top-left .tooltip-arrow {\n border-top-color: @tip-background-color;\n }\n &.top-right .tooltip-arrow {\n border-top-color: @tip-background-color;\n }\n &.right .tooltip-arrow {\n border-right-color: @tip-background-color;\n }\n &.left .tooltip-arrow {\n border-left-color: @tip-background-color;\n }\n &.bottom .tooltip-arrow {\n border-bottom-color: @tip-background-color;\n }\n &.bottom-left .tooltip-arrow {\n border-bottom-color: @tip-background-color;\n }\n &.bottom-right .tooltip-arrow {\n border-bottom-color: @tip-background-color;\n }\n}\n","digest":"39716f4a833592eaebb10d339ede6a3a1b22fc7f"},"node_modules/atom-light-ui/styles/tree-view.less":{"content":"@import \"ui-variables\";\n\n.tree-view {\n\tfont-size: @font-size;\n\tbackground: @tree-view-background-color;\n\n\t.selected:before {\n\t\tbackground: #d0d0d0;\n\t}\n}\n\n.tree-view-resizer {\n\t.tree-view-resize-handle {\n\t\twidth: 8px;\n\t}\n}\n\n.focusable-panel {\n\topacity: 1;\n\tbackground-image: -webkit-gradient(linear, left top, left bottom, from(#e8ecf1), to(#ebebeb));\n\tbackground-image: -webkit-linear-gradient(top, #e8ecf1, #ebebeb);\n\n\t&:focus {\n\t\tbackground-image: -webkit-gradient(linear, left top, left bottom, from(#e8ecf1),to(#d1d8e0));\n\t\tbackground-image: -webkit-linear-gradient(top, #e8ecf1, #d1d8e0);\n\n\t\t.selected:before {\n\t\t\tbackground: @background-color-selected;\n\t\t}\n\t}\n}\n","digest":"da6d8af99cf367ca2975e2c4053f59f7132e50ed"},"node_modules/atom-light-ui/styles/ui-mixins.less":{"content":"@import \"ui-variables\";\n\n// Pattern matching; ish is cray.\n// http://lesscss.org/#-pattern-matching-and-guard-expressions\n.text(normal) {\n font-weight: normal;\n color: @text-color;\n text-shadow: 0 1px 0 rgba(255, 255, 255, .5);\n}\n.text(subtle) {\n font-weight: normal;\n color: @text-color-subtle;\n text-shadow: none;\n}\n.text(highlight) {\n font-weight: normal;\n color: @text-color-highlight;\n}\n.text(selected) {\n font-weight: normal;\n color: @text-color-selected;\n text-shadow: none;\n}\n\n.text(info) {\n color: @text-color-info;\n text-shadow: none;\n}\n.text(success) {\n color: @text-color-success;\n text-shadow: none;\n}\n.text(warning) {\n color: @text-color-warning;\n text-shadow: none;\n}\n.text(error) {\n color: @text-color-error;\n text-shadow: none;\n}\n","digest":"a02a9bbae6400fae2138e41ebc5d3b4036a20060"},"node_modules/atom-light-ui/styles/ui-variables.less":{"content":"// Colors\n\n@text-color: #444;\n@text-color-subtle: #999;\n@text-color-highlight: #000;\n@text-color-selected: #fff;\n\n@text-color-info: #5293d8;\n@text-color-success: #45A815;\n@text-color-warning: #CD8E00;\n@text-color-error: #c00;\n\n@text-color-ignored: @text-color-subtle;\n@text-color-added: @text-color-success;\n@text-color-renamed: @text-color-info;\n@text-color-modified: @text-color-warning;\n@text-color-removed: @text-color-error;\n\n@background-color-info: #0098ff;\n@background-color-success: #17ca65;\n@background-color-warning: #ff4800;\n@background-color-error: #c00;\n@background-color-highlight: rgba(0, 0, 0, .1);\n@background-color-selected: #6aa5e9;\n\n@app-background-color: #ccc;\n\n@base-background-color: #f4f4f4;\n@base-border-color: #9f9f9f;\n\n@pane-item-background-color: @base-background-color;\n@pane-item-border-color: @base-border-color;\n\n@input-background-color: white;\n@input-border-color: fadeout(@base-border-color, 10%);\n\n@tool-panel-background-color: @base-background-color;\n@tool-panel-border-color: @base-border-color;\n\n@inset-panel-background-color: #fff;\n@inset-panel-border-color: fadeout(@base-border-color, 10%);\n\n@panel-heading-background-color: #c3c3c3;\n@panel-heading-border-color: transparent;\n\n@overlay-background-color: #ececec;\n@overlay-border-color: @base-border-color;\n\n@button-background-color: @base-background-color;\n@button-background-color-hover: lighten(@button-background-color, 5%);\n@button-background-color-selected: #888;\n@button-border-color: rgba(0, 0, 0, 0.15);\n\n@tab-bar-background-color: #d8d8d8;\n@tab-bar-border-color: #ddd;\n@tab-background-color: #e8e8e8;\n@tab-background-color-active: #f0f0f0;\n@tab-border-color: lighten(@base-border-color, 10%);\n\n@tree-view-background-color: #eee;\n@tree-view-border-color: @base-border-color;\n\n@scrollbar-background-color: #F9F9F9; // Needs to be opaque -> atom/atom/issues/4578\n@scrollbar-color: #C1C1C1;\n\n@ui-site-color-1: @background-color-success; // green\n@ui-site-color-2: @background-color-info; // blue\n@ui-site-color-3: @background-color-warning; // orange\n@ui-site-color-4: #db2ff4; // purple\n@ui-site-color-5: #f5e11d; // yellow\n\n\n// Sizes\n\n@font-size: 11px;\n@input-font-size: 14px;\n@disclosure-arrow-size: 12px;\n\n@component-padding: 10px;\n@component-icon-padding: 5px;\n@component-icon-size: 16px;\n@component-line-height: 25px;\n@component-border-radius: 2px;\n\n@tab-height: 26px;\n\n\n// Other\n\n@font-family: 'BlinkMacSystemFont', 'Lucida Grande', 'Segoe UI', Ubuntu, Cantarell, sans-serif;\n","digest":"1ea6d8a528089d6ed99a3e924ccb7fa2bdb7fce9"},"node_modules/atom-light-ui/styles/utilities.less":{"content":"@import \"ui-mixins\";\n@import \"ui-variables\";\n\n.key-binding {\n background: #fff;\n border: 1px solid lighten(@base-border-color, 20%);\n text-shadow: none;\n display: inline-block;\n line-height: 100%;\n border-radius: @component-border-radius;\n margin-left: @component-icon-padding;\n font-family: Helvetica, Arial, sans-serif;\n font-size: @font-size - 1px;\n padding: @component-padding / 2;\n}\n\n.badge {\n .text(highlight);\n background: @background-color-highlight;\n}\n","digest":"2412f22cf72e84bc5e18fa6d7a2d1667634e7748"},"node_modules/one-dark-ui/index.less":{"content":"@import \"variables/ui-variables\";\n@import \"variables/syntax-variables\";\n\n// Atom UI Theme: One\n\n@import \"styles/ui-variables.less\";\n@import \"styles/ui-mixins.less\";\n@import \"octicon-mixins.less\"; // https://github.com/atom/atom/blob/master/static/variables/octicon-mixins.less\n\n@import \"styles/atom.less\";\n@import \"styles/badges.less\";\n@import \"styles/buttons.less\";\n@import \"styles/docks.less\";\n@import \"styles/editor.less\";\n@import \"styles/git.less\";\n@import \"styles/inputs.less\";\n@import \"styles/lists.less\";\n@import \"styles/messages.less\";\n@import \"styles/nav.less\";\n@import \"styles/notifications.less\";\n@import \"styles/modal.less\";\n@import \"styles/panels.less\";\n@import \"styles/panes.less\";\n@import \"styles/progress.less\";\n@import \"styles/tabs.less\";\n@import \"styles/text.less\";\n@import \"styles/title-bar.less\";\n@import \"styles/tooltips.less\";\n@import \"styles/tree-view.less\";\n@import \"styles/status-bar.less\";\n@import \"styles/key-binding.less\";\n@import \"styles/sites.less\";\n\n@import \"styles/settings.less\";\n@import \"styles/packages.less\";\n@import \"styles/core.less\";\n@import \"styles/config.less\";\n","digest":"9ae52af555fe1bcd2721d52c1539ca092a07aafa"},"node_modules/one-dark-ui/styles/atom.less":{"content":"* {\n\tbox-sizing: border-box;\n}\n\nhtml {\n\tfont-size: @font-size;\n}\n\natom-workspace {\n\tbackground-color: @app-background-color;\n}\n\n\n// Scrollbars ------------------------------------\n\n.scrollbars-visible-always {\n\t::-webkit-scrollbar {\n\t\twidth: 10px;\n\t\theight: 10px;\n\t}\n\n\t::-webkit-scrollbar-track {\n\t\tbackground: @scrollbar-background-color;\n\t}\n\n\t::-webkit-scrollbar-thumb {\n\t\tborder-radius: 5px;\n\t\tborder: 3px solid @scrollbar-background-color;\n\t\tbackground: @scrollbar-color;\n\t\tbackground-clip: content-box;\n\t}\n\n\t::-webkit-scrollbar-corner {\n\t\tbackground: @scrollbar-background-color;\n\t}\n\n\t::-webkit-scrollbar-thumb:vertical:active {\n\t\tborder-radius: 0;\n\t\tborder-left-width: 0;\n\t\tborder-right-width: 0;\n\t}\n\n\t::-webkit-scrollbar-thumb:horizontal:active {\n\t\tborder-radius: 0;\n\t\tborder-top-width: 0;\n\t\tborder-bottom-width: 0;\n\t}\n\n\tatom-text-editor {\n\t\t::-webkit-scrollbar-track {\n\t\t\tbackground: @scrollbar-background-color-editor;\n\t\t}\n\t\t::-webkit-scrollbar-corner {\n\t\t\tbackground: @scrollbar-background-color-editor;\n\t\t}\n\t\t::-webkit-scrollbar-thumb {\n\t\t\tborder-color: @scrollbar-background-color-editor;\n\t\t\tbackground: @scrollbar-color-editor;\n\t\t}\n\t}\n}\n\n// TODO: Move to a better place, not sure where it gets used\n.caret {\n border-top: 5px solid #fff;\n margin-top: -1px;\n}\n","digest":"df4447499593550b61146e7af8d0f4cd17991112"},"node_modules/one-dark-ui/styles/badges.less":{"content":".badge {\n padding: @ui-padding/4 @ui-padding/2.5;\n min-width: @ui-padding*1.25;\n .text(highlight);\n border-radius: @ui-size*2;\n background-color: @badge-background-color;\n\n // Icon ----------------------\n &.icon {\n font-size: @ui-size;\n padding: @ui-padding-icon @ui-padding-icon*1.5;\n }\n\n}\n","digest":"bfb1f9e90af654b5baa53d74c36628140507a3f7"},"node_modules/one-dark-ui/styles/buttons.less":{"content":"\n@btn-border: 1px solid @button-border-color;\n@btn-padding: 0 @ui-size/1.25;\n\n// Mixins -----------------------\n\n.btn-default (@color, @hover-color, @selected-color, @text-color) {\n color: @text-color;\n text-shadow: none;\n border: @btn-border;\n background-color: @color;\n background-image: linear-gradient(lighten(@color, 2%), @color);\n\n &:hover {\n color: @text-color-highlight;\n background-image: linear-gradient(lighten(@hover-color, 2%), @hover-color);\n }\n &:active {\n background: darken(@color, 4%);\n box-shadow: none;\n }\n &.selected {\n background: @selected-color;\n }\n &.selected:focus,\n &.selected:hover {\n background: lighten(@selected-color, 2%);\n }\n &:focus {\n .focus(); // unfortunately :focus styles stay even after releasing mouse.\n }\n}\n\n.btn-variant (@color) {\n @_text-color: contrast(@color, white, hsl(0,0%,20%), 33% );\n .btn-default(\n @color,\n lighten(@color, 3%),\n saturate(darken(@color, 12%), 20%),\n @text-color-highlight\n );\n color: @_text-color;\n\n & when (@ui-lightness > 50%) {\n border-color: transparent; // hide border on light backgrounds\n }\n\n &:hover,\n &:focus {\n color: @_text-color;\n }\n &:focus {\n border-color: transparent;\n background-clip: padding-box;\n box-shadow: inset 0 0 0 1px fade(@base-border-color, 50%), 0 0 0 1px @color;\n }\n\n &.icon:before {\n color: @_text-color;\n }\n}\n\n\n// Buttons -----------------------\n\n.btn {\n height: initial;\n padding: @btn-padding;\n font-size: @ui-size;\n line-height: @ui-line-height;\n}\n\n.btn,\n.btn.btn-default {\n .btn-default(@button-background-color, @button-background-color-hover, @button-background-color-selected, @text-color);\n}\n\n.btn.btn-primary {\n .btn-variant(@accent-bg-color);\n}\n.btn.btn-info {\n .btn-variant(@background-color-info);\n}\n.btn.btn-success {\n .btn-variant(@background-color-success);\n}\n.btn.btn-warning {\n .btn-variant(@background-color-warning);\n}\n.btn.btn-error {\n .btn-variant(@background-color-error);\n}\n\n\n// Button Sizes -----------------------\n\n.btn.btn-xs,\n.btn-group-xs > .btn {\n font-size: @ui-size*.8;\n line-height: @ui-line-height;\n padding: @btn-padding;\n}\n.btn.btn-sm,\n.btn-group-sm > .btn {\n font-size: @ui-size*.9;\n line-height: @ui-line-height;\n padding: @btn-padding;\n}\n.btn.btn-lg,\n.btn-group-lg > .btn {\n font-size: @ui-size * 1.5;\n line-height: @ui-line-height;\n padding: @btn-padding;\n}\n\n\n// Button Group -----------------------\n\n.btn-group > .btn {\n z-index: 0;\n &:hover {\n z-index: 0;\n }\n &.btn:focus {\n z-index: 1;\n .focus();\n }\n\n &:first-child {\n border-left: @btn-border;\n }\n &:last-child,\n &.selected:last-child {\n border-right: @btn-border;\n }\n\n // hide border on light backgrounds\n & when (@ui-lightness > 50%) {\n &.btn-primary:first-child,\n &.btn-info:first-child,\n &.btn-success:first-child,\n &.btn-warning:first-child,\n &.btn-error:first-child {\n border-left-color: transparent;\n }\n\n &.btn-primary:last-child,\n &.btn-info:last-child,\n &.btn-success:last-child,\n &.btn-warning:last-child,\n &.btn-error:last-child {\n border-right-color: transparent;\n }\n }\n\n &.selected,\n &.selected:first-child,\n &.selected:last-child {\n color: @button-text-color-selected;\n border-color: @button-border-color-selected;\n }\n\n & when (@ui-lightness > 50%) {\n &.selected + .btn {\n border-left-color: @button-border-color-selected;\n }\n &.selected + .selected {\n border-left-color: mix(@button-border-color, @button-border-color-selected);\n }\n }\n\n &.selected:focus {\n border-color: @button-background-color-selected;\n box-shadow: inset 0 0 0 1px fade(@base-border-color, 50%), 0 0 0 1px @button-background-color-selected;\n }\n}\n\n\n// Button Icons -----------------------\n\n.btn.icon:before {\n width: auto;\n height: auto;\n font-size: 1.333333em;\n vertical-align: -.1em;\n}\n","digest":"771f75f5f119b4282fb0980b2c492e5cf15ad5d3"},"node_modules/one-dark-ui/styles/config.less":{"content":"\n// Tabs ----------------------------------------------\n\n@theme-tabsizing: ~'theme-@{ui-theme-name}-tabsizing';\n@theme-dockButtons: ~'theme-@{ui-theme-name}-dock-buttons';\n\n@tab-min-width: 7em; // ~ icon + 6 characters\n\n\n// Even (default) ---------------\n\n.tab-bar {\n .tab,\n .tab.active {\n flex: 1 1 0;\n max-width: 22em;\n min-width: @tab-min-width;\n }\n atom-dock & {\n .tab,\n .tab.active {\n max-width: none;\n }\n }\n\n // TODO: Turn this into a config\n // Truncates the beginning instead\n // .title.title.title {\n // direction: rtl; // change direction\n // }\n}\n\n\n// Maximum (full width) ---------------\n\n[@{theme-tabsizing}=\"maximum\"] .tab-bar {\n .tab,\n .tab.active {\n max-width: none;\n }\n}\n\n\n// Minimum (show long paths) ---------------\n\n[@{theme-tabsizing}=\"minimum\"] .tab-bar {\n .tab,\n .tab.active {\n flex: 0 0 auto;\n min-width: 2.75em;\n max-width: @tab-min-width * 3.3;\n }\n atom-dock {\n .tab,\n .tab.active {\n max-width: @tab-min-width * 2;\n }\n }\n}\n\n\n\n// Hide docks toggle buttons ------------------------------\n\n[@{theme-dockButtons}=\"hidden\"] {\n\n // Hide docks when not open\n .atom-dock-inner:not(.atom-dock-open) {\n display: none;\n }\n\n // Hide toggle buttons\n .atom-dock-toggle-button {\n display: none;\n }\n\n}\n","digest":"7b535b404a0238604350777668da209e6cb2f2b7"},"node_modules/one-dark-ui/styles/core.less":{"content":"// Misc\n\n.preview-pane .results-view .path-match-number {\n // show number also on selected item\n color: inherit;\n opacity: .6;\n}\n\n.tool-panel.incompatible-packages {\n // incompatible-packages isn't really a tool-panel and more a whole pane\n .text(normal);\n background-color: @level-2-color;\n}\n\n// Styleguide ----------------------------------------------\n\n.styleguide {\n // Modal\n atom-panel.modal:after {\n position: absolute; // prevent overlay backdrop from leaking outside\n left: -@ui-padding;\n right: -@ui-padding;\n bottom: -@ui-padding;\n }\n}\n","digest":"4ba9309f9e37001066e7f31b17f9ff985741a298"},"node_modules/one-dark-ui/styles/docks.less":{"content":"\n// Docks ------------------------------\n\n// Make handles not take up any space when dock is open\n.atom-dock-resize-handle {\n position: absolute;\n z-index: 11; // same as toggle buttons\n\n &.left {\n top: 0;\n right: 0;\n bottom: 0;\n }\n &.right {\n top: 0;\n left: 0;\n bottom: 0;\n }\n &.bottom {\n top: 0;\n left: 0;\n right: 0;\n }\n}\n\n// Add borders\n.atom-dock-inner.atom-dock-open.left {\n border-right: 1px solid @base-border-color;\n}\n.atom-dock-inner.atom-dock-open.right {\n border-left: 1px solid @base-border-color;\n}\n\n// Make toggle buttons cover ^ border\n.atom-dock-toggle-button.left {\n margin-left: -1px;\n}\n.atom-dock-toggle-button.right {\n margin-right: -1px;\n}\n.atom-dock-inner:not(.atom-dock-open) .atom-dock-toggle-button.bottom {\n margin-bottom: -1px;\n}\n","digest":"2d1e626354879323d3f61341a8e6f903ceec1f7a"},"node_modules/one-dark-ui/styles/dropdowns.less":{"content":".dropdown-menu {\n background-color: @overlay-background-color;\n border-radius: @component-border-radius;\n border: 1px solid @base-border-color;\n padding: 0;\n\n > li > a {\n .text(normal);\n }\n\n > li > a:hover {\n .text(highlight);\n background-color: @background-color-highlight;\n }\n}\n","digest":"344a6a3a32a0e115652f60c7626fc93e1d2220c1"},"node_modules/one-dark-ui/styles/editor.less":{"content":"\n// Editor in a panel\n\n// TODO: Find a better selector, maybe a new class like atom-text-editor[medium]\natom-panel-container atom-text-editor.is-focused {\n .focus();\n}\n\n\n// Mini\n// Usually just single line inputs\n\natom-text-editor[mini] {\n overflow: auto;\n font-size: @ui-input-size;\n line-height: @ui-line-height;\n max-height: @ui-line-height * 5; // rows\n padding-left: @ui-padding/3;\n border-radius: @component-border-radius;\n color: @text-color-highlight;\n border: 1px solid @input-border-color;\n background-color: @input-background-color;\n\n .placeholder-text {\n color: @text-color-subtle;\n }\n\n .selection .region {\n background-color: @input-selection-color;\n }\n\n .cursor {\n border-color: @accent-color;\n border-width: 2px;\n }\n\n &.is-focused {\n .focus();\n background-color: @input-background-color-focus;\n .selection .region {\n background-color: @input-selection-color-focus;\n }\n }\n}\n","digest":"c372db5e2182585e75a5dbc970c85d04f9ac94c9"},"node_modules/one-dark-ui/styles/git.less":{"content":".status { .text(normal); }\n.status-added { .text(success); } // green\n.status-ignored { .text(subtle); } // faded\n.status-modified { .text(warning); } // orange\n.status-removed { .text(error); } // red\n.status-renamed { .text(info); } // blue\n","digest":"4cc19322834e5e93b47fe889895e14e6a7576f8d"},"node_modules/one-dark-ui/styles/inputs.less":{"content":"\n//\n// Checkbox\n// -------------------------\n\n.input-checkbox {\n &:active {\n background-color: @accent-color;\n }\n &:before,\n &:after {\n background-color: @accent-text-color;\n }\n &:checked {\n background-color: @accent-color;\n }\n\n &:indeterminate {\n background-color: @accent-color;\n }\n}\n\n\n//\n// Radio\n// -------------------------\n\n.input-radio {\n &:before {\n background-color: @accent-text-color;\n }\n &:active {\n background-color: @accent-color;\n }\n &:checked {\n background-color: @accent-color;\n }\n}\n\n\n//\n// Range (Slider)\n// -------------------------\n\n.input-range {\n &::-webkit-slider-thumb {\n background-color: @accent-color;\n }\n}\n\n\n//\n// Toggle\n// -------------------------\n\n.input-toggle {\n &:checked {\n background-color: @accent-color;\n }\n &:before {\n background-color: @accent-text-color;\n }\n}\n\n\n\n// States -------------------------\n\n.input-text,\n.input-search,\n.input-number,\n.input-textarea,\n.input-select,\n.input-color {\n &:focus {\n .focus();\n }\n}\n","digest":"fcb0b948128bc844c8d5d19a0bbbf7debe9ecfb2"},"node_modules/one-dark-ui/styles/key-binding.less":{"content":".key-binding {\n display: inline-block;\n margin-left: @ui-padding-icon;\n padding: 0 @ui-padding/4;\n line-height: 2;\n font-family: inherit;\n font-size: max(1em, @ui-size*.85);\n letter-spacing: @ui-size/10;\n border-radius: @component-border-radius;\n color: @accent-bg-text-color;\n background-color: @accent-bg-color;\n}\n","digest":"2c7039e912c9a51bc17fdb5619d12da5192a1f6f"},"node_modules/one-dark-ui/styles/lists.less":{"content":".list-group,\n.list-tree {\n li:not(.list-nested-item),\n li.list-nested-item > .list-item {\n .text(normal);\n }\n\n .generate-list-item-text-color(@class) {\n li:not(.list-nested-item).text-@{class},\n li.list-nested-item.text-@{class} > .list-item {\n .text(@class);\n }\n }\n .generate-list-item-text-color(subtle);\n .generate-list-item-text-color(info);\n .generate-list-item-text-color(success);\n .generate-list-item-text-color(warning);\n .generate-list-item-text-color(error);\n .generate-list-item-text-color(selected);\n\n .generate-list-item-status-color(@color, @status) {\n li:not(.list-nested-item).status-@{status},\n li.list-nested-item.status-@{status} > .list-item {\n color: @color;\n }\n\n li:not(.list-nested-item).selected.status-@{status},\n li.list-nested-item.selected.status-@{status} > .list-item {\n color: @color;\n }\n\n }\n\n .generate-list-item-status-color(@text-color-added, added);\n .generate-list-item-status-color(@text-color-ignored, ignored);\n .generate-list-item-status-color(@text-color-modified, modified);\n .generate-list-item-status-color(@text-color-removed, removed);\n .generate-list-item-status-color(@text-color-renamed, renamed);\n\n li:not(.list-nested-item).selected,\n li.list-nested-item.selected > .list-item {\n .text(selected);\n }\n\n .no-icon {\n padding-left: calc(@ui-padding-icon ~\"+\" @component-icon-size);\n }\n}\n\n.list-tree.has-collapsable-children .list-nested-item > .list-item::before {\n text-align: center;\n}\n\n.select-list ol.list-group,\n&.select-list ol.list-group {\n li.two-lines {\n .secondary-line {\n color: @text-color-subtle;\n }\n &.selected .secondary-line {\n color: fade(@text-color-highlight, 50%);\n text-shadow: none;\n }\n }\n\n // We want to highlight the background of the list items because we dont\n // know their size.\n li.selected {\n background-color: @background-color-selected;\n &:before{ display: none; }\n }\n\n &.mark-active {\n @active-icon-size: 14px;\n\n // pad in front of the text where the icon would be We'll pad the non-\n // active items with a 'fake' icon so other classes can pad the item\n // without worrying about the icon padding.\n li:before {\n content: '';\n background-color: transparent;\n position: static;\n display: inline-block;\n left: auto; right: auto;\n height: @active-icon-size;\n width: @active-icon-size;\n font-size: @active-icon-size;\n }\n > li:not(.active):before {\n margin-right: @ui-padding-icon;\n }\n li.active {\n .octicon(check, @active-icon-size);\n &:before {\n margin-right: @ui-padding-icon;\n color: @text-color-success;\n }\n }\n }\n}\n\n.select-list.popover-list {\n @popover-list-padding: @ui-padding/4;\n background-color: @overlay-background-color;\n box-shadow: 0 2px 8px 1px rgba(0, 0, 0, 0.3);\n padding: @popover-list-padding;\n border-radius: @component-border-radius;\n\n atom-text-editor[mini] {\n margin-bottom: @popover-list-padding;\n }\n\n ol.list-group {\n margin-top: @popover-list-padding;\n }\n\n .list-group li {\n padding-left: @popover-list-padding;\n }\n}\n\n.ui-sortable {\n li {\n line-height: 2.5;\n }\n\n // For sortable lists in the settings view\n li.ui-sortable-placeholder {\n visibility: visible !important;\n background-color: darken(@pane-item-background-color, 10%);\n }\n}\n\nli.ui-draggable-dragging,\nli.ui-sortable-helper {\n line-height: @ui-line-height;\n height: @ui-line-height;\n border: 0;\n border-radius: 0;\n list-style: none;\n padding: 0 @ui-padding;\n background: @background-color-highlight;\n box-shadow: 0 0 1px @base-border-color;\n}\n","digest":"62e28d3f59d575bb09af38145920fb7dca076620"},"node_modules/one-dark-ui/styles/messages.less":{"content":"background-tips ul.background-message {\n font-weight: 500;\n font-size: 2em;\n color: @text-color-faded;\n\n .message {\n padding: 0 @component-padding * 10;\n\n .keystroke {\n white-space: nowrap;\n vertical-align: middle;\n line-height: 1;\n padding: .1em .4em;\n }\n }\n}\n","digest":"fbe98214c0578199506deb9b230c56019060194b"},"node_modules/one-dark-ui/styles/modal.less":{"content":"\n@modal-padding: @ui-padding/2 @ui-padding/1.5;\n@modal-width: @ui-size * 50;\n\natom-panel-container.modal {\n position: absolute;\n top: 0; left: 0; right: 0;\n}\n\natom-panel.modal {\n position: relative;\n width: 100%;\n max-width: @modal-width;\n margin: 0 auto;\n left: initial;\n color: @text-color;\n background-color: transparent;\n padding: @ui-padding/2;\n\n &.from-top {\n top: @component-padding * 5;\n }\n\n atom-text-editor[mini] {\n margin-bottom: @ui-padding/2;\n }\n\n .select-list ol.list-group,\n &.select-list ol.list-group {\n border: 1px solid @overlay-border-color;\n background-color: lighten(@overlay-background-color, 2%);\n\n &:empty {\n border: none;\n margin-top: 0;\n }\n\n li {\n padding: @modal-padding;\n line-height: @ui-line-height;\n border-bottom: 1px solid @overlay-border-color;\n\n &:last-of-type {\n border-bottom: none;\n }\n\n .icon::before {\n margin-left: 1px;\n }\n\n .icon.status {\n float: right;\n margin-left: @ui-padding-icon;\n &:before {\n margin-left: 0;\n margin-right: 0;\n }\n }\n\n &.selected {\n .status.icon {\n color: @text-color-selected;\n }\n }\n }\n\n }\n\n .select-list .key-binding {\n margin-top: -1px;\n margin-left: @ui-padding/2;\n margin-right: calc( -@ui-padding/3 ~\"+\" 1px);\n }\n\n .select-list .primary-line {\n display: block;\n }\n\n & > * {\n position: relative; // fixes stacking order\n }\n\n\n // Container\n &:before {\n content: \"\";\n position: absolute;\n top: 0;\n left: 0;\n right: 0;\n bottom: 0;\n z-index: 0;\n background-color: @overlay-background-color;\n border-radius: @component-border-radius*2;\n box-shadow: 0 6px 12px -2px hsla(0,0%,0%,.4);\n }\n\n // Backdrop\n // TODO: Add extra wrapper to translate individually or easier positioning\n\n &:after {\n content: \"\";\n position: fixed;\n top: 0;\n left: 0;\n right: 0;\n bottom: 0;\n z-index: -1;\n background: @overlay-backdrop-color;\n opacity: @overlay-backdrop-opacity;\n backface-visibility: hidden; // fixes scrollbar on retina screens\n -webkit-animation: overlay-fade .24s cubic-bezier(0.215, 0.61, 0.355, 1);\n }\n\n @-webkit-keyframes overlay-fade {\n 0% { opacity: 0; }\n 100% { opacity: @overlay-backdrop-opacity; }\n }\n\n}\n","digest":"890e4f55f8035017d9f295a6a96247b398760fdf"},"node_modules/one-dark-ui/styles/nav.less":{"content":".nav-tabs {\n border-bottom: 1px solid @base-border-color;\n li {\n a,\n &.active a {\n border: none;\n margin-right: 0px;\n margin-bottom: 1px;\n }\n\n a:hover,\n &.active a,\n &.active a:hover {\n background-color: @background-color-highlight;\n border: none;\n color: @text-color-selected;\n border-bottom-left-radius: 0px;\n border-bottom-right-radius: 0px;\n }\n\n &.active a {\n background-color: @tab-background-color-active;\n }\n }\n}\n","digest":"54ed0e49741845e8799c9513ae21ca7ae75f751d"},"node_modules/one-dark-ui/styles/notifications.less":{"content":"\natom-notifications {\n font-size: @ui-size * 1.2;\n\n atom-notification {\n width: 32em;\n &.has-detail {\n width: 32em;\n }\n\n &:first-child.has-close .message {\n padding-right: 9em;\n }\n &:only-child.has-close .message,\n &.has-close .message {\n padding-right: 2.5em;\n }\n .item {\n padding: @ui-padding/2;\n }\n\n .detail,\n .description {\n font-size: .85em;\n }\n\n &.icon:before {\n padding-top: .85em;\n }\n .close {\n width: 2.5em;\n height: 3em;\n line-height: 3em;\n font-size: inherit;\n }\n .close-all.btn {\n top: .5em;\n right: 2.5em;\n }\n .btn-copy-report {\n line-height: 2em;\n margin-left: .5em;\n }\n }\n}\n","digest":"2e08e0dc91ed0d4dcf79a1dcec241fd3ceac0cf4"},"node_modules/one-dark-ui/styles/packages.less":{"content":"// Overrides packages\n\n// find-and-replace + project-find ---------------------------\n\n.find-and-replace,\n.project-find {\n padding: @ui-padding/4;\n .input-block-item {\n padding: @ui-padding/4;\n }\n}\n\n// find-and-replace\n.find-and-replace {\n .header,\n .input-block {\n min-width: @ui-size*22;\n }\n\n .input-block-item {\n flex: 1 1 @ui-size*22;\n }\n .input-block-item--flex {\n flex: 100 1 @ui-size*22;\n }\n\n .btn,\n .btn-group-options .btn {\n font-size: @ui-size*1.1;\n padding: 0;\n }\n\n .btn-group-options .btn,\n .btn-group-options .btn.option-selection,\n .btn-group-options .btn.option-whole-word {\n padding: 0;\n font-size: @ui-input-size; // keep same as text input\n }\n\n .find-container atom-text-editor {\n padding-right: @ui-size*5; // leave some room for the results count\n }\n .find-meta-container {\n top: 0;\n font-size: @ui-size;\n line-height: @ui-size*2.5;\n }\n}\n\n// project-find\n.project-find {\n .header,\n .input-block {\n min-width: @ui-size*15;\n }\n\n .input-block-item {\n flex: 1 1 @ui-size*14;\n }\n .input-block-item--flex {\n flex: 100 1 @ui-size*20;\n }\n\n .btn {\n font-size: @ui-size*1.1;\n padding: 0;\n }\n .btn-group-options .btn {\n padding: 0;\n font-size: @ui-input-size; // keep same as text input\n }\n}\n\n// Colorize find-and-replace based on results\n& when (@ui-hue >= 190) and (@ui-hue <= 340) {\n .find-and-replace {\n &.has-no-results .find-container atom-text-editor[mini].is-focused {\n border-color: @text-color-error;\n box-shadow: 0 0 0 1px @text-color-error;\n background-color: mix(@text-color-error, @input-background-color, 10%);\n .selection .region {\n background-color: mix(@text-color-error, @input-background-color, 50%);\n }\n .cursor {\n border-color: @text-color-error;\n }\n }\n\n &.has-results .find-container atom-text-editor[mini].is-focused {\n border-color: @text-color-success;\n box-shadow: 0 0 0 1px @text-color-success;\n background-color: mix(@text-color-success, @input-background-color, 10%);\n .selection .region {\n background-color: mix(@text-color-success, @input-background-color, 50%);\n }\n .cursor {\n border-color: @text-color-success;\n }\n }\n\n &.has-results .find-container .result-counter { color: @text-color-success; }\n &.has-no-results .find-container .result-counter { color: @text-color-error; }\n }\n}\n\n\n\n\n// Timecop ---------------------------\n\n.timecop {\n .timecop-panel {\n padding: @component-padding/2;\n background-color: @level-2-color;\n }\n\n .tool-panel {\n padding: @component-padding/2;\n background-color: @level-2-color;\n }\n\n .inset-panel {\n border: 1px solid @base-border-color;\n }\n\n .panel-heading {\n .text(highlight);\n border-color: @base-border-color;\n background-color: @level-1-color;\n }\n\n .list-item .inline-block {\n line-height: 1.5;\n }\n}\n\n\n// Command Palette + Fuzzy Finder ---------------------------\n\n.command-palette .list-group .character-match,\n.fuzzy-finder .list-group .character-match {\n color: @accent-only-text-color;\n}\n\n\n// Deprecation Cop ---------------------------\n\n.deprecation-cop {\n .deprecation-overview {\n background-color: @level-2-color;\n border-bottom: 1px solid @base-border-color;\n }\n}\n\n\n// Tool Bar ---------------------------\n\n.tool-bar {\n // Make it look the same as other panels\n background-color: @level-3-color;\n border: none;\n\n // just a single border + more spacing\n &.tool-bar-horizontal .tool-bar-spacer {\n border-left: 0 none;\n margin-left: .5em;\n margin-right: .5em;\n }\n &.tool-bar-vertical .tool-bar-spacer {\n border-bottom: 0 none;\n margin-top: .5em;\n margin-bottom: .5em;\n }\n\n // only show button styles on hover\n button.tool-bar-btn {\n background-color: @level-3-color;\n background-image: none;\n border-color: @level-3-color;\n }\n}\n","digest":"ca6dd32da78f7a265151bdc16ad95616ee42c1b0"},"node_modules/one-dark-ui/styles/panels.less":{"content":"\n// Panels\n\natom-panel {\n .text(normal);\n position: relative;\n border-bottom: 1px solid @base-border-color;\n\n &.top {\n border-right: 1px solid @base-border-color;\n }\n &.left {\n border-right: 1px solid @base-border-color;\n }\n &.right {\n border-left: 1px solid @base-border-color;\n }\n &.bottom {\n border-right: 1px solid @base-border-color;\n }\n &.footer:last-child {\n border-bottom: none;\n }\n &.tool-panel:empty {\n border: none;\n }\n}\n\n.panel {\n &.bordered {\n border: 1px solid @base-border-color;\n border-radius: @component-border-radius;\n }\n}\n\n.inset-panel {\n position: relative;\n background-color: @inset-panel-background-color;\n border-radius: @component-border-radius;\n &.bordered {\n border: 1px solid @base-border-color;\n border-radius: @component-border-radius;\n }\n & .panel-heading {\n border-color: @inset-panel-border-color;\n }\n}\n\n.panel-heading {\n .text(normal);\n border-bottom: 1px solid @panel-heading-border-color;\n background-color: @panel-heading-background-color;\n\n .btn {\n padding-left: 8px;\n padding-right: 8px;\n .btn-default(\n lighten(@button-background-color, 10%),\n lighten(@button-background-color-hover, 10%),\n lighten(@button-background-color-selected, 10%),\n lighten(@text-color, 10%)\n );\n }\n}\n","digest":"78e95fe77592b096e829427a1a4c35c24f9baea6"},"node_modules/one-dark-ui/styles/panes.less":{"content":"\natom-pane-container {\n\n atom-pane {\n position: relative;\n border-right: 1px solid @base-border-color;\n border-bottom: 1px solid @base-border-color;\n\n .item-views {\n // prevent atom-text-editor from leaking ouside might improve performance\n overflow: hidden;\n }\n }\n\n}\n\n// Hide right-most border\natom-pane:only-child,\natom-pane-axis.pane-row > atom-pane:last-child,\natom-pane-axis.pane-column:last-child > atom-pane {\n border-right: none;\n}\n","digest":"517a4bfd51fba7919d84a7e89eef84db64f68d55"},"node_modules/one-dark-ui/styles/progress.less":{"content":"\n// Spinner ----------------------\n\n@spinner-duration: 1.2s;\n\n.loading-spinner(@size) {\n position: relative;\n display: block;\n width: 1em;\n height: 1em;\n font-size: @size;\n background: radial-gradient(@accent-color .1em, transparent .11em);\n\n &::before,\n &::after {\n content: \"\";\n position: absolute;\n z-index: 10; // prevent sibling elements from getting their own layers\n top: 0;\n left: 0;\n border-radius: 1em;\n width: inherit;\n height: inherit;\n border-radius: 1em;\n border: 2px solid;\n -webkit-animation: spinner-animation @spinner-duration infinite;\n -webkit-animation-fill-mode: backwards;\n }\n &::before {\n border-color: @accent-color transparent transparent transparent;\n }\n &::after {\n border-color: transparent lighten(@accent-color, 15%) transparent transparent;\n -webkit-animation-delay: @spinner-duration/2;\n }\n\n &.inline-block {\n display: inline-block;\n }\n}\n\n@-webkit-keyframes spinner-animation {\n 0% { transform: rotateZ( 0deg); -webkit-animation-timing-function: cubic-bezier(0, 0, .8, .2); }\n 50% { transform: rotateZ(180deg); -webkit-animation-timing-function: cubic-bezier(.2, .8, 1, 1); }\n 100% { transform: rotateZ(360deg); }\n}\n\n// Spinner sizes\n.loading-spinner-tiny { .loading-spinner(16px); &::before, &::after { border-width: 1px; } }\n.loading-spinner-small { .loading-spinner(32px); }\n.loading-spinner-medium { .loading-spinner(48px); }\n.loading-spinner-large { .loading-spinner(64px); }\n\n\n\n\n// Progress Bar ----------------------\n\n@progress-height: 8px;\n@progress-buffer-color: fade(@progress-background-color, 20%);\n\nprogress {\n -webkit-appearance: none;\n height: @progress-height;\n border-radius: @component-border-radius;\n background-color: @input-background-color;\n box-shadow: inset 0 0 0 1px @input-border-color;\n\n &::-webkit-progress-bar {\n background-color: transparent;\n }\n\n &::-webkit-progress-value {\n border-radius: @component-border-radius;\n background-color: @progress-background-color;\n }\n\n // Is buffering (when no value is set)\n &:indeterminate {\n background-image:\n linear-gradient(-45deg, transparent 33%, @progress-buffer-color 33%,\n @progress-buffer-color 66%, transparent 66%);\n background-size: 25px @progress-height, 100% 100%, 100% 100%;\n\n // Plays animation for 1min (12runs) at normal speed,\n // then slows down frame-rate for 9mins (108runs) to limit CPU usage\n -webkit-animation: progress-buffering 5s linear 12,\n progress-buffering 5s 60s steps(10) 108;\n }\n}\n\n@-webkit-keyframes progress-buffering {\n 100% { background-position: -100px 0px; }\n}\n","digest":"c51843dd15ee040fd7a60aaccf3e2d1071459cb0"},"node_modules/one-dark-ui/styles/settings.less":{"content":"\n// Settings\n\n// Modular Scale (1.125): http://www.modularscale.com/?1&em&1.125&web&table\n@ms-6: @ui-size * 2.027;\n@ms-5: @ui-size * 1.802;\n@ms-4: @ui-size * 1.602;\n@ms-3: @ui-size * 1.424;\n@ms-2: @ui-size * 1.266;\n@ms-1: @ui-size * 1.125;\n@ms-0: @ui-size * 1;\n@ms_1: @ui-size * 0.889;\n@ms_2: @ui-size * 0.790;\n\n\n\n.settings-view {\n\n\t// Menu ------------------------------\n\n\t.config-menu {\n\t\tposition: relative;\n\t\tmin-width: @ui-size * 15;\n\t\tmax-width: @ui-size * 20;\n\t\tborder-width: 0 1px 0 0;\n\t\tborder-image: linear-gradient(@level-2-color 10px, @base-border-color 200px) 0 1 0 0 stretch;\n\t\tbackground: @level-2-color;\n\n\t\t.btn {\n\t\t\twhite-space: initial;\n\t\t\tfont-size: @ms_1;\n\t\t\tline-height: 1;\n\t\t\tpadding: @ui-padding/3 @ui-padding/2;\n\t\t\t&::before {\n\t\t\t\tvertical-align: middle;\n\t\t\t}\n\t\t}\n\n\n\t}\n\t.nav {\n\t\t& > li > a {\n\t\t\tpadding: @ui-padding/2 @ui-padding;\n\t\t\tline-height: @ui-line-height;\n\t\t}\n\t}\n\n\n\t// Sections ------------------------------\n\n\t& > .panels {\n\t\tbackground-color: @level-2-color;\n\t}\n\n\t.section-container {\n\t\tmax-width: @ui-size*60;\n\t}\n\t.sub-section {\n\t\tmargin: @ui-padding*3 0;\n\t}\n\n\t.section,\n\t.section:first-child,\n\t.section:last-child {\n\t\tpadding: @ui-padding*3;\n\t}\n\n\t.themes-panel .control-group {\n\t\tmargin-top: @ui-padding*2;\n\t}\n\n\n\t// Titles ------------------------------\n\n\t.section .section-heading {\n\t\tmargin-bottom: @ui-padding/1.5;\n\t}\n\n\t.sub-section-heading.icon:before,\n\t.section-heading.icon:before {\n\t\tmargin-right: @ui-padding-icon;\n\t}\n\n\n\n\t// Cards ------------------------------\n\n\t.package-card {\n\t\tpadding: @ui-padding;\n\t\t.meta-controls .status-indicator {\n\t\t\twidth: @ui-padding/4;\n\t\t\t&:before {\n\t\t\t\tcontent: \"\\00a0\"; // fixes 0 height\n\t\t\t}\n\t\t}\n\t}\n\n\n\t// Components ------------------------------\n\n\t.icon::before {\n\t\tcolor: @text-color-subtle;\n\t}\n\n\t.editor-container {\n\t\tmargin: @ui-padding 0;\n\t}\n\n\t.form-control {\n\t\tfont-size: @ui-size*1.25;\n\t\theight: @ui-line-height;\n\t\tpadding-top: 0;\n\t\tpadding-bottom: 0;\n\t}\n\n\t.update-all-button {\n\t\tfont-size: .75em;\n\t}\n\n\t.install-button {\n\t\t.btn-variant(@accent-bg-color);\n\t}\n\n\tinput[type=\"checkbox\"] {\n\t\tbackground-color: @background-color-selected;\n\t\t&:active,\n\t\t&:checked {\n\t\t\tbackground-color: @accent-color;\n\t\t}\n\t\t&:before,\n\t\t&:after {\n\t\t\tbackground-color: @accent-text-color;\n\t\t}\n\t}\n\n\t.search-container .btn {\n\t\tfont-size: @ui-input-size;\n\t}\n\n}\n","digest":"83169623788115c290201ced548017a86c5f3e24"},"node_modules/one-dark-ui/styles/sites.less":{"content":"// Site Colors\n\n.ui-site(@num, @color) {\n .ui-site-@{num} {\n background-color: @color;\n }\n}\n\n.ui-site(1, @ui-site-color-1);\n.ui-site(2, @ui-site-color-2);\n.ui-site(3, @ui-site-color-3);\n.ui-site(4, @ui-site-color-4);\n.ui-site(5, @ui-site-color-5);\n","digest":"b27327b73cb57001e574b9d1db332766ac6d1e4e"},"node_modules/one-dark-ui/styles/status-bar.less":{"content":"\n@status-bar-height: @ui-tab-height; // same as tabs\n@status-bar-padding: @ui-padding;\n\n.status-bar {\n font-size: @ui-size;\n height: @status-bar-height;\n line-height: @status-bar-height;\n background-color: @level-3-color;\n\n .flexbox-repaint-hack {\n padding: 0; // override default\n }\n\n // underlines should only be used for external links\n a:hover,\n a:focus {\n text-decoration: none;\n cursor: default;\n }\n\n .inline-block {\n margin: 0; // override default\n padding: 0 @status-bar-padding/2;\n vertical-align: top;\n\n &:hover {\n background-color: @level-3-color-hover;\n }\n &:active {\n background-color: @level-3-color-active;\n }\n\n // reset on child inline-block\n .inline-block {\n margin: 0;\n padding: 0;\n }\n }\n\n .status-bar-right {\n .inline-block {\n margin-left: 0; // override default\n }\n }\n .icon {\n vertical-align: middle;\n }\n .icon::before {\n font-size: 1.33333em; // should be 16px with a default of 12px\n \twidth: auto; // use natural width\n line-height: 1;\n height: 1em; // same as line-height\n margin-right: .25em;\n top: auto;\n }\n}\n\n\n// Package overrides -------------------------------\n\n.status-bar.status-bar {\n\n // Read-only -> Remove hover effect\n .is-read-only, // <- use this class in packages\n status-bar-launch-mode,\n status-bar-cursor,\n busy-signal {\n &:hover,\n &:active,\n .inline-block:hover,\n .inline-block:active {\n background-color: transparent;\n }\n }\n\n // Remove underline\n .package-updates-status-view,\n .github-ChangedFilesCount {\n &:hover,\n &:focus {\n text-decoration: none;\n cursor: default;\n }\n }\n}\n","digest":"3ed78884247dbf0dcb19851c5663aae8c5da3169"},"node_modules/one-dark-ui/styles/tabs.less":{"content":"\n// Tabs\n\n@tab-border: 1px solid @tab-border-color;\n@title-padding: .66em;\n@icon-padding-top: .5em; // 2.5 (total) - 1.5 (text) / 2\n@icon-padding-right: .5em;\n\n.tab-bar {\n position: relative;\n height: @ui-tab-height;\n box-shadow: inset 0 -1px 0 @tab-border-color;\n background: @tab-bar-background-color;\n overflow-x: auto;\n overflow-y: hidden;\n border-radius: 0;\n\n &::-webkit-scrollbar {\n display: none;\n }\n\n &:empty {\n display: none;\n }\n\n\n // Tab ----------------------\n\n .tab {\n position: relative;\n top: 0;\n padding: 0;\n margin: 0;\n height: inherit;\n font-size: inherit;\n line-height: @ui-tab-height;\n color: @tab-text-color;\n background-color: @tab-background-color;\n box-shadow: inherit;\n border-left: @tab-border;\n &.active {\n color: @tab-text-color-active;\n background-color: @tab-background-color-active;\n box-shadow: none;\n }\n &:first-of-type {\n border-left-color: transparent;\n }\n &:last-of-type {\n // use box-shadow to not take up any space\n box-shadow: inset 0 -1px 0 @tab-border-color, 1px 0 0 @base-border-color;\n }\n &.active:last-of-type {\n box-shadow: 1px 0 0 @base-border-color;\n }\n\n\n // Title ----------------------\n\n .title {\n text-align: center;\n margin: 0 @title-padding;\n }\n\n\n // Icons ----------------------\n\n .title.title:before {\n margin-right: .3em;\n width: auto;\n height: auto;\n line-height: 1;\n font-size: 1.125em;\n vertical-align: -.0625em; // Adjust center for the 0.1em font-size increase\n }\n\n // Close icon ----------------------\n\n .close-icon {\n top: @icon-padding-top;\n right: @icon-padding-right;\n z-index: 2;\n font-size: 1em;\n width: 1.5em;\n height: 1.5em;\n line-height: 1.5;\n text-align: center;\n border-radius: @component-border-radius;\n background-color: inherit;\n overflow: hidden;\n transform: scale(0);\n transition: transform .08s;\n &:hover {\n color: @accent-text-color;\n background-color: @accent-color;\n }\n &:active {\n background-color: fade(@accent-color, 50%);\n }\n &::before {\n z-index: 1;\n font-size: 1.1em;\n vertical-align: -.05em; // Adjust center for the 0.1em font-size increase\n width: auto;\n height: auto;\n pointer-events: none;\n }\n }\n &:hover .close-icon {\n transform: scale(1);\n transition-duration: .16s;\n }\n }\n\n // Modified icon ----------------------\n\n .tab.modified {\n &:hover .close-icon {\n color: @accent-color;\n &:hover {\n color: @accent-bg-text-color;\n }\n }\n &:not(:hover) .close-icon {\n top: @icon-padding-top;\n right: @icon-padding-right;\n width: 1.5em;\n height: 1.5em;\n line-height: 1.5;\n color: @accent-color;\n border-radius: @component-border-radius;\n border: none;\n transform: scale(1);\n &::before {\n content: \"\\f052\";\n display: inline-block;\n }\n }\n }\n\n\n // Tabs in the docks ----------------------\n\n atom-dock & {\n .tab.active {\n background-color: @tool-panel-background-color;\n }\n }\n\n\n // Dragging ----------------------\n\n .tab.is-dragging {\n opacity: .5;\n\n .close-icon,\n &:before {\n visibility: hidden;\n }\n }\n\n .placeholder {\n position: relative;\n pointer-events: none;\n\n // bar\n &:before {\n z-index: 1;\n margin: 0;\n width: 2px;\n height: @ui-tab-height;\n background-color: @accent-color;\n }\n\n // arrow\n &:after {\n z-index: 0;\n top: @ui-tab-height/2;\n margin: -4px 0 0 -3px;\n border-radius: 0;\n border: 4px solid @accent-color;\n transform: rotate(45deg);\n background: transparent;\n }\n\n &:last-child {\n &:before {\n margin-left: -2px;\n }\n &:after {\n transform: none;\n margin-left: -10px;\n border-color: transparent @accent-color transparent transparent;\n }\n }\n }\n\n\n // Overrides ----------------------\n\n // keep tabs same size when active\n .tab,\n .tab.active {\n padding-right: 0;\n .title {\n padding: 0;\n }\n }\n}\n\n\n// Active pane marker --------------\n\natom-pane.active .tab.active:before {\n content: \"\";\n position: absolute;\n pointer-events: none;\n z-index: 2;\n top: 0;\n left: -1px; // cover left border\n bottom: 0;\n width: 2px;\n background: @accent-color;\n}\n\n// hide marker in docks\natom-dock .tab-bar .tab::before {\n display: none;\n}\n\n\n// Custom tabs --------------\n\n.tab-bar .tab.active {\n &[data-type$=\"Editor\"],\n &[data-type$=\"AboutView\"],\n &[data-type$=\"TimecopView\"],\n &[data-type$=\"StyleguideView\"],\n &[data-type=\"MarkdownPreviewView\"] {\n color: @tab-text-color-editor;\n background-color: @tab-background-color-editor; // Match syntax background color\n }\n}\n","digest":"1da2c3a580bb8d3f892a67d378eea1e887c22a64"},"node_modules/one-dark-ui/styles/text.less":{"content":"h1,\nh2,\nh3 {\n line-height: 1em;\n margin-bottom: 15px\n}\nh1 { font-size: 2em; }\nh2 { font-size: 1.5em; }\nh3 { font-size: 1.2em; }\n\np {\n line-height: 1.6;\n margin-bottom: 15px;\n}\n\nlabel {\n font-weight: normal;\n}\n\npre {\n box-shadow: none;\n color: @text-color;\n background: @inset-panel-background-color;\n border-radius: @component-border-radius;\n border: none;\n margin: 0;\n}\n\ncode {\n .text(highlight);\n background: @background-color-highlight;\n border-radius: @component-border-radius;\n}\n\n.selected { .text(highlight); }\n\n.text-smaller { font-size: 0.9em; }\n\n.text-subtle { .text(subtle); }\n.text-highlight { .text(highlight); }\n\n.text-error { .text(error); }\n.text-info {\n .text(info);\n &:hover { color: @text-color-info; }\n}\n.text-warning {\n .text(warning);\n &:hover { color: @text-color-warning; }\n}\n.text-success {\n .text(success);\n &:hover { color: @text-color-success; }\n}\n\n.highlight-mixin {\n padding: 1px 4px;\n border-radius: 2px;\n}\n\n.highlight {\n .highlight-mixin();\n font-weight: 700;\n color: @text-color-highlight;\n background-color: @background-color-highlight;\n}\n\n.highlight-color(@name, @background-color) {\n .highlight-@{name} {\n .highlight-mixin();\n font-weight: 500;\n color: white;\n text-shadow: 0 1px 0px hsla(0,0%,0%,.2);\n background-color: @background-color;\n }\n}\n.highlight-color( info, @background-color-info);\n.highlight-color(warning, @background-color-warning);\n.highlight-color( error, @background-color-error);\n.highlight-color(success, @background-color-success);\n\n.results-view .path-details.list-item {\n color: darken(@text-color-highlight, 18%);\n}\n","digest":"38471280be8bb348914ba7bf07bd03405facbd14"},"node_modules/one-dark-ui/styles/title-bar.less":{"content":".title-bar {\n height: 22px; // remove 1px since there is no border\n border-bottom: none;\n}\n","digest":"93638036e200a218636d7f1cdb32276c0c04ce0c"},"node_modules/one-dark-ui/styles/tooltips.less":{"content":".tooltip {\n white-space: nowrap;\n font-size: @ui-size*1.15;\n\n &.in {\n opacity: 1;\n transition: opacity .12s ease-out;\n }\n\n .tooltip-inner {\n line-height: 1;\n padding: @ui-padding*.5 @ui-padding*.65;\n border-radius: @component-border-radius;\n background-color: @tooltip-background-color;\n color: @tooltip-text-color;\n white-space: nowrap;\n max-width: none;\n }\n\n .keystroke {\n font-size: max(1em, @ui-size*.85);\n padding: .1em .4em;\n margin: 0 @ui-padding*-.35 0 @ui-padding*.25;\n border-radius: max(2px, @component-border-radius / 2);\n color: @tooltip-text-key-color;\n background: @tooltip-background-key-color;\n }\n\n &.top .tooltip-arrow {\n border-top-color: @tooltip-background-color;\n }\n &.top-left .tooltip-arrow {\n border-top-color: @tooltip-background-color;\n }\n &.top-right .tooltip-arrow {\n border-top-color: @tooltip-background-color;\n }\n &.right .tooltip-arrow {\n border-right-color: @tooltip-background-color;\n }\n &.left .tooltip-arrow {\n border-left-color: @tooltip-background-color;\n }\n &.bottom .tooltip-arrow {\n border-bottom-color: @tooltip-background-color;\n }\n &.bottom-left .tooltip-arrow {\n border-bottom-color: @tooltip-background-color;\n }\n &.bottom-right .tooltip-arrow {\n border-bottom-color: @tooltip-background-color;\n }\n}\n","digest":"d04c888a4ae472d7609d5ae9db25e2ded92049cc"},"node_modules/one-dark-ui/styles/tree-view.less":{"content":"@tree-view-height: @ui-line-height;\n\n.tree-view {\n font-size: @ui-size;\n background: @tree-view-background-color;\n\n .project-root.project-root {\n &:before {\n height: @ui-tab-height;\n background-clip: padding-box;\n }\n & > .header .name {\n line-height: @ui-tab-height;\n }\n }\n\n .selected:before {\n background: @tree-view-background-selected-color;\n }\n}\n\n.theme-one-dark-ui .tree-view .project-root.project-root::before {\n border-top: 1px solid transparent;\n background-clip: padding-box;\n}\n\n.tree-view-resizer {\n .tree-view-resize-handle {\n width: 8px;\n }\n}\n\n// Variable height, based on ems\n.list-group li:not(.list-nested-item),\n.list-tree li:not(.list-nested-item),\n.list-group li.list-nested-item > .list-item,\n.list-tree li.list-nested-item > .list-item {\n line-height: @tree-view-height;\n}\n\n.list-group .selected::before,\n.list-tree .selected::before {\n height: @tree-view-height;\n}\n\n// icon\n.list-group .icon,\n.list-tree .icon {\n display: inline-block;\n height: inherit;\n &::before {\n top: initial;\n line-height: inherit;\n height: inherit;\n vertical-align: top;\n }\n}\n\n// Arrow icon\n.list-group,\n.list-tree {\n .header.header.header.header::before {\n top: initial;\n line-height: inherit;\n height: inherit;\n vertical-align: top;\n }\n}\n.tree-view .project-root-header.project-root-header.project-root-header.project-root-header::before {\n line-height: 2.5em;\n}\n\n// Active tree-view marker --------------\n\n.tree-view::before {\n content: \"\";\n position: fixed;\n pointer-events: none;\n z-index: 1;\n height: @ui-tab-height;\n width: 2px;\n background: @accent-color;\n opacity: 0;\n transition: opacity .16s;\n}\n\n.tree-view:focus::before {\n opacity: 1;\n transition-duration: .32s;\n}\n","digest":"ad92d3ae03d42561e915df03447e87198f3e400c"},"node_modules/one-dark-ui/styles/ui-mixins.less":{"content":"// Pattern matching; ish is cray.\n// http://lesscss.org/#-pattern-matching-and-guard-expressions\n\n.text(normal) {\n font-weight: normal;\n color: @text-color;\n}\n.text(subtle) {\n font-weight: normal;\n color: @text-color-subtle;\n}\n.text(highlight) {\n font-weight: normal;\n color: @text-color-highlight;\n}\n.text(selected) {\n .text(highlight)\n}\n\n.text(info) {\n color: @text-color-info;\n}\n.text(success) {\n color: @text-color-success;\n}\n.text(warning) {\n color: @text-color-warning;\n}\n.text(error) {\n color: @text-color-error;\n}\n\n.focus() {\n outline: none;\n border-color: @accent-color;\n box-shadow: 0 0 0 1px @accent-color;\n}\n","digest":"64440a0c97fef0deb3fdf02973e6f8b131c5339e"},"node_modules/one-dark-ui/styles/ui-variables-custom.less":{"content":"\n// ONE dark UI colors\n// ----------------------------------------------\n\n@import \"syntax-variables\";\n\n.ui-syntax-color() { @syntax-background-color: hsl(220,24%,20%); } .ui-syntax-color(); // fallback color\n@ui-syntax-color: @syntax-background-color;\n\n// Color guards -----------------\n@ui-s-h: hue(@ui-syntax-color);\n@ui-s-s: saturation(@ui-syntax-color);\n@ui-s-l: lightness(@ui-syntax-color);\n@ui-inv: 10%; // inverse lightness if below\n\n.ui-hue() when (@ui-s-s = 0) { @ui-hue: 220; } // Use blue hue when no saturation\n.ui-hue() when (@ui-s-s > 0) { @ui-hue: @ui-s-h; }\n.ui-hue();\n\n.ui-saturation() when (@ui-s-h <= 80) { @ui-saturation: min(@ui-s-s, 5%); } // minimize saturation for brown\n.ui-saturation() when (@ui-s-h > 80) and (@ui-s-h < 160) { @ui-saturation: min(@ui-s-s, 12%); } // reduce saturation for green\n.ui-saturation() when (@ui-s-h >= 160) and (@ui-s-l < @ui-inv) { @ui-saturation: min(@ui-s-s, 48%); } // limit max saturation for very dark backgrounds\n.ui-saturation() when (@ui-s-h >= 160) and (@ui-s-l >= @ui-inv) { @ui-saturation: @ui-s-s; }\n.ui-saturation();\n\n.ui-lightness() when (@ui-s-l < @ui-inv) {\n @ui-lightness: @ui-s-l + 8%; // increase lightness when too dark\n @ui-lightness-border: @ui-lightness*.3;\n}\n.ui-lightness() when (@ui-s-l >= @ui-inv) {\n @ui-lightness: min(@ui-s-l, 20%); // limit max lightness (for light syntax themes)\n @ui-lightness-border: @ui-lightness*.6;\n}\n.ui-lightness();\n\n// Main colors -----------------\n@ui-fg: hsl(@ui-hue, min(@ui-saturation, 18%), max(@ui-lightness*3, 66%) );\n@ui-bg: hsl(@ui-hue, @ui-saturation, @ui-lightness); // normalized @syntax-background-color\n@ui-border: hsl(@ui-hue, @ui-saturation, @ui-lightness-border);\n\n\n\n\n// Custom variables\n// These variables are only used in this theme\n// ----------------------------------------------\n\n@ui-theme-name: one-dark-ui;\n\n// Text (Custom) -----------------\n@text-color-faded: fade(@text-color, 20%);\n\n@text-color-added: @text-color-success; // green\n@text-color-ignored: @text-color-subtle; // faded\n@text-color-modified: @text-color-warning; // orange\n@text-color-removed: @text-color-error; // red\n@text-color-renamed: @text-color-info; // blue\n\n\n// Background (Custom) -----------------\n@level-1-color: lighten(@base-background-color, 6%);\n@level-2-color: @base-background-color;\n@level-3-color: darken(@base-background-color, 3%);\n\n@level-3-color-hover: lighten(@level-3-color, 6%);\n@level-3-color-active: lighten(@level-3-color, 3%);\n\n\n// Accent (Custom) -----------------\n@accent-luma: luma( hsl(@ui-hue, 50%, 50%) ); // get lightness of current hue\n\n// used for marker, inputs (smaller things)\n@accent-color: mix( hsv( @ui-hue, 100%, 66%), hsl( @ui-hue, 100%, 70%), @accent-luma ); // mix hsv + hsl (favor mostly hsl)\n@accent-text-color: contrast(@accent-color, hsl(@ui-hue,100%,10%), #fff, 25% );\n\n// used for button, tooltip (larger things)\n@accent-bg-color: mix( hsv( @ui-hue, 66%, 66%), hsl( @ui-hue, 66%, 60%), @accent-luma * 2 ); // mix hsv + hsl (favor hsl for dark, hsv for light colors)\n@accent-bg-text-color: contrast(@accent-bg-color, hsl(@ui-hue,100%,10%), #fff, 30% );\n\n// used for text only\n@accent-only-text-color: mix( hsv( @ui-hue, 100%, 66%), hsl( @ui-hue, 100%, 77%), @accent-luma ); // mix hsv + hsl (favor mostly hsl)\n\n// Components (Custom) -----------------\n@badge-background-color: lighten(@background-color-highlight, 6%);\n\n@button-text-color-selected: @accent-bg-text-color;\n@button-border-color-selected: @base-border-color;\n\n@checkbox-background-color: fade(@accent-bg-color, 33%);\n\n@input-background-color-focus: mix(@accent-bg-color, @input-background-color, 10%);\n@input-selection-color: mix(@accent-color, @input-background-color, 25%);\n@input-selection-color-focus: mix(@accent-color, @input-background-color, 50%);\n\n@overlay-backdrop-color: hsl(@ui-hue,@ui-saturation,10%);\n@overlay-backdrop-opacity: .9;\n\n@progress-background-color: @accent-color;\n\n@scrollbar-color: @level-1-color;\n@scrollbar-background-color: @level-3-color; // replaced `transparent` with a solid color to test https://github.com/atom/one-light-ui/issues/4\n@scrollbar-color-editor: contrast(@ui-syntax-color, darken(@ui-syntax-color, 18%), lighten(@ui-syntax-color, 9%) );\n@scrollbar-background-color-editor: @ui-syntax-color;\n\n\n@tab-text-color: @text-color-subtle;\n@tab-text-color-active: @text-color-highlight;\n@tab-text-color-editor: contrast(@ui-syntax-color, darken(@ui-syntax-color, 50%), @text-color-highlight );\n@tab-background-color-editor: @ui-syntax-color;\n\n@tree-view-background-selected-color: lighten(@level-3-color, 5%);\n\n@tooltip-background-color: @accent-bg-color;\n@tooltip-text-color: @accent-bg-text-color;\n@tooltip-text-key-color: @tooltip-background-color;\n@tooltip-background-key-color: @tooltip-text-color;\n\n\n// Sizes (Custom) -----------------\n\n@ui-size: 1em;\n@ui-input-size: @ui-size*1.15;\n@ui-padding: @ui-size*1.5;\n@ui-padding-pane: @ui-size*.5;\n@ui-padding-icon: @ui-padding/3.3;\n@ui-line-height: @ui-size*2;\n@ui-tab-height: @ui-size*2.5;\n\n\n\n\n// Packages variables\n// These variables are used to override packages\n// ----------------------------------------------\n\n@settings-list-background-color: darken(@level-2-color, 1.5%);\n@theme-config-box-shadow: inset 0 0 3px hsla(0, 0%, 100%, .4), 0 1px 3px hsla(0, 0%, 0%, .2);\n@theme-config-box-shadow-selected: inset 0 1px 3px hsla(0, 0%, 0%, .1);\n@theme-config-border-selected: hsla(0, 0%, 100%, .75);\n\n\n\n// Debug\n// Output variables to the top of the UI\n// -------------------------------------\n\n// html:before {\n// content: \"@{variable}\";\n// }\n","digest":"21d3b5d6edf725579cfad45b4a5d081ffa888850"},"node_modules/one-dark-ui/styles/ui-variables.less":{"content":"\n@import \"ui-variables-custom.less\"; // import colors and custom variables\n\n// ONE dark UI variables\n// ----------------------------------------------\n\n// Official variables\n// These variables must be defined in every theme\n// Source: https://github.com/atom/atom/blob/master/static/variables/ui-variables.less\n// ----------------------------------------------\n\n\n// Text -----------------\n@text-color: @ui-fg;\n@text-color-subtle: fadeout(@text-color, 40%);\n@text-color-highlight: lighten(@text-color, 20%);\n@text-color-selected: white;\n\n@text-color-info: hsl(219, 79%, 66%);\n@text-color-success: hsl(140, 44%, 62%);\n@text-color-warning: hsl( 36, 60%, 72%);\n@text-color-error: hsl( 9, 100%, 64%);\n\n\n// Background -----------------\n@background-color-info: hsl(208, 88%, 48%);\n@background-color-success: hsl(132, 58%, 40%);\n@background-color-warning: hsl( 42, 88%, 36%);\n@background-color-error: hsl( 5, 64%, 50%);\n\n@background-color-highlight: lighten(@base-background-color, 4%);\n@background-color-selected: lighten(@base-background-color, 8%);\n\n@app-background-color: @level-3-color;\n\n\n// Base -----------------\n@base-background-color: @ui-bg;\n@base-border-color: @ui-border;\n\n\n// Components -----------------\n@pane-item-background-color: @base-background-color;\n@pane-item-border-color: @base-border-color;\n\n@input-background-color: darken(@base-background-color, 6%);\n@input-border-color: @base-border-color;\n\n@tool-panel-background-color: @level-3-color;\n@tool-panel-border-color: @base-border-color;\n\n@inset-panel-background-color: lighten(@level-2-color, 4%);\n@inset-panel-border-color: fadeout(@base-border-color, 15%);\n\n@panel-heading-background-color: @level-2-color;\n@panel-heading-border-color: @base-border-color;\n\n@overlay-background-color: @level-2-color;\n@overlay-border-color: @base-border-color;\n\n@button-background-color: @level-1-color;\n@button-background-color-hover: lighten(@button-background-color, 2%);\n@button-background-color-selected: @accent-bg-color;\n@button-border-color: @base-border-color;\n\n@tab-bar-background-color: @level-3-color;\n@tab-bar-border-color: @base-border-color;\n@tab-background-color: @level-3-color;\n@tab-background-color-active: @level-2-color;\n@tab-border-color: @base-border-color;\n\n@tree-view-background-color: @level-3-color;\n@tree-view-border-color: @base-border-color;\n\n@ui-site-color-1: hsl(208, 100%, 50%); // blue\n@ui-site-color-2: hsl(160, 70%, 42%); // green\n@ui-site-color-3: hsl(32, 60%, 50%); // orange\n@ui-site-color-4: #D831B0; // pink\n@ui-site-color-5: #EBDD5B; // yellow\n\n\n// Sizes -----------------\n@font-size: 12px;\n@input-font-size: 14px;\n@disclosure-arrow-size: 12px;\n\n@component-padding: 10px;\n@component-icon-padding: 5px;\n@component-icon-size: 16px; // needs to stay 16px to look sharpest\n@component-line-height: 25px;\n@component-border-radius: 3px;\n\n@tab-height: 30px;\n\n\n// Font -----------------\n@font-family: 'BlinkMacSystemFont', 'Lucida Grande', 'Segoe UI', Ubuntu, Cantarell, sans-serif;\n","digest":"ade239ee28a3515a891063cf32f6ab0f6abbee09"},"node_modules/one-light-ui/index.less":{"content":"@import \"variables/ui-variables\";\n@import \"variables/syntax-variables\";\n\n// Atom UI Theme: One\n\n@import \"styles/ui-variables.less\";\n@import \"styles/ui-mixins.less\";\n@import \"octicon-mixins.less\"; // https://github.com/atom/atom/blob/master/static/variables/octicon-mixins.less\n\n@import \"styles/atom.less\";\n@import \"styles/badges.less\";\n@import \"styles/buttons.less\";\n@import \"styles/docks.less\";\n@import \"styles/editor.less\";\n@import \"styles/git.less\";\n@import \"styles/inputs.less\";\n@import \"styles/lists.less\";\n@import \"styles/messages.less\";\n@import \"styles/nav.less\";\n@import \"styles/notifications.less\";\n@import \"styles/modal.less\";\n@import \"styles/panels.less\";\n@import \"styles/panes.less\";\n@import \"styles/progress.less\";\n@import \"styles/tabs.less\";\n@import \"styles/text.less\";\n@import \"styles/title-bar.less\";\n@import \"styles/tooltips.less\";\n@import \"styles/tree-view.less\";\n@import \"styles/status-bar.less\";\n@import \"styles/key-binding.less\";\n@import \"styles/sites.less\";\n\n@import \"styles/settings.less\";\n@import \"styles/packages.less\";\n@import \"styles/core.less\";\n@import \"styles/config.less\";\n","digest":"9ae52af555fe1bcd2721d52c1539ca092a07aafa"},"node_modules/one-light-ui/styles/atom.less":{"content":"* {\n\tbox-sizing: border-box;\n}\n\nhtml {\n\tfont-size: @font-size;\n}\n\natom-workspace {\n\tbackground-color: @app-background-color;\n}\n\n\n// Scrollbars ------------------------------------\n\n.scrollbars-visible-always {\n\t::-webkit-scrollbar {\n\t\twidth: 10px;\n\t\theight: 10px;\n\t}\n\n\t::-webkit-scrollbar-track {\n\t\tbackground: @scrollbar-background-color;\n\t}\n\n\t::-webkit-scrollbar-thumb {\n\t\tborder-radius: 5px;\n\t\tborder: 3px solid @scrollbar-background-color;\n\t\tbackground: @scrollbar-color;\n\t\tbackground-clip: content-box;\n\t}\n\n\t::-webkit-scrollbar-corner {\n\t\tbackground: @scrollbar-background-color;\n\t}\n\n\t::-webkit-scrollbar-thumb:vertical:active {\n\t\tborder-radius: 0;\n\t\tborder-left-width: 0;\n\t\tborder-right-width: 0;\n\t}\n\n\t::-webkit-scrollbar-thumb:horizontal:active {\n\t\tborder-radius: 0;\n\t\tborder-top-width: 0;\n\t\tborder-bottom-width: 0;\n\t}\n\n\tatom-text-editor {\n\t\t::-webkit-scrollbar-track {\n\t\t\tbackground: @scrollbar-background-color-editor;\n\t\t}\n\t\t::-webkit-scrollbar-corner {\n\t\t\tbackground: @scrollbar-background-color-editor;\n\t\t}\n\t\t::-webkit-scrollbar-thumb {\n\t\t\tborder-color: @scrollbar-background-color-editor;\n\t\t\tbackground: @scrollbar-color-editor;\n\t\t}\n\t}\n}\n\n// TODO: Move to a better place, not sure where it gets used\n.caret {\n border-top: 5px solid #fff;\n margin-top: -1px;\n}\n","digest":"df4447499593550b61146e7af8d0f4cd17991112"},"node_modules/one-light-ui/styles/badges.less":{"content":".badge {\n padding: @ui-padding/4 @ui-padding/2.5;\n min-width: @ui-padding*1.25;\n .text(highlight);\n border-radius: @ui-size*2;\n background-color: @badge-background-color;\n\n // Icon ----------------------\n &.icon {\n font-size: @ui-size;\n padding: @ui-padding-icon @ui-padding-icon*1.5;\n }\n\n}\n","digest":"bfb1f9e90af654b5baa53d74c36628140507a3f7"},"node_modules/one-light-ui/styles/buttons.less":{"content":"\n@btn-border: 1px solid @button-border-color;\n@btn-padding: 0 @ui-size/1.25;\n\n// Mixins -----------------------\n\n.btn-default (@color, @hover-color, @selected-color, @text-color) {\n color: @text-color;\n text-shadow: none;\n border: @btn-border;\n background-color: @color;\n background-image: linear-gradient(lighten(@color, 2%), @color);\n\n &:hover {\n color: @text-color-highlight;\n background-image: linear-gradient(lighten(@hover-color, 2%), @hover-color);\n }\n &:active {\n background: darken(@color, 4%);\n box-shadow: none;\n }\n &.selected {\n background: @selected-color;\n }\n &.selected:focus,\n &.selected:hover {\n background: lighten(@selected-color, 2%);\n }\n &:focus {\n .focus(); // unfortunately :focus styles stay even after releasing mouse.\n }\n}\n\n.btn-variant (@color) {\n @_text-color: contrast(@color, white, hsl(0,0%,20%), 33% );\n .btn-default(\n @color,\n lighten(@color, 3%),\n saturate(darken(@color, 12%), 20%),\n @text-color-highlight\n );\n color: @_text-color;\n\n & when (@ui-lightness > 50%) {\n border-color: transparent; // hide border on light backgrounds\n }\n\n &:hover,\n &:focus {\n color: @_text-color;\n }\n &:focus {\n border-color: transparent;\n background-clip: padding-box;\n box-shadow: inset 0 0 0 1px fade(@base-border-color, 50%), 0 0 0 1px @color;\n }\n\n &.icon:before {\n color: @_text-color;\n }\n}\n\n\n// Buttons -----------------------\n\n.btn {\n height: initial;\n padding: @btn-padding;\n font-size: @ui-size;\n line-height: @ui-line-height;\n}\n\n.btn,\n.btn.btn-default {\n .btn-default(@button-background-color, @button-background-color-hover, @button-background-color-selected, @text-color);\n}\n\n.btn.btn-primary {\n .btn-variant(@accent-bg-color);\n}\n.btn.btn-info {\n .btn-variant(@background-color-info);\n}\n.btn.btn-success {\n .btn-variant(@background-color-success);\n}\n.btn.btn-warning {\n .btn-variant(@background-color-warning);\n}\n.btn.btn-error {\n .btn-variant(@background-color-error);\n}\n\n\n// Button Sizes -----------------------\n\n.btn.btn-xs,\n.btn-group-xs > .btn {\n font-size: @ui-size*.8;\n line-height: @ui-line-height;\n padding: @btn-padding;\n}\n.btn.btn-sm,\n.btn-group-sm > .btn {\n font-size: @ui-size*.9;\n line-height: @ui-line-height;\n padding: @btn-padding;\n}\n.btn.btn-lg,\n.btn-group-lg > .btn {\n font-size: @ui-size * 1.5;\n line-height: @ui-line-height;\n padding: @btn-padding;\n}\n\n\n// Button Group -----------------------\n\n.btn-group > .btn {\n z-index: 0;\n &:hover {\n z-index: 0;\n }\n &.btn:focus {\n z-index: 1;\n .focus();\n }\n\n &:first-child {\n border-left: @btn-border;\n }\n &:last-child,\n &.selected:last-child {\n border-right: @btn-border;\n }\n\n // hide border on light backgrounds\n & when (@ui-lightness > 50%) {\n &.btn-primary:first-child,\n &.btn-info:first-child,\n &.btn-success:first-child,\n &.btn-warning:first-child,\n &.btn-error:first-child {\n border-left-color: transparent;\n }\n\n &.btn-primary:last-child,\n &.btn-info:last-child,\n &.btn-success:last-child,\n &.btn-warning:last-child,\n &.btn-error:last-child {\n border-right-color: transparent;\n }\n }\n\n &.selected,\n &.selected:first-child,\n &.selected:last-child {\n color: @button-text-color-selected;\n border-color: @button-border-color-selected;\n }\n\n & when (@ui-lightness > 50%) {\n &.selected + .btn {\n border-left-color: @button-border-color-selected;\n }\n &.selected + .selected {\n border-left-color: mix(@button-border-color, @button-border-color-selected);\n }\n }\n\n &.selected:focus {\n border-color: @button-background-color-selected;\n box-shadow: inset 0 0 0 1px fade(@base-border-color, 50%), 0 0 0 1px @button-background-color-selected;\n }\n}\n\n\n// Button Icons -----------------------\n\n.btn.icon:before {\n width: auto;\n height: auto;\n font-size: 1.333333em;\n vertical-align: -.1em;\n}\n","digest":"771f75f5f119b4282fb0980b2c492e5cf15ad5d3"},"node_modules/one-light-ui/styles/config.less":{"content":"\n// Tabs ----------------------------------------------\n\n@theme-tabsizing: ~'theme-@{ui-theme-name}-tabsizing';\n@theme-dockButtons: ~'theme-@{ui-theme-name}-dock-buttons';\n\n@tab-min-width: 7em; // ~ icon + 6 characters\n\n\n// Even (default) ---------------\n\n.tab-bar {\n .tab,\n .tab.active {\n flex: 1 1 0;\n max-width: 22em;\n min-width: @tab-min-width;\n }\n atom-dock & {\n .tab,\n .tab.active {\n max-width: none;\n }\n }\n\n // TODO: Turn this into a config\n // Truncates the beginning instead\n // .title.title.title {\n // direction: rtl; // change direction\n // }\n}\n\n\n// Maximum (full width) ---------------\n\n[@{theme-tabsizing}=\"maximum\"] .tab-bar {\n .tab,\n .tab.active {\n max-width: none;\n }\n}\n\n\n// Minimum (show long paths) ---------------\n\n[@{theme-tabsizing}=\"minimum\"] .tab-bar {\n .tab,\n .tab.active {\n flex: 0 0 auto;\n min-width: 2.75em;\n max-width: @tab-min-width * 3.3;\n }\n atom-dock {\n .tab,\n .tab.active {\n max-width: @tab-min-width * 2;\n }\n }\n}\n\n\n\n// Hide docks toggle buttons ------------------------------\n\n[@{theme-dockButtons}=\"hidden\"] {\n\n // Hide docks when not open\n .atom-dock-inner:not(.atom-dock-open) {\n display: none;\n }\n\n // Hide toggle buttons\n .atom-dock-toggle-button {\n display: none;\n }\n\n}\n","digest":"7b535b404a0238604350777668da209e6cb2f2b7"},"node_modules/one-light-ui/styles/core.less":{"content":"// Misc\n\n.preview-pane .results-view .path-match-number {\n // show number also on selected item\n color: inherit;\n opacity: .6;\n}\n\n.tool-panel.incompatible-packages {\n // incompatible-packages isn't really a tool-panel and more a whole pane\n .text(normal);\n background-color: @level-2-color;\n}\n\n// Styleguide ----------------------------------------------\n\n.styleguide {\n // Modal\n atom-panel.modal:after {\n position: absolute; // prevent overlay backdrop from leaking outside\n left: -@ui-padding;\n right: -@ui-padding;\n bottom: -@ui-padding;\n }\n}\n","digest":"4ba9309f9e37001066e7f31b17f9ff985741a298"},"node_modules/one-light-ui/styles/docks.less":{"content":"\n// Docks ------------------------------\n\n// Make handles not take up any space when dock is open\n.atom-dock-resize-handle {\n position: absolute;\n z-index: 11; // same as toggle buttons\n\n &.left {\n top: 0;\n right: 0;\n bottom: 0;\n }\n &.right {\n top: 0;\n left: 0;\n bottom: 0;\n }\n &.bottom {\n top: 0;\n left: 0;\n right: 0;\n }\n}\n\n// Add borders\n.atom-dock-inner.atom-dock-open.left {\n border-right: 1px solid @base-border-color;\n}\n.atom-dock-inner.atom-dock-open.right {\n border-left: 1px solid @base-border-color;\n}\n\n// Make toggle buttons cover ^ border\n.atom-dock-toggle-button.left {\n margin-left: -1px;\n}\n.atom-dock-toggle-button.right {\n margin-right: -1px;\n}\n.atom-dock-inner:not(.atom-dock-open) .atom-dock-toggle-button.bottom {\n margin-bottom: -1px;\n}\n","digest":"2d1e626354879323d3f61341a8e6f903ceec1f7a"},"node_modules/one-light-ui/styles/dropdowns.less":{"content":".dropdown-menu {\n background-color: @overlay-background-color;\n border-radius: @component-border-radius;\n border: 1px solid @base-border-color;\n padding: 0;\n\n > li > a {\n .text(normal);\n }\n\n > li > a:hover {\n .text(highlight);\n background-color: @background-color-highlight;\n }\n}\n","digest":"344a6a3a32a0e115652f60c7626fc93e1d2220c1"},"node_modules/one-light-ui/styles/editor.less":{"content":"\n// Editor in a panel\n\n// TODO: Find a better selector, maybe a new class like atom-text-editor[medium]\natom-panel-container atom-text-editor.is-focused {\n .focus();\n}\n\n\n// Mini\n// Usually just single line inputs\n\natom-text-editor[mini] {\n overflow: auto;\n font-size: @ui-input-size;\n line-height: @ui-line-height;\n max-height: @ui-line-height * 5; // rows\n padding-left: @ui-padding/3;\n border-radius: @component-border-radius;\n color: @text-color-highlight;\n border: 1px solid @input-border-color;\n background-color: @input-background-color;\n\n .placeholder-text {\n color: @text-color-subtle;\n }\n\n .selection .region {\n background-color: @input-selection-color;\n }\n\n .cursor {\n border-color: @accent-color;\n border-width: 2px;\n }\n\n &.is-focused {\n .focus();\n background-color: @input-background-color-focus;\n .selection .region {\n background-color: @input-selection-color-focus;\n }\n }\n}\n","digest":"c372db5e2182585e75a5dbc970c85d04f9ac94c9"},"node_modules/one-light-ui/styles/git.less":{"content":".status { .text(normal); }\n.status-added { .text(success); } // green\n.status-ignored { .text(subtle); } // faded\n.status-modified { .text(warning); } // orange\n.status-removed { .text(error); } // red\n.status-renamed { .text(info); } // blue\n","digest":"4cc19322834e5e93b47fe889895e14e6a7576f8d"},"node_modules/one-light-ui/styles/inputs.less":{"content":"\n//\n// Checkbox\n// -------------------------\n\n.input-checkbox {\n &:active {\n background-color: @accent-color;\n }\n &:before,\n &:after {\n background-color: @accent-text-color;\n }\n &:checked {\n background-color: @accent-color;\n }\n\n &:indeterminate {\n background-color: @accent-color;\n }\n}\n\n\n//\n// Radio\n// -------------------------\n\n.input-radio {\n &:before {\n background-color: @accent-text-color;\n }\n &:active {\n background-color: @accent-color;\n }\n &:checked {\n background-color: @accent-color;\n }\n}\n\n\n//\n// Range (Slider)\n// -------------------------\n\n.input-range {\n &::-webkit-slider-thumb {\n background-color: @accent-color;\n }\n}\n\n\n//\n// Toggle\n// -------------------------\n\n.input-toggle {\n &:checked {\n background-color: @accent-color;\n }\n &:before {\n background-color: @accent-text-color;\n }\n}\n\n\n\n// States -------------------------\n\n.input-text,\n.input-search,\n.input-number,\n.input-textarea,\n.input-select,\n.input-color {\n &:focus {\n .focus();\n }\n}\n","digest":"fcb0b948128bc844c8d5d19a0bbbf7debe9ecfb2"},"node_modules/one-light-ui/styles/key-binding.less":{"content":".key-binding {\n display: inline-block;\n margin-left: @ui-padding-icon;\n padding: 0 @ui-padding/4;\n line-height: 2;\n font-family: inherit;\n font-size: max(1em, @ui-size*.85);\n letter-spacing: @ui-size/10;\n border-radius: @component-border-radius;\n color: @accent-bg-text-color;\n background-color: @accent-bg-color;\n}\n","digest":"2c7039e912c9a51bc17fdb5619d12da5192a1f6f"},"node_modules/one-light-ui/styles/lists.less":{"content":".list-group,\n.list-tree {\n li:not(.list-nested-item),\n li.list-nested-item > .list-item {\n .text(normal);\n }\n\n .generate-list-item-text-color(@class) {\n li:not(.list-nested-item).text-@{class},\n li.list-nested-item.text-@{class} > .list-item {\n .text(@class);\n }\n }\n .generate-list-item-text-color(subtle);\n .generate-list-item-text-color(info);\n .generate-list-item-text-color(success);\n .generate-list-item-text-color(warning);\n .generate-list-item-text-color(error);\n .generate-list-item-text-color(selected);\n\n .generate-list-item-status-color(@color, @status) {\n li:not(.list-nested-item).status-@{status},\n li.list-nested-item.status-@{status} > .list-item {\n color: @color;\n }\n\n li:not(.list-nested-item).selected.status-@{status},\n li.list-nested-item.selected.status-@{status} > .list-item {\n color: @color;\n }\n\n }\n\n .generate-list-item-status-color(@text-color-added, added);\n .generate-list-item-status-color(@text-color-ignored, ignored);\n .generate-list-item-status-color(@text-color-modified, modified);\n .generate-list-item-status-color(@text-color-removed, removed);\n .generate-list-item-status-color(@text-color-renamed, renamed);\n\n li:not(.list-nested-item).selected,\n li.list-nested-item.selected > .list-item {\n .text(selected);\n }\n\n .no-icon {\n padding-left: calc(@ui-padding-icon ~\"+\" @component-icon-size);\n }\n}\n\n.list-tree.has-collapsable-children .list-nested-item > .list-item::before {\n text-align: center;\n}\n\n.select-list ol.list-group,\n&.select-list ol.list-group {\n li.two-lines {\n .secondary-line {\n color: @text-color-subtle;\n }\n &.selected .secondary-line {\n color: fade(@text-color-highlight, 50%);\n text-shadow: none;\n }\n }\n\n // We want to highlight the background of the list items because we dont\n // know their size.\n li.selected {\n background-color: @background-color-selected;\n &:before{ display: none; }\n }\n\n &.mark-active {\n @active-icon-size: 14px;\n\n // pad in front of the text where the icon would be We'll pad the non-\n // active items with a 'fake' icon so other classes can pad the item\n // without worrying about the icon padding.\n li:before {\n content: '';\n background-color: transparent;\n position: static;\n display: inline-block;\n left: auto; right: auto;\n height: @active-icon-size;\n width: @active-icon-size;\n font-size: @active-icon-size;\n }\n > li:not(.active):before {\n margin-right: @ui-padding-icon;\n }\n li.active {\n .octicon(check, @active-icon-size);\n &:before {\n margin-right: @ui-padding-icon;\n color: @text-color-success;\n }\n }\n }\n}\n\n.select-list.popover-list {\n @popover-list-padding: @ui-padding/4;\n background-color: @overlay-background-color;\n box-shadow: 0 2px 8px 1px rgba(0, 0, 0, 0.3);\n padding: @popover-list-padding;\n border-radius: @component-border-radius;\n\n atom-text-editor[mini] {\n margin-bottom: @popover-list-padding;\n }\n\n ol.list-group {\n margin-top: @popover-list-padding;\n }\n\n .list-group li {\n padding-left: @popover-list-padding;\n }\n}\n\n.ui-sortable {\n li {\n line-height: 2.5;\n }\n\n // For sortable lists in the settings view\n li.ui-sortable-placeholder {\n visibility: visible !important;\n background-color: darken(@pane-item-background-color, 10%);\n }\n}\n\nli.ui-draggable-dragging,\nli.ui-sortable-helper {\n line-height: @ui-line-height;\n height: @ui-line-height;\n border: 0;\n border-radius: 0;\n list-style: none;\n padding: 0 @ui-padding;\n background: @background-color-highlight;\n box-shadow: 0 0 1px @base-border-color;\n}\n","digest":"62e28d3f59d575bb09af38145920fb7dca076620"},"node_modules/one-light-ui/styles/messages.less":{"content":"background-tips ul.background-message {\n font-weight: 500;\n font-size: 2em;\n color: @text-color-faded;\n\n .message {\n padding: 0 @component-padding * 10;\n\n .keystroke {\n white-space: nowrap;\n vertical-align: middle;\n line-height: 1;\n padding: .1em .4em;\n }\n }\n}\n","digest":"fbe98214c0578199506deb9b230c56019060194b"},"node_modules/one-light-ui/styles/modal.less":{"content":"\n@modal-padding: @ui-padding/2 @ui-padding/1.5;\n@modal-width: @ui-size * 50;\n\natom-panel-container.modal {\n position: absolute;\n top: 0; left: 0; right: 0;\n}\n\natom-panel.modal {\n position: relative;\n width: 100%;\n max-width: @modal-width;\n margin: 0 auto;\n left: initial;\n color: @text-color;\n background-color: transparent;\n padding: @ui-padding/2;\n\n &.from-top {\n top: @component-padding * 5;\n }\n\n atom-text-editor[mini] {\n margin-bottom: @ui-padding/2;\n }\n\n .select-list ol.list-group,\n &.select-list ol.list-group {\n border: 1px solid @overlay-border-color;\n background-color: lighten(@overlay-background-color, 2%);\n\n &:empty {\n border: none;\n margin-top: 0;\n }\n\n li {\n padding: @modal-padding;\n line-height: @ui-line-height;\n border-bottom: 1px solid @overlay-border-color;\n\n &:last-of-type {\n border-bottom: none;\n }\n\n .icon::before {\n margin-left: 1px;\n }\n\n .icon.status {\n float: right;\n margin-left: @ui-padding-icon;\n &:before {\n margin-left: 0;\n margin-right: 0;\n }\n }\n\n &.selected {\n .status.icon {\n color: @text-color-selected;\n }\n }\n }\n\n }\n\n .select-list .key-binding {\n margin-top: -1px;\n margin-left: @ui-padding/2;\n margin-right: calc( -@ui-padding/3 ~\"+\" 1px);\n }\n\n .select-list .primary-line {\n display: block;\n }\n\n & > * {\n position: relative; // fixes stacking order\n }\n\n\n // Container\n &:before {\n content: \"\";\n position: absolute;\n top: 0;\n left: 0;\n right: 0;\n bottom: 0;\n z-index: 0;\n background-color: @overlay-background-color;\n border-radius: @component-border-radius*2;\n box-shadow: 0 6px 12px -2px hsla(0,0%,0%,.4);\n }\n\n // Backdrop\n // TODO: Add extra wrapper to translate individually or easier positioning\n\n &:after {\n content: \"\";\n position: fixed;\n top: 0;\n left: 0;\n right: 0;\n bottom: 0;\n z-index: -1;\n background: @overlay-backdrop-color;\n opacity: @overlay-backdrop-opacity;\n backface-visibility: hidden; // fixes scrollbar on retina screens\n -webkit-animation: overlay-fade .24s cubic-bezier(0.215, 0.61, 0.355, 1);\n }\n\n @-webkit-keyframes overlay-fade {\n 0% { opacity: 0; }\n 100% { opacity: @overlay-backdrop-opacity; }\n }\n\n}\n","digest":"890e4f55f8035017d9f295a6a96247b398760fdf"},"node_modules/one-light-ui/styles/nav.less":{"content":".nav-tabs {\n border-bottom: 1px solid @base-border-color;\n li {\n a,\n &.active a {\n border: none;\n margin-right: 0px;\n margin-bottom: 1px;\n }\n\n a:hover,\n &.active a,\n &.active a:hover {\n background-color: @background-color-highlight;\n border: none;\n color: @text-color-selected;\n border-bottom-left-radius: 0px;\n border-bottom-right-radius: 0px;\n }\n\n &.active a {\n background-color: @tab-background-color-active;\n }\n }\n}\n","digest":"54ed0e49741845e8799c9513ae21ca7ae75f751d"},"node_modules/one-light-ui/styles/notifications.less":{"content":"\natom-notifications {\n font-size: @ui-size * 1.2;\n\n atom-notification {\n width: 32em;\n &.has-detail {\n width: 32em;\n }\n\n &:first-child.has-close .message {\n padding-right: 9em;\n }\n &:only-child.has-close .message,\n &.has-close .message {\n padding-right: 2.5em;\n }\n .item {\n padding: @ui-padding/2;\n }\n\n .detail,\n .description {\n font-size: .85em;\n }\n\n &.icon:before {\n padding-top: .85em;\n }\n .close {\n width: 2.5em;\n height: 3em;\n line-height: 3em;\n font-size: inherit;\n }\n .close-all.btn {\n top: .5em;\n right: 2.5em;\n }\n .btn-copy-report {\n line-height: 2em;\n margin-left: .5em;\n }\n }\n}\n","digest":"2e08e0dc91ed0d4dcf79a1dcec241fd3ceac0cf4"},"node_modules/one-light-ui/styles/packages.less":{"content":"// Overrides packages\n\n// find-and-replace + project-find ---------------------------\n\n.find-and-replace,\n.project-find {\n padding: @ui-padding/4;\n .input-block-item {\n padding: @ui-padding/4;\n }\n}\n\n// find-and-replace\n.find-and-replace {\n .header,\n .input-block {\n min-width: @ui-size*22;\n }\n\n .input-block-item {\n flex: 1 1 @ui-size*22;\n }\n .input-block-item--flex {\n flex: 100 1 @ui-size*22;\n }\n\n .btn,\n .btn-group-options .btn {\n font-size: @ui-size*1.1;\n padding: 0;\n }\n\n .btn-group-options .btn,\n .btn-group-options .btn.option-selection,\n .btn-group-options .btn.option-whole-word {\n padding: 0;\n font-size: @ui-input-size; // keep same as text input\n }\n\n .find-container atom-text-editor {\n padding-right: @ui-size*5; // leave some room for the results count\n }\n .find-meta-container {\n top: 0;\n font-size: @ui-size;\n line-height: @ui-size*2.5;\n }\n}\n\n// project-find\n.project-find {\n .header,\n .input-block {\n min-width: @ui-size*15;\n }\n\n .input-block-item {\n flex: 1 1 @ui-size*14;\n }\n .input-block-item--flex {\n flex: 100 1 @ui-size*20;\n }\n\n .btn {\n font-size: @ui-size*1.1;\n padding: 0;\n }\n .btn-group-options .btn {\n padding: 0;\n font-size: @ui-input-size; // keep same as text input\n }\n}\n\n// Colorize find-and-replace based on results\n& when (@ui-hue >= 190) and (@ui-hue <= 340) {\n .find-and-replace {\n &.has-no-results .find-container atom-text-editor[mini].is-focused {\n border-color: @text-color-error;\n box-shadow: 0 0 0 1px @text-color-error;\n background-color: mix(@text-color-error, @input-background-color, 10%);\n .selection .region {\n background-color: mix(@text-color-error, @input-background-color, 50%);\n }\n .cursor {\n border-color: @text-color-error;\n }\n }\n\n &.has-results .find-container atom-text-editor[mini].is-focused {\n border-color: @text-color-success;\n box-shadow: 0 0 0 1px @text-color-success;\n background-color: mix(@text-color-success, @input-background-color, 10%);\n .selection .region {\n background-color: mix(@text-color-success, @input-background-color, 50%);\n }\n .cursor {\n border-color: @text-color-success;\n }\n }\n\n &.has-results .find-container .result-counter { color: @text-color-success; }\n &.has-no-results .find-container .result-counter { color: @text-color-error; }\n }\n}\n\n\n\n\n// Timecop ---------------------------\n\n.timecop {\n .timecop-panel {\n padding: @component-padding/2;\n background-color: @level-2-color;\n }\n\n .tool-panel {\n padding: @component-padding/2;\n background-color: @level-2-color;\n }\n\n .inset-panel {\n border: 1px solid @base-border-color;\n }\n\n .panel-heading {\n .text(highlight);\n border-color: @base-border-color;\n background-color: @level-1-color;\n }\n\n .list-item .inline-block {\n line-height: 1.5;\n }\n}\n\n\n// Command Palette + Fuzzy Finder ---------------------------\n\n.command-palette .list-group .character-match,\n.fuzzy-finder .list-group .character-match {\n color: @accent-only-text-color;\n}\n\n\n// Deprecation Cop ---------------------------\n\n.deprecation-cop {\n .deprecation-overview {\n background-color: @level-2-color;\n border-bottom: 1px solid @base-border-color;\n }\n}\n\n\n// Tool Bar ---------------------------\n\n.tool-bar {\n // Make it look the same as other panels\n background-color: @level-3-color;\n border: none;\n\n // just a single border + more spacing\n &.tool-bar-horizontal .tool-bar-spacer {\n border-left: 0 none;\n margin-left: .5em;\n margin-right: .5em;\n }\n &.tool-bar-vertical .tool-bar-spacer {\n border-bottom: 0 none;\n margin-top: .5em;\n margin-bottom: .5em;\n }\n\n // only show button styles on hover\n button.tool-bar-btn {\n background-color: @level-3-color;\n background-image: none;\n border-color: @level-3-color;\n }\n}\n","digest":"ca6dd32da78f7a265151bdc16ad95616ee42c1b0"},"node_modules/one-light-ui/styles/panels.less":{"content":"\n// Panels\n\natom-panel {\n .text(normal);\n position: relative;\n border-bottom: 1px solid @base-border-color;\n\n &.top {\n border-right: 1px solid @base-border-color;\n }\n &.left {\n border-right: 1px solid @base-border-color;\n }\n &.right {\n border-left: 1px solid @base-border-color;\n }\n &.bottom {\n border-right: 1px solid @base-border-color;\n }\n &.footer:last-child {\n border-bottom: none;\n }\n &.tool-panel:empty {\n border: none;\n }\n}\n\n.panel {\n &.bordered {\n border: 1px solid @base-border-color;\n border-radius: @component-border-radius;\n }\n}\n\n.inset-panel {\n position: relative;\n background-color: @inset-panel-background-color;\n border-radius: @component-border-radius;\n &.bordered {\n border: 1px solid @base-border-color;\n border-radius: @component-border-radius;\n }\n & .panel-heading {\n border-color: @inset-panel-border-color;\n }\n}\n\n.panel-heading {\n .text(normal);\n border-bottom: 1px solid @panel-heading-border-color;\n background-color: @panel-heading-background-color;\n\n .btn {\n padding-left: 8px;\n padding-right: 8px;\n .btn-default(\n lighten(@button-background-color, 10%),\n lighten(@button-background-color-hover, 10%),\n lighten(@button-background-color-selected, 10%),\n lighten(@text-color, 10%)\n );\n }\n}\n","digest":"78e95fe77592b096e829427a1a4c35c24f9baea6"},"node_modules/one-light-ui/styles/panes.less":{"content":"\natom-pane-container {\n\n atom-pane {\n position: relative;\n border-right: 1px solid @base-border-color;\n border-bottom: 1px solid @base-border-color;\n\n .item-views {\n // prevent atom-text-editor from leaking ouside might improve performance\n overflow: hidden;\n }\n }\n\n}\n\n// Hide right-most border\natom-pane:only-child,\natom-pane-axis.pane-row > atom-pane:last-child,\natom-pane-axis.pane-column:last-child > atom-pane {\n border-right: none;\n}\n","digest":"517a4bfd51fba7919d84a7e89eef84db64f68d55"},"node_modules/one-light-ui/styles/progress.less":{"content":"\n// Spinner ----------------------\n\n@spinner-duration: 1.2s;\n\n.loading-spinner(@size) {\n position: relative;\n display: block;\n width: 1em;\n height: 1em;\n font-size: @size;\n background: radial-gradient(@accent-color .1em, transparent .11em);\n\n &::before,\n &::after {\n content: \"\";\n position: absolute;\n z-index: 10; // prevent sibling elements from getting their own layers\n top: 0;\n left: 0;\n border-radius: 1em;\n width: inherit;\n height: inherit;\n border-radius: 1em;\n border: 2px solid;\n -webkit-animation: spinner-animation @spinner-duration infinite;\n -webkit-animation-fill-mode: backwards;\n }\n &::before {\n border-color: @accent-color transparent transparent transparent;\n }\n &::after {\n border-color: transparent lighten(@accent-color, 15%) transparent transparent;\n -webkit-animation-delay: @spinner-duration/2;\n }\n\n &.inline-block {\n display: inline-block;\n }\n}\n\n@-webkit-keyframes spinner-animation {\n 0% { transform: rotateZ( 0deg); -webkit-animation-timing-function: cubic-bezier(0, 0, .8, .2); }\n 50% { transform: rotateZ(180deg); -webkit-animation-timing-function: cubic-bezier(.2, .8, 1, 1); }\n 100% { transform: rotateZ(360deg); }\n}\n\n// Spinner sizes\n.loading-spinner-tiny { .loading-spinner(16px); &::before, &::after { border-width: 1px; } }\n.loading-spinner-small { .loading-spinner(32px); }\n.loading-spinner-medium { .loading-spinner(48px); }\n.loading-spinner-large { .loading-spinner(64px); }\n\n\n\n\n// Progress Bar ----------------------\n\n@progress-height: 8px;\n@progress-buffer-color: fade(@progress-background-color, 20%);\n\nprogress {\n -webkit-appearance: none;\n height: @progress-height;\n border-radius: @component-border-radius;\n background-color: @input-background-color;\n box-shadow: inset 0 0 0 1px @input-border-color;\n\n &::-webkit-progress-bar {\n background-color: transparent;\n }\n\n &::-webkit-progress-value {\n border-radius: @component-border-radius;\n background-color: @progress-background-color;\n }\n\n // Is buffering (when no value is set)\n &:indeterminate {\n background-image:\n linear-gradient(-45deg, transparent 33%, @progress-buffer-color 33%,\n @progress-buffer-color 66%, transparent 66%);\n background-size: 25px @progress-height, 100% 100%, 100% 100%;\n\n // Plays animation for 1min (12runs) at normal speed,\n // then slows down frame-rate for 9mins (108runs) to limit CPU usage\n -webkit-animation: progress-buffering 5s linear 12,\n progress-buffering 5s 60s steps(10) 108;\n }\n}\n\n@-webkit-keyframes progress-buffering {\n 100% { background-position: -100px 0px; }\n}\n","digest":"c51843dd15ee040fd7a60aaccf3e2d1071459cb0"},"node_modules/one-light-ui/styles/settings.less":{"content":"\n// Settings\n\n// Modular Scale (1.125): http://www.modularscale.com/?1&em&1.125&web&table\n@ms-6: @ui-size * 2.027;\n@ms-5: @ui-size * 1.802;\n@ms-4: @ui-size * 1.602;\n@ms-3: @ui-size * 1.424;\n@ms-2: @ui-size * 1.266;\n@ms-1: @ui-size * 1.125;\n@ms-0: @ui-size * 1;\n@ms_1: @ui-size * 0.889;\n@ms_2: @ui-size * 0.790;\n\n\n\n.settings-view {\n\n\t// Menu ------------------------------\n\n\t.config-menu {\n\t\tposition: relative;\n\t\tmin-width: @ui-size * 15;\n\t\tmax-width: @ui-size * 20;\n\t\tborder-width: 0 1px 0 0;\n\t\tborder-image: linear-gradient(@level-2-color 10px, @base-border-color 200px) 0 1 0 0 stretch;\n\t\tbackground: @level-2-color;\n\n\t\t.btn {\n\t\t\twhite-space: initial;\n\t\t\tfont-size: @ms_1;\n\t\t\tline-height: 1;\n\t\t\tpadding: @ui-padding/3 @ui-padding/2;\n\t\t\t&::before {\n\t\t\t\tvertical-align: middle;\n\t\t\t}\n\t\t}\n\n\n\t}\n\t.nav {\n\t\t& > li > a {\n\t\t\tpadding: @ui-padding/2 @ui-padding;\n\t\t\tline-height: @ui-line-height;\n\t\t}\n\t}\n\n\n\t// Sections ------------------------------\n\n\t& > .panels {\n\t\tbackground-color: @level-2-color;\n\t}\n\n\t.section-container {\n\t\tmax-width: @ui-size*60;\n\t}\n\t.sub-section {\n\t\tmargin: @ui-padding*3 0;\n\t}\n\n\t.section,\n\t.section:first-child,\n\t.section:last-child {\n\t\tpadding: @ui-padding*3;\n\t}\n\n\t.themes-panel .control-group {\n\t\tmargin-top: @ui-padding*2;\n\t}\n\n\n\t// Titles ------------------------------\n\n\t.section .section-heading {\n\t\tmargin-bottom: @ui-padding/1.5;\n\t}\n\n\t.sub-section-heading.icon:before,\n\t.section-heading.icon:before {\n\t\tmargin-right: @ui-padding-icon;\n\t}\n\n\n\n\t// Cards ------------------------------\n\n\t.package-card {\n\t\tpadding: @ui-padding;\n\t\t.meta-controls .status-indicator {\n\t\t\twidth: @ui-padding/4;\n\t\t\t&:before {\n\t\t\t\tcontent: \"\\00a0\"; // fixes 0 height\n\t\t\t}\n\t\t}\n\t}\n\n\n\t// Components ------------------------------\n\n\t.icon::before {\n\t\tcolor: @text-color-subtle;\n\t}\n\n\t.editor-container {\n\t\tmargin: @ui-padding 0;\n\t}\n\n\t.form-control {\n\t\tfont-size: @ui-size*1.25;\n\t\theight: @ui-line-height;\n\t\tpadding-top: 0;\n\t\tpadding-bottom: 0;\n\t}\n\n\t.update-all-button {\n\t\tfont-size: .75em;\n\t}\n\n\t.install-button {\n\t\t.btn-variant(@accent-bg-color);\n\t}\n\n\tinput[type=\"checkbox\"] {\n\t\tbackground-color: @background-color-selected;\n\t\t&:active,\n\t\t&:checked {\n\t\t\tbackground-color: @accent-color;\n\t\t}\n\t\t&:before,\n\t\t&:after {\n\t\t\tbackground-color: @accent-text-color;\n\t\t}\n\t}\n\n\t.search-container .btn {\n\t\tfont-size: @ui-input-size;\n\t}\n\n}\n","digest":"83169623788115c290201ced548017a86c5f3e24"},"node_modules/one-light-ui/styles/sites.less":{"content":"// Site Colors\n\n.ui-site(@num, @color) {\n .ui-site-@{num} {\n background-color: @color;\n }\n}\n\n.ui-site(1, @ui-site-color-1);\n.ui-site(2, @ui-site-color-2);\n.ui-site(3, @ui-site-color-3);\n.ui-site(4, @ui-site-color-4);\n.ui-site(5, @ui-site-color-5);\n","digest":"b27327b73cb57001e574b9d1db332766ac6d1e4e"},"node_modules/one-light-ui/styles/status-bar.less":{"content":"\n@status-bar-height: @ui-tab-height; // same as tabs\n@status-bar-padding: @ui-padding;\n\n.status-bar {\n font-size: @ui-size;\n height: @status-bar-height;\n line-height: @status-bar-height;\n background-color: @level-3-color;\n\n .flexbox-repaint-hack {\n padding: 0; // override default\n }\n\n // underlines should only be used for external links\n a:hover,\n a:focus {\n text-decoration: none;\n cursor: default;\n }\n\n .inline-block {\n margin: 0; // override default\n padding: 0 @status-bar-padding/2;\n vertical-align: top;\n\n &:hover {\n background-color: @level-3-color-hover;\n }\n &:active {\n background-color: @level-3-color-active;\n }\n\n // reset on child inline-block\n .inline-block {\n margin: 0;\n padding: 0;\n }\n }\n\n .status-bar-right {\n .inline-block {\n margin-left: 0; // override default\n }\n }\n .icon {\n vertical-align: middle;\n }\n .icon::before {\n font-size: 1.33333em; // should be 16px with a default of 12px\n \twidth: auto; // use natural width\n line-height: 1;\n height: 1em; // same as line-height\n margin-right: .25em;\n top: auto;\n }\n}\n\n\n// Package overrides -------------------------------\n\n.status-bar.status-bar {\n\n // Read-only -> Remove hover effect\n .is-read-only, // <- use this class in packages\n status-bar-launch-mode,\n status-bar-cursor,\n busy-signal {\n &:hover,\n &:active,\n .inline-block:hover,\n .inline-block:active {\n background-color: transparent;\n }\n }\n\n // Remove underline\n .package-updates-status-view,\n .github-ChangedFilesCount {\n &:hover,\n &:focus {\n text-decoration: none;\n cursor: default;\n }\n }\n}\n","digest":"3ed78884247dbf0dcb19851c5663aae8c5da3169"},"node_modules/one-light-ui/styles/tabs.less":{"content":"\n// Tabs\n\n@tab-border: 1px solid @tab-border-color;\n@title-padding: .66em;\n@icon-padding-top: .5em; // 2.5 (total) - 1.5 (text) / 2\n@icon-padding-right: .5em;\n\n.tab-bar {\n position: relative;\n height: @ui-tab-height;\n box-shadow: inset 0 -1px 0 @tab-border-color;\n background: @tab-bar-background-color;\n overflow-x: auto;\n overflow-y: hidden;\n border-radius: 0;\n\n &::-webkit-scrollbar {\n display: none;\n }\n\n &:empty {\n display: none;\n }\n\n\n // Tab ----------------------\n\n .tab {\n position: relative;\n top: 0;\n padding: 0;\n margin: 0;\n height: inherit;\n font-size: inherit;\n line-height: @ui-tab-height;\n color: @tab-text-color;\n background-color: @tab-background-color;\n box-shadow: inherit;\n border-left: @tab-border;\n &.active {\n color: @tab-text-color-active;\n background-color: @tab-background-color-active;\n box-shadow: none;\n }\n &:first-of-type {\n border-left-color: transparent;\n }\n &:last-of-type {\n // use box-shadow to not take up any space\n box-shadow: inset 0 -1px 0 @tab-border-color, 1px 0 0 @base-border-color;\n }\n &.active:last-of-type {\n box-shadow: 1px 0 0 @base-border-color;\n }\n\n\n // Title ----------------------\n\n .title {\n text-align: center;\n margin: 0 @title-padding;\n }\n\n\n // Icons ----------------------\n\n .title.title:before {\n margin-right: .3em;\n width: auto;\n height: auto;\n line-height: 1;\n font-size: 1.125em;\n vertical-align: -.0625em; // Adjust center for the 0.1em font-size increase\n }\n\n // Close icon ----------------------\n\n .close-icon {\n top: @icon-padding-top;\n right: @icon-padding-right;\n z-index: 2;\n font-size: 1em;\n width: 1.5em;\n height: 1.5em;\n line-height: 1.5;\n text-align: center;\n border-radius: @component-border-radius;\n background-color: inherit;\n overflow: hidden;\n transform: scale(0);\n transition: transform .08s;\n &:hover {\n color: @accent-text-color;\n background-color: @accent-color;\n }\n &:active {\n background-color: fade(@accent-color, 50%);\n }\n &::before {\n z-index: 1;\n font-size: 1.1em;\n vertical-align: -.05em; // Adjust center for the 0.1em font-size increase\n width: auto;\n height: auto;\n pointer-events: none;\n }\n }\n &:hover .close-icon {\n transform: scale(1);\n transition-duration: .16s;\n }\n }\n\n // Modified icon ----------------------\n\n .tab.modified {\n &:hover .close-icon {\n color: @accent-color;\n &:hover {\n color: @accent-bg-text-color;\n }\n }\n &:not(:hover) .close-icon {\n top: @icon-padding-top;\n right: @icon-padding-right;\n width: 1.5em;\n height: 1.5em;\n line-height: 1.5;\n color: @accent-color;\n border-radius: @component-border-radius;\n border: none;\n transform: scale(1);\n &::before {\n content: \"\\f052\";\n display: inline-block;\n }\n }\n }\n\n\n // Tabs in the docks ----------------------\n\n atom-dock & {\n .tab.active {\n background-color: @tool-panel-background-color;\n }\n }\n\n\n // Dragging ----------------------\n\n .tab.is-dragging {\n opacity: .5;\n\n .close-icon,\n &:before {\n visibility: hidden;\n }\n }\n\n .placeholder {\n position: relative;\n pointer-events: none;\n\n // bar\n &:before {\n z-index: 1;\n margin: 0;\n width: 2px;\n height: @ui-tab-height;\n background-color: @accent-color;\n }\n\n // arrow\n &:after {\n z-index: 0;\n top: @ui-tab-height/2;\n margin: -4px 0 0 -3px;\n border-radius: 0;\n border: 4px solid @accent-color;\n transform: rotate(45deg);\n background: transparent;\n }\n\n &:last-child {\n &:before {\n margin-left: -2px;\n }\n &:after {\n transform: none;\n margin-left: -10px;\n border-color: transparent @accent-color transparent transparent;\n }\n }\n }\n\n\n // Overrides ----------------------\n\n // keep tabs same size when active\n .tab,\n .tab.active {\n padding-right: 0;\n .title {\n padding: 0;\n }\n }\n}\n\n\n// Active pane marker --------------\n\natom-pane.active .tab.active:before {\n content: \"\";\n position: absolute;\n pointer-events: none;\n z-index: 2;\n top: 0;\n left: -1px; // cover left border\n bottom: 0;\n width: 2px;\n background: @accent-color;\n}\n\n// hide marker in docks\natom-dock .tab-bar .tab::before {\n display: none;\n}\n\n\n// Custom tabs --------------\n\n.tab-bar .tab.active {\n &[data-type$=\"Editor\"],\n &[data-type$=\"AboutView\"],\n &[data-type$=\"TimecopView\"],\n &[data-type$=\"StyleguideView\"],\n &[data-type=\"MarkdownPreviewView\"] {\n color: @tab-text-color-editor;\n background-color: @tab-background-color-editor; // Match syntax background color\n }\n}\n","digest":"1da2c3a580bb8d3f892a67d378eea1e887c22a64"},"node_modules/one-light-ui/styles/text.less":{"content":"h1,\nh2,\nh3 {\n line-height: 1em;\n margin-bottom: 15px\n}\nh1 { font-size: 2em; }\nh2 { font-size: 1.5em; }\nh3 { font-size: 1.2em; }\n\np {\n line-height: 1.6;\n margin-bottom: 15px;\n}\n\nlabel {\n font-weight: normal;\n}\n\npre {\n box-shadow: none;\n color: @text-color;\n background: @inset-panel-background-color;\n border-radius: @component-border-radius;\n border: none;\n margin: 0;\n}\n\ncode {\n .text(highlight);\n background: @background-color-highlight;\n border-radius: @component-border-radius;\n}\n\n.selected { .text(highlight); }\n\n.text-smaller { font-size: 0.9em; }\n\n.text-subtle { .text(subtle); }\n.text-highlight { .text(highlight); }\n\n.text-error { .text(error); }\n.text-info {\n .text(info);\n &:hover { color: @text-color-info; }\n}\n.text-warning {\n .text(warning);\n &:hover { color: @text-color-warning; }\n}\n.text-success {\n .text(success);\n &:hover { color: @text-color-success; }\n}\n\n.highlight-mixin {\n padding: 1px 4px;\n border-radius: 2px;\n}\n\n.highlight {\n .highlight-mixin();\n font-weight: 700;\n color: @text-color-highlight;\n background-color: @background-color-highlight;\n}\n\n.highlight-color(@name, @background-color) {\n .highlight-@{name} {\n .highlight-mixin();\n font-weight: 500;\n color: white;\n text-shadow: 0 1px 0px hsla(0,0%,0%,.2);\n background-color: @background-color;\n }\n}\n.highlight-color( info, @background-color-info);\n.highlight-color(warning, @background-color-warning);\n.highlight-color( error, @background-color-error);\n.highlight-color(success, @background-color-success);\n\n.results-view .path-details.list-item {\n color: darken(@text-color-highlight, 18%);\n}\n","digest":"38471280be8bb348914ba7bf07bd03405facbd14"},"node_modules/one-light-ui/styles/title-bar.less":{"content":".title-bar {\n height: 22px; // remove 1px since there is no border\n border-bottom: none;\n}\n","digest":"93638036e200a218636d7f1cdb32276c0c04ce0c"},"node_modules/one-light-ui/styles/tooltips.less":{"content":".tooltip {\n white-space: nowrap;\n font-size: @ui-size*1.15;\n\n &.in {\n opacity: 1;\n transition: opacity .12s ease-out;\n }\n\n .tooltip-inner {\n line-height: 1;\n padding: @ui-padding*.5 @ui-padding*.65;\n border-radius: @component-border-radius;\n background-color: @tooltip-background-color;\n color: @tooltip-text-color;\n white-space: nowrap;\n max-width: none;\n }\n\n .keystroke {\n font-size: max(1em, @ui-size*.85);\n padding: .1em .4em;\n margin: 0 @ui-padding*-.35 0 @ui-padding*.25;\n border-radius: max(2px, @component-border-radius / 2);\n color: @tooltip-text-key-color;\n background: @tooltip-background-key-color;\n }\n\n &.top .tooltip-arrow {\n border-top-color: @tooltip-background-color;\n }\n &.top-left .tooltip-arrow {\n border-top-color: @tooltip-background-color;\n }\n &.top-right .tooltip-arrow {\n border-top-color: @tooltip-background-color;\n }\n &.right .tooltip-arrow {\n border-right-color: @tooltip-background-color;\n }\n &.left .tooltip-arrow {\n border-left-color: @tooltip-background-color;\n }\n &.bottom .tooltip-arrow {\n border-bottom-color: @tooltip-background-color;\n }\n &.bottom-left .tooltip-arrow {\n border-bottom-color: @tooltip-background-color;\n }\n &.bottom-right .tooltip-arrow {\n border-bottom-color: @tooltip-background-color;\n }\n}\n","digest":"d04c888a4ae472d7609d5ae9db25e2ded92049cc"},"node_modules/one-light-ui/styles/tree-view.less":{"content":"@tree-view-height: @ui-line-height;\n\n.tree-view {\n font-size: @ui-size;\n background: @tree-view-background-color;\n\n .project-root.project-root {\n &:before {\n height: @ui-tab-height;\n background-clip: padding-box;\n }\n & > .header .name {\n line-height: @ui-tab-height;\n }\n }\n\n .selected:before {\n background: @tree-view-background-selected-color;\n }\n}\n\n.theme-one-dark-ui .tree-view .project-root.project-root::before {\n border-top: 1px solid transparent;\n background-clip: padding-box;\n}\n\n.tree-view-resizer {\n .tree-view-resize-handle {\n width: 8px;\n }\n}\n\n// Variable height, based on ems\n.list-group li:not(.list-nested-item),\n.list-tree li:not(.list-nested-item),\n.list-group li.list-nested-item > .list-item,\n.list-tree li.list-nested-item > .list-item {\n line-height: @tree-view-height;\n}\n\n.list-group .selected::before,\n.list-tree .selected::before {\n height: @tree-view-height;\n}\n\n// icon\n.list-group .icon,\n.list-tree .icon {\n display: inline-block;\n height: inherit;\n &::before {\n top: initial;\n line-height: inherit;\n height: inherit;\n vertical-align: top;\n }\n}\n\n// Arrow icon\n.list-group,\n.list-tree {\n .header.header.header.header::before {\n top: initial;\n line-height: inherit;\n height: inherit;\n vertical-align: top;\n }\n}\n.tree-view .project-root-header.project-root-header.project-root-header.project-root-header::before {\n line-height: 2.5em;\n}\n\n// Active tree-view marker --------------\n\n.tree-view::before {\n content: \"\";\n position: fixed;\n pointer-events: none;\n z-index: 1;\n height: @ui-tab-height;\n width: 2px;\n background: @accent-color;\n opacity: 0;\n transition: opacity .16s;\n}\n\n.tree-view:focus::before {\n opacity: 1;\n transition-duration: .32s;\n}\n","digest":"ad92d3ae03d42561e915df03447e87198f3e400c"},"node_modules/one-light-ui/styles/ui-mixins.less":{"content":"// Pattern matching; ish is cray.\n// http://lesscss.org/#-pattern-matching-and-guard-expressions\n\n.text(normal) {\n font-weight: normal;\n color: @text-color;\n}\n.text(subtle) {\n font-weight: normal;\n color: @text-color-subtle;\n}\n.text(highlight) {\n font-weight: normal;\n color: @text-color-highlight;\n}\n.text(selected) {\n .text(highlight)\n}\n\n.text(info) {\n color: @text-color-info;\n}\n.text(success) {\n color: @text-color-success;\n}\n.text(warning) {\n color: @text-color-warning;\n}\n.text(error) {\n color: @text-color-error;\n}\n\n.focus() {\n outline: none;\n border-color: @accent-color;\n box-shadow: 0 0 0 1px @accent-color;\n}\n","digest":"64440a0c97fef0deb3fdf02973e6f8b131c5339e"},"node_modules/one-light-ui/styles/ui-variables-custom.less":{"content":"\n// ONE light UI variables\n// ----------------------------------------------\n\n@import \"syntax-variables\";\n\n.ui-syntax-color() { @syntax-background-color: hsl(220,1%,98%); } .ui-syntax-color(); // fallback color\n@ui-syntax-color: @syntax-background-color;\n\n// Color guards -----------------\n@ui-s-h: hue(@ui-syntax-color);\n.ui-hue() when (@ui-s-h = 0) { @ui-hue: 220; } // Use blue hue when no saturation\n.ui-hue() when (@ui-s-h > 0) { @ui-hue: @ui-s-h; }\n.ui-hue();\n\n@ui-saturation: min( saturation(@ui-syntax-color), 24%); // max saturation\n@ui-lightness: max( lightness(@ui-syntax-color), 92%); // min lightness\n\n// Main colors -----------------\n@ui-fg: hsl(@ui-hue, @ui-saturation, @ui-lightness - 72%);\n@ui-bg: hsl(@ui-hue, @ui-saturation, @ui-lightness); // normalized @syntax-background-color\n@ui-border: darken(@level-3-color, 6%);\n\n\n\n\n// Custom variables\n// These variables are only used in this theme\n// ----------------------------------------------\n\n@ui-theme-name: one-light-ui;\n\n// Text (Custom) -----------------\n@text-color-faded: fade(@text-color, 30%);\n\n@text-color-added: @text-color-success; // green\n@text-color-ignored: @text-color-subtle; // faded\n@text-color-modified: @text-color-warning; // orange\n@text-color-removed: @text-color-error; // red\n@text-color-renamed: @text-color-info; // blue\n\n\n// Background (Custom) -----------------\n@level-1-color: lighten(@base-background-color, 4%);\n@level-2-color: @base-background-color;\n@level-3-color: darken(@base-background-color, 6%);\n\n@level-3-color-hover: darken(@level-3-color, 6%);\n@level-3-color-active: darken(@level-3-color, 3%);\n\n\n// Accent (Custom) -----------------\n@accent-luma: luma( hsl(@ui-hue, 50%, 50%) ); // get lightness of current hue\n\n// used for marker, inputs (smaller things)\n@accent-color: mix( hsv( @ui-hue, 60%, 60%), hsl( @ui-hue, 100%, 68%), @accent-luma * 2 ); // mix hsv + hsl (favor hsl for dark, hsv for light colors)\n@accent-text-color: contrast(@accent-color, hsl(@ui-hue,100%,16%), #fff, 40% );\n\n// used for button, tooltip (larger things)\n@accent-bg-color: mix( hsv( @ui-hue, 40%, 72%), hsl( @ui-hue, 100%, 66%), @accent-luma * 2 ); // mix hsv + hsl (favor hsl for dark, hsv for light colors)\n@accent-bg-text-color: contrast(@accent-bg-color, hsl(@ui-hue,100%,10%), #fff, 40% );\n\n// used for text only\n@accent-only-text-color: mix( hsv( @ui-hue, 70%, 50%), hsl( @ui-hue, 100%, 60%), @accent-luma * 2 ); // mix hsv + hsl (favor hsl for dark, hsv for light colors)\n\n\n// Components (Custom) -----------------\n@badge-background-color: @background-color-selected;\n\n@button-text-color-selected: @accent-bg-text-color;\n@button-border-color-selected: @accent-color;\n\n@checkbox-background-color: fade(@accent-bg-color, 33%);\n\n@input-background-color-focus: hsl(@ui-hue, 100%, 96%);\n@input-selection-color: mix( hsv( @ui-hue, 33%, 95%), hsl( @ui-hue, 100%, 98%), @accent-luma * 2 ); // mix hsv + hsl (favor hsl for dark, hsv for light colors)\n@input-selection-color-focus: mix( hsv( @ui-hue, 44%, 90%), hsl( @ui-hue, 100%, 94%), @accent-luma * 2 ); // mix hsv + hsl (favor hsl for dark, hsv for light colors)\n\n@overlay-backdrop-color: hsl(@ui-hue, @ui-saturation*0.4, @ui-lightness*0.72);\n@overlay-backdrop-opacity: .8;\n\n@progress-background-color: @accent-color;\n\n@scrollbar-color: darken(@level-3-color, 14%);\n@scrollbar-background-color: @level-3-color; // replaced `transparent` with a solid color to test https://github.com/atom/one-light-ui/issues/4\n@scrollbar-color-editor: contrast(@ui-syntax-color, darken(@ui-syntax-color, 14%), lighten(@ui-syntax-color, 9%) );\n@scrollbar-background-color-editor: @ui-syntax-color;\n\n@tab-text-color: @text-color-subtle;\n@tab-text-color-active: @text-color-highlight;\n@tab-text-color-editor: contrast(@ui-syntax-color, lighten(@ui-syntax-color, 70%), @text-color-highlight );\n@tab-background-color-editor: @ui-syntax-color;\n\n@tree-view-background-selected-color: @background-color-selected;\n\n@tooltip-background-color: @accent-bg-color;\n@tooltip-text-color: @accent-bg-text-color;\n@tooltip-text-key-color: @tooltip-background-color;\n@tooltip-background-key-color: @tooltip-text-color;\n\n\n// Sizes (Custom) -----------------\n\n@ui-size: 1em;\n@ui-input-size: @ui-size*1.15;\n@ui-padding: @ui-size*1.5;\n@ui-padding-pane: @ui-size*.5;\n@ui-padding-icon: @ui-padding/3.3;\n@ui-line-height: @ui-size*2;\n@ui-tab-height: @ui-size*2.5;\n\n\n\n\n\n// Packages variables\n// These variables are used to override packages\n// ----------------------------------------------\n\n@settings-list-background-color: darken(@level-2-color, 3%);\n@theme-config-box-shadow: inset 0 1px 2px hsla(0, 0%, 0%, .2), 0 1px 0 hsla(0, 0%, 100%, .3);\n@theme-config-box-shadow-selected: inset 0 1px 3px hsla(0, 0%, 0%, .2);\n@theme-config-border-selected: hsla(0, 0%, 0%, .5);\n\n\n// Debug\n// Output variables to the top of the UI\n// -------------------------------------\n\n// html:before {\n// content: \"@{variable}\";\n// }\n","digest":"e30b99c7d8f11bca9e9060f4ed25ef7894edd199"},"node_modules/one-light-ui/styles/ui-variables.less":{"content":"\n@import \"ui-variables-custom.less\"; // import colors and custom variables\n\n// ONE light UI variables\n// ----------------------------------------------\n\n// Official variables\n// These variables must be defined in every theme\n// Source: https://github.com/atom/atom/blob/master/static/variables/ui-variables.less\n// ----------------------------------------------\n\n\n// Text -----------------\n@text-color: @ui-fg;\n@text-color-subtle: lighten(@text-color, 30%);\n@text-color-highlight: darken(@text-color, 12%);\n@text-color-selected: darken(@text-color-highlight, 12%);\n\n@text-color-info: hsl(208, 100%, 54%);\n@text-color-success: hsl(132, 60%, 44%);\n@text-color-warning: hsl( 37, 90%, 44%);\n@text-color-error: hsl( 0, 90%, 56%);\n\n\n// Background -----------------\n@background-color-info: hsl(208, 100%, 56%);\n@background-color-success: hsl(132, 52%, 48%);\n@background-color-warning: hsl( 40, 60%, 48%);\n@background-color-error: hsl( 5, 72%, 56%);\n\n@background-color-highlight: darken(@level-3-color, 2%);\n@background-color-selected: darken(@level-3-color, 6%);\n\n@app-background-color: @level-3-color;\n\n\n// Base -----------------\n@base-background-color: @ui-bg;\n@base-border-color: @ui-border;\n\n\n// Components -----------------\n@pane-item-background-color: @base-background-color;\n@pane-item-border-color: @base-border-color;\n\n@input-background-color: @level-1-color;\n@input-border-color: @base-border-color;\n\n@tool-panel-background-color: @level-3-color;\n@tool-panel-border-color: @base-border-color;\n\n@inset-panel-background-color: lighten(@level-2-color, 4%);\n@inset-panel-border-color: fadeout(@base-border-color, 15%);\n\n@panel-heading-background-color: @level-2-color;\n@panel-heading-border-color: @base-border-color;\n\n@overlay-background-color: @level-2-color;\n@overlay-border-color: @base-border-color;\n\n@button-background-color: @level-1-color;\n@button-background-color-hover: darken(@button-background-color, 4%);\n@button-background-color-selected: @accent-bg-color;\n@button-border-color: @base-border-color;\n\n@tab-bar-background-color: @level-3-color;\n@tab-bar-border-color: @base-border-color;\n@tab-background-color: @level-3-color;\n@tab-background-color-active: @level-2-color;\n@tab-border-color: @base-border-color;\n\n@tree-view-background-color: @level-3-color;\n@tree-view-border-color: @base-border-color;\n\n@ui-site-color-1: hsl(208, 100%, 56%); // blue\n@ui-site-color-2: hsl(132, 48%, 48%); // green\n@ui-site-color-3: hsl( 40, 60%, 52%); // orange\n@ui-site-color-4: #D831B0; // pink\n@ui-site-color-5: #EBDD5B; // yellow\n\n\n// Sizes -----------------\n@font-size: 12px;\n@input-font-size: 14px;\n@disclosure-arrow-size: 12px;\n\n@component-padding: 10px;\n@component-icon-padding: 5px;\n@component-icon-size: 16px; // needs to stay 16px to look sharpest\n@component-line-height: 25px;\n@component-border-radius: 3px;\n\n@tab-height: 30px;\n\n\n// Font -----------------\n@font-family: 'BlinkMacSystemFont', 'Lucida Grande', 'Segoe UI', Ubuntu, Cantarell, sans-serif;\n","digest":"0cb76ba5ed3ef48e55e784fca684bf2fad05b68d"},"node_modules/atom-ui/atom-ui.less":{"content":"// Atom UI\n\n// Private! Don't use these in packages.\n// If you need something, feel free to open an issue and it might can be made public\n@import \"styles/private/scaffolding.less\";\n\n@import \"styles/private/alerts.less\";\n@import \"styles/private/close.less\";\n@import \"styles/private/code.less\";\n@import \"styles/private/forms.less\";\n@import \"styles/private/links.less\";\n@import \"styles/private/navs.less\";\n@import \"styles/private/sections.less\";\n@import \"styles/private/tables.less\";\n@import \"styles/private/utilities.less\";\n\n\n// Public components\n// Open the Styleguide to see them in action\n@import \"styles/badges.less\";\n@import \"styles/button-groups.less\";\n@import \"styles/buttons.less\";\n@import \"styles/git-status.less\";\n@import \"styles/icons.less\";\n@import \"styles/inputs.less\";\n@import \"styles/layout.less\";\n@import \"styles/lists.less\";\n@import \"styles/loading.less\";\n@import \"styles/messages.less\";\n@import \"styles/modals.less\";\n@import \"styles/panels.less\";\n@import \"styles/select-list.less\";\n@import \"styles/site-colors.less\";\n@import \"styles/text.less\";\n@import \"styles/tooltip.less\";\n","digest":"f69b9488d6479f3be5c9e4bb947eb6785dd82c66"},"node_modules/atom-ui/styles/badges.less":{"content":"@import \"ui-variables\";\n\n.badge {\n display: inline-block;\n line-height: 1;\n vertical-align: middle;\n font-weight: normal;\n text-align: center;\n white-space: nowrap;\n border-radius: 1em;\n\n &:empty {\n display: none; // Hide when un-used\n }\n\n\n // Color ----------------------\n\n .badge-color( @fg: @text-color-selected;\n @bg: @background-color-selected; ) {\n color: @fg;\n background-color: @bg;\n }\n .badge-color();\n &.badge-info { .badge-color(white, @background-color-info); }\n &.badge-success { .badge-color(white, @background-color-success); }\n &.badge-warning { .badge-color(white, @background-color-warning); }\n &.badge-error { .badge-color(white, @background-color-error); }\n\n\n // Size ----------------------\n\n .badge-size( @size: @font-size; ) {\n @padding: round(@size/4);\n font-size: @size;\n min-width: @size + @padding*2;\n padding: @padding round(@padding*1.5);\n }\n .badge-size(); // default\n\n // Fixed size\n &.badge-large { .badge-size(18px); }\n &.badge-medium { .badge-size(14px); }\n &.badge-small { .badge-size(10px); }\n\n // Flexible size\n // The size changes depending on the parent element\n // Best used for larger sizes, since em's can cause rounding errors\n &.badge-flexible {\n @size: .8em;\n @padding: @size/2;\n font-size: @size;\n min-width: @size + @padding*2;\n padding: @padding @padding*1.5;\n }\n\n\n // Icon ----------------------\n\n &.icon {\n font-size: round(@component-icon-size*0.8);\n padding: @component-icon-padding @component-icon-padding*2;\n }\n\n}\n","digest":"2190c8d1f9a4e6bfe2a763652a857921ac526ded"},"node_modules/atom-ui/styles/button-groups.less":{"content":"@import \"variables/variables\";\n@import \"ui-variables\";\n@import \"mixins/mixins\";\n\n//\n// Button groups\n// --------------------------------------------------\n\n// Make the div behave like a button\n.btn-group,\n.btn-group-vertical {\n position: relative;\n display: inline-block;\n vertical-align: middle; // match .btn alignment given font-size hack above\n > .btn {\n position: relative;\n float: left;\n // Bring the \"active\" button to the front\n &:hover,\n &:focus,\n &:active,\n &.active {\n z-index: 2;\n }\n }\n}\n\n\n// Borders\n// ---------------------------------------------------------\n\n.btn-group > .btn {\n border-left: 1px solid @button-border-color;\n border-right: 1px solid @button-border-color;\n}\n.btn-group > .btn:first-child {\n border-left: none;\n border-top-left-radius: @component-border-radius;\n border-bottom-left-radius: @component-border-radius;\n}\n.btn-group > .btn:last-child,\n.btn-group > .btn.selected:last-child,\n.btn-group > .dropdown-toggle {\n border-right: none;\n border-top-right-radius: @component-border-radius;\n border-bottom-right-radius: @component-border-radius;\n}\n\n// Prevent double borders when buttons are next to each other\n.btn-group {\n .btn + .btn,\n .btn + .btn-group,\n .btn-group + .btn,\n .btn-group + .btn-group {\n margin-left: -1px;\n }\n}\n\n// Optional: Group multiple button groups together for a toolbar\n.btn-toolbar {\n margin-left: -5px; // Offset the first child's margin\n &:extend(.clearfix all);\n\n .btn,\n .btn-group,\n .input-group {\n float: left;\n }\n > .btn,\n > .btn-group,\n > .input-group {\n margin-left: 5px;\n }\n}\n\n.btn-group > .btn:not(:first-child):not(:last-child):not(.dropdown-toggle) {\n border-radius: 0;\n}\n\n// Set corners individual because sometimes a single button can be in a .btn-group and we need :first-child and :last-child to both match\n.btn-group > .btn:first-child {\n margin-left: 0;\n &:not(:last-child):not(.dropdown-toggle) {\n .border-right-radius(0);\n }\n}\n// Need .dropdown-toggle since :last-child doesn't apply given a .dropdown-menu immediately after it\n.btn-group > .btn:last-child:not(:first-child),\n.btn-group > .dropdown-toggle:not(:first-child) {\n .border-left-radius(0);\n}\n\n// Custom edits for including btn-groups within btn-groups (useful for including dropdown buttons within a btn-group)\n.btn-group > .btn-group {\n float: left;\n}\n.btn-group > .btn-group:not(:first-child):not(:last-child) > .btn {\n border-radius: 0;\n}\n.btn-group > .btn-group:first-child:not(:last-child) {\n > .btn:last-child,\n > .dropdown-toggle {\n .border-right-radius(0);\n }\n}\n.btn-group > .btn-group:last-child:not(:first-child) > .btn:first-child {\n .border-left-radius(0);\n}\n\n// On active and open, don't show outline\n.btn-group .dropdown-toggle:active,\n.btn-group.open .dropdown-toggle {\n outline: 0;\n}\n\n\n// Sizing\n//\n// Remix the default button sizing classes into new ones for easier manipulation.\n\n.btn-group-xs > .btn { &:extend(.btn-xs); }\n.btn-group-sm > .btn { &:extend(.btn-sm); }\n.btn-group-lg > .btn { &:extend(.btn-lg); }\n\n\n// Split button dropdowns\n// ----------------------\n\n// Give the line between buttons some depth\n.btn-group > .btn + .dropdown-toggle {\n padding-left: 8px;\n padding-right: 8px;\n}\n.btn-group > .btn-lg + .dropdown-toggle {\n padding-left: 12px;\n padding-right: 12px;\n}\n\n// The clickable button for toggling the menu\n// Remove the gradient and set the same inset shadow as the :active state\n.btn-group.open .dropdown-toggle {\n box-shadow: inset 0 3px 5px rgba(0,0,0,.125);\n\n // Show no shadow for `.btn-link` since it has no other button styles.\n &.btn-link {\n box-shadow: none;\n }\n}\n\n\n// Reposition the caret\n.btn .caret {\n margin-left: 0;\n}\n// Carets in other button sizes\n.btn-lg .caret {\n border-width: @caret-width-large @caret-width-large 0;\n border-bottom-width: 0;\n}\n// Upside down carets for .dropup\n.dropup .btn-lg .caret {\n border-width: 0 @caret-width-large @caret-width-large;\n}\n\n\n// Justified button groups\n// ----------------------\n\n.btn-group-justified {\n display: table;\n width: 100%;\n table-layout: fixed;\n border-collapse: separate;\n > .btn,\n > .btn-group {\n float: none;\n display: table-cell;\n width: 1%;\n }\n > .btn-group .btn {\n width: 100%;\n }\n\n > .btn-group .dropdown-menu {\n left: auto;\n }\n}\n","digest":"bb487c05d50cd0c463b14de9274deb1bb9507ac6"},"node_modules/atom-ui/styles/buttons.less":{"content":"@import \"variables/variables\";\n@import \"ui-variables\";\n@import \"mixins/mixins\";\n\n//\n// Buttons\n// --------------------------------------------------\n\n\n// Base styles\n// --------------------------------------------------\n\n.btn {\n display: inline-block;\n margin-bottom: 0; // For input.btn\n height: @component-line-height + 2px;\n padding: 0 @component-padding;\n font-size: @font-size;\n font-weight: normal;\n line-height: @component-line-height;\n text-align: center;\n vertical-align: middle;\n border: none;\n border-radius: @component-border-radius;\n background-color: @btn-default-bg;\n white-space: nowrap;\n cursor: pointer;\n z-index: 0;\n -webkit-user-select: none;\n\n &,\n &:active,\n &.active {\n &:focus,\n &.focus {\n .tab-focus();\n }\n }\n\n &:hover,\n &:focus,\n &.focus {\n color: @btn-default-color;\n text-decoration: none;\n background-color: @button-background-color-hover;\n }\n\n &:active,\n &.active {\n outline: 0;\n background-image: none;\n box-shadow: inset 0 3px 5px rgba(0,0,0,.125);\n }\n\n &.selected,\n &.selected:hover {\n // we want the selected button to behave like the :hover button; it's on top of the other buttons.\n z-index: 1;\n color: @text-color-selected;\n background-color: @button-background-color-selected;\n }\n\n &.disabled,\n &[disabled],\n fieldset[disabled] & {\n cursor: @cursor-disabled;\n opacity: .65;\n box-shadow: none;\n }\n\n a& {\n &.disabled,\n fieldset[disabled] & {\n pointer-events: none; // Future-proof disabling of clicks on `<a>` elements\n }\n }\n}\n\n\n// Button variants\n// --------------------------------------------------\n\n.button-variant(@color; @background;) {\n color: @color;\n background-color: @background;\n\n &:focus,\n &.focus {\n color: @color;\n background-color: darken(@background, 10%);\n }\n &:hover {\n color: @color;\n background-color: darken(@background, 10%);\n }\n &:active,\n &.active {\n color: @color;\n background-color: darken(@background, 10%);\n\n &:hover,\n &:focus,\n &.focus {\n color: @color;\n background-color: darken(@background, 17%);\n }\n }\n &.selected,\n &.selected:hover {\n // we want the selected button to behave like the :hover button; it's on top of the other buttons.\n z-index: 1;\n background-color: darken(@background, 10%);\n }\n\n &.disabled,\n &[disabled],\n fieldset[disabled] & {\n &:hover,\n &:focus,\n &.focus {\n background-color: @background;\n }\n }\n\n .badge {\n color: @background;\n background-color: @color;\n }\n}\n\n.btn-primary {\n .button-variant(@btn-primary-color; @btn-primary-bg;);\n}\n// Success appears as green\n.btn-success {\n .button-variant(@btn-success-color; @btn-success-bg;);\n}\n// Info appears as blue-green\n.btn-info {\n .button-variant(@btn-info-color; @btn-info-bg;);\n}\n// Warning appears as orange\n.btn-warning {\n .button-variant(@btn-warning-color; @btn-warning-bg;);\n}\n// Danger and error appear as red\n.btn-error {\n .button-variant(@btn-error-color; @btn-error-bg;);\n}\n\n\n// Button Sizes\n// --------------------------------------------------\n\n.btn-xs,\n.btn-group-xs > .btn {\n padding: @component-padding/4 @component-padding/2;\n font-size: @font-size - 2px;\n height: auto;\n line-height: 1.3em;\n &.icon:before {\n font-size: @font-size - 2px;\n }\n}\n.btn-sm,\n.btn-group-sm > .btn {\n padding: @component-padding/4 @component-padding/2;\n height: auto;\n line-height: 1.3em;\n &.icon:before {\n font-size: @font-size + 1px;\n }\n}\n.btn-lg,\n.btn-group-lg > .btn {\n font-size: @font-size + 2px;\n padding: @component-padding - 2px @component-padding + 2px;\n height: auto;\n line-height: 1.3em;\n &.icon:before {\n font-size: @font-size + 6px;\n }\n}\n\n\n// Link button\n// -------------------------\n\n// Make a button look and behave like a link\n.btn-link {\n color: @link-color;\n font-weight: normal;\n border-radius: 0;\n &,\n &:active,\n &.active,\n &[disabled],\n fieldset[disabled] & {\n background-color: transparent;\n box-shadow: none;\n }\n &:hover,\n &:focus {\n color: @link-hover-color;\n text-decoration: @link-hover-decoration;\n background-color: transparent;\n }\n &[disabled],\n fieldset[disabled] & {\n &:hover,\n &:focus {\n color: @btn-link-disabled-color;\n text-decoration: none;\n }\n }\n}\n\n\n// Block button\n// --------------------------------------------------\n\n.btn-block {\n display: block;\n width: 100%;\n}\n\n// Vertically space out multiple block buttons\n.btn-block + .btn-block {\n margin-top: 5px;\n}\n\n// Specificity overrides\ninput[type=\"submit\"],\ninput[type=\"reset\"],\ninput[type=\"button\"] {\n &.btn-block {\n width: 100%;\n }\n}\n\n\n// Icon buttons\n// --------------------------------------------------\n\n.btn.icon {\n &:before {\n width: initial;\n height: initial;\n margin-right: .3125em;\n }\n &:empty:before {\n margin-right: 0;\n }\n}\n\n\n// Button Toolbar\n// --------------------------------------------------\n\n.btn-toolbar {\n > .btn-group + .btn-group,\n > .btn-group + .btn,\n > .btn + .btn {\n float: none;\n display: inline-block;\n margin-left: 0;\n }\n > * {\n margin-right: @component-padding / 2;\n }\n > *:last-child {\n margin-right: 0;\n }\n}\n","digest":"950958d9762691dbebaa846ea0e5aa7afcd719a0"},"node_modules/atom-ui/styles/git-status.less":{"content":"@import \"ui-variables\";\n\n//\n// Git Status\n// --------------------------------------------------\n\n.status {\n &-ignored { color: @text-color-subtle; }\n &-added { color: @text-color-success; }\n &-modified { color: @text-color-warning; }\n &-removed { color: @text-color-error; }\n &-renamed { color: @text-color-info; }\n}\n","digest":"b447ce83f78f01b1fc2e7e9133882cc666559697"},"node_modules/atom-ui/styles/icons.less":{"content":"@import \"ui-variables\";\n\n.icon::before {\n margin-right: @component-icon-padding;\n}\n\na.icon {\n text-decoration: none;\n color: @text-color;\n &:hover{\n color: @text-color-highlight;\n }\n}\n","digest":"441039bd4f65e2ee4d541f3d5667b755cd68d839"},"node_modules/atom-ui/styles/inputs.less":{"content":"@import \"ui-variables\";\n\n@component-size: @component-icon-size; // use for text-less controls like radio, checkboxes etc.\n@component-margin-side: .3em;\n@text-component-height: 2em;\n@component-background-color: mix(@text-color, @base-background-color, 20%);\n\n\n//\n// Overrides\n// -------------------------\n\ninput.input-radio,\ninput.input-checkbox,\ninput.input-toggle {\n margin-top: 0; // Override Bootstrap's 4px\n}\n.input-label {\n margin-bottom: 0;\n}\n\n//\n// Mixins\n// -------------------------\n\n.input-field-mixin() {\n padding: .25em .4em;\n line-height: 1.5; // line-height + padding = @text-component-height\n border-radius: @component-border-radius;\n border: 1px solid @input-border-color;\n background-color: @input-background-color;\n &::-webkit-input-placeholder {\n color: @text-color-subtle;\n }\n &:invalid {\n color: @text-color-error;\n border-color: @background-color-error;\n }\n}\n\n.input-block-mixin() {\n display: block;\n width: 100%;\n}\n\n\n//\n// Checkbox\n// -------------------------\n\n.input-checkbox {\n vertical-align: middle;\n\n & when (@use-custom-controls) {\n -webkit-appearance: none;\n display: inline-block;\n position: relative;\n width: @component-size;\n height: @component-size;\n font-size: inherit;\n border-radius: @component-border-radius;\n background-color: @component-background-color;\n transition: background-color .16s cubic-bezier(0.5, 0.15, 0.2, 1);\n\n &&:focus {\n outline: 0; // TODO: Add it back\n }\n &:active {\n background-color: @background-color-info;\n }\n\n &:before,\n &:after {\n content: \"\";\n position: absolute;\n top: @component-size * .75;\n left: @component-size * .4;\n height: 2px;\n border-radius: 1px;\n background-color: @base-background-color;\n transform-origin: 0 0;\n opacity: 0;\n transition: transform .1s cubic-bezier(0.5, 0.15, 0.2, 1), opacity .1s cubic-bezier(0.5, 0.15, 0.2, 1);\n }\n &:before {\n width: @component-size * .33;\n transform: translate3d(0,0,0) rotate(225deg) scale(0);\n }\n &:after {\n width: @component-size * .66;\n margin: -1px;\n transform: translate3d(0,0,0) rotate(-45deg) scale(0);\n transition-delay: .05s;\n }\n\n &:checked {\n background-color: @background-color-info;\n &:active {\n background-color: @component-background-color;\n }\n &:before {\n opacity: 1;\n transform: translate3d(0,0,0) rotate(225deg) scale(1);\n transition-delay: .05s;\n }\n &:after {\n opacity: 1;\n transform: translate3d(0, 0, 0) rotate(-45deg) scale(1);\n transition-delay: 0;\n }\n }\n\n &:indeterminate {\n background-color: @background-color-info;\n &:active {\n background-color: @component-background-color;\n }\n &:after {\n opacity: 1;\n transform: translate3d(@component-size * -.14, @component-size * -.25, 0) rotate(0deg) scale(1);\n transition-delay: 0;\n }\n }\n }\n}\n\n\n//\n// Color\n// -------------------------\n\n\n.input-color {\n vertical-align: middle;\n\n & when (@use-custom-controls) {\n -webkit-appearance: none;\n padding: 0;\n width: @component-size * 2.5;\n height: @component-size * 2.5;\n border-radius: 50%;\n border: 2px solid @input-border-color;\n background-color: @input-background-color;\n &::-webkit-color-swatch-wrapper { padding: 0; }\n &::-webkit-color-swatch {\n border: 1px solid hsla(0,0%,0%,.1);\n border-radius: 50%;\n transition: transform .16s cubic-bezier(0.5, 0.15, 0.2, 1);\n &:active {\n transition-duration: 0s;\n transform: scale(.9);\n }\n }\n }\n}\n\n\n\n//\n// Label\n// -------------------------\n\n.input-label {\n .input-radio,\n .input-checkbox,\n .input-toggle {\n margin-top: -.25em; // Vertical center (visually) - since most labels are upper case.\n margin-right: @component-margin-side;\n }\n}\n\n\n//\n// Number\n// -------------------------\n\n.input-number {\n vertical-align: middle;\n\n & when (@use-custom-controls) {\n .input-field-mixin();\n position: relative;\n width: auto;\n .platform-darwin & {\n padding-right: 1.2em; // space for the spin button\n &::-webkit-inner-spin-button {\n -webkit-appearance: menulist-button;\n position: absolute;\n top: 1px;\n bottom: 1px;\n right: 1px;\n width: calc(.6em ~'+' 9px); // magic numbers, OMG!\n outline: 1px solid @input-background-color;\n outline-offset: -1px; // reduces border radius (that can't be changed)\n border-right: .2em solid @background-color-highlight; // a bit more padding\n background-color: @background-color-highlight;\n transition: transform .16s cubic-bezier(0.5, 0.15, 0.2, 1);\n &:active {\n transform: scale(.9);\n transition-duration: 0s;\n }\n }\n }\n }\n}\n\n\n//\n// Radio\n// -------------------------\n\n.input-radio {\n vertical-align: middle;\n\n & when (@use-custom-controls) {\n -webkit-appearance: none;\n display: inline-block;\n position: relative;\n width: @component-size;\n height: @component-size;\n font-size: inherit;\n border-radius: 50%;\n background-color: @component-background-color;\n transition: background-color .16s cubic-bezier(0.5, 0.15, 0.2, 1);\n\n &:before {\n content: \"\";\n position: absolute;\n width: inherit;\n height: inherit;\n border-radius: inherit;\n border: @component-size/3 solid transparent;\n background-clip: content-box;\n background-color: @base-background-color;\n transform: scale(0);\n transition: transform .1s cubic-bezier(0.5, 0.15, 0.2, 1);\n }\n &&:focus {\n outline: none;\n }\n &:active {\n background-color: @background-color-info;\n }\n &:checked {\n background-color: @background-color-info;\n &:before {\n transform: scale(1);\n }\n }\n }\n}\n\n\n//\n// Range (Slider)\n// -------------------------\n\n.input-range {\n & when (@use-custom-controls) {\n -webkit-appearance: none;\n margin: @component-padding 0;\n height: 4px;\n border-radius: @component-border-radius;\n background-color: @component-background-color;\n &::-webkit-slider-thumb {\n -webkit-appearance: none;\n width: @component-size;\n height: @component-size;\n border-radius: 50%;\n background-color: @background-color-info;\n transition: transform .16s;\n &:active {\n transition-duration: 0s;\n transform: scale(.9);\n }\n }\n }\n}\n\n\n//\n// Search\n// -------------------------\n\n.input-search {\n .input-block-mixin();\n &&::-webkit-search-cancel-button {\n -webkit-appearance: searchfield-cancel-button;\n }\n\n & when (@use-custom-controls) {\n .input-field-mixin();\n }\n}\n\n\n//\n// Select\n// -------------------------\n\n.input-select {\n vertical-align: middle;\n\n & when (@use-custom-controls) {\n height: calc(@text-component-height ~'+' 2px); // + 2px? Magic!\n border-radius: @component-border-radius;\n border: 1px solid @button-border-color;\n background-color: @button-background-color;\n }\n}\n\n\n//\n// Text\n// -------------------------\n\n.input-text {\n .input-block-mixin();\n\n & when (@use-custom-controls) {\n .input-field-mixin();\n }\n}\n\n\n//\n// Text Area\n// -------------------------\n\n.input-textarea {\n .input-block-mixin();\n\n & when (@use-custom-controls) {\n .input-field-mixin();\n }\n}\n\n\n//\n// Toggle\n// -------------------------\n\n.input-toggle {\n & when (@use-custom-controls) {\n -webkit-appearance: none;\n display: inline-block;\n position: relative;\n font-size: inherit;\n width: @component-size * 2;\n height: @component-size;\n vertical-align: middle;\n border-radius: 2em;\n background-color: @component-background-color;\n transition: background-color .2s cubic-bezier(0.5, 0.15, 0.2, 1);\n\n &&:focus {\n outline: 0;\n }\n &:checked {\n background-color: @background-color-info;\n }\n\n // Thumb\n &:before {\n content: \"\";\n position: absolute;\n width: @component-size;\n height: @component-size;\n border-radius: inherit;\n border: @component-size/4 solid transparent;\n background-clip: content-box;\n background-color: @base-background-color;\n transition: transform .2s cubic-bezier(0.5, 0.15, 0.2, 1);\n }\n &:active:before {\n opacity: .5;\n }\n &:checked:before {\n transform: translate3d(100%, 0, 0);\n }\n }\n}\n","digest":"c43b90a763c953cf7f351d7183515e841f36c0fe"},"node_modules/atom-ui/styles/layout.less":{"content":"@import \"ui-variables\";\n@import \"mixins/mixins\";\n\n.padded {\n padding: @component-padding;\n}\n\n// Blocks\n\n.center-block {\n display: block;\n margin-left: auto;\n margin-right: auto;\n}\n\n// Must be div.block so as not to affect syntax highlighting.\nul.block,\ndiv.block {\n margin-bottom: @component-padding;\n}\ndiv > ul.block:last-child,\ndiv > div.block:last-child {\n margin-bottom: 0;\n}\n\n// Inline Blocks\n\n.inline-block,\n.inline-block-tight {\n display: inline-block;\n vertical-align: middle;\n}\n.inline-block {\n margin-right: @component-padding;\n}\n.inline-block-tight {\n margin-right: @component-padding/2;\n}\ndiv > .inline-block:last-child,\ndiv > .inline-block-tight:last-child {\n margin-right: 0;\n}\n\n.inline-block .inline-block {\n vertical-align: top;\n}\n\n// Centering\n// -------------------------\n\n.pull-center {\n margin-left: auto;\n margin-right: auto;\n}\n\n// Floats\n// -------------------------\n\n// Use left margin when it's in a float: right element.\n// Sets the margin correctly when inline blocks are hidden and shown.\n.pull-right {\n float: right !important;\n\n .inline-block {\n margin-right: 0;\n margin-left: @component-padding;\n }\n .inline-block-tight {\n margin-right: 0;\n margin-left: @component-padding/2;\n }\n\n > .inline-block:first-child,\n > .inline-block-tight:first-child {\n margin-left: 0;\n }\n}\n\n.pull-left {\n float: left !important;\n}\n\n.clearfix {\n .clearfix();\n}\n","digest":"8abf0895a6d88f60a8fb1e7ecba0b217b7526aef"},"node_modules/atom-ui/styles/lists.less":{"content":"@import \"variables/variables\";\n@import \"ui-variables\";\n@import \"mixins/mixins\";\n\n@import \"octicon-mixins\";\n\n//\n// List options\n// --------------------------------------------------\n\n// Unstyled keeps list items block level, just removes default browser padding and list-style\n.list-unstyled {\n padding-left: 0;\n list-style: none;\n}\n\n// Inline turns list items into inline-block\n.list-inline {\n .list-unstyled();\n margin-left: -5px;\n\n > li {\n display: inline-block;\n padding-left: 5px;\n padding-right: 5px;\n }\n}\n\n\n//\n// List groups\n// --------------------------------------------------\n\n// Mixins\n\n.list-group-item-variant(@state; @background; @color) {\n .list-group-item-@{state} {\n color: @color;\n background-color: @background;\n\n a&,\n button& {\n color: @color;\n\n .list-group-item-heading {\n color: inherit;\n }\n\n &:hover,\n &:focus {\n color: @color;\n background-color: darken(@background, 5%);\n }\n &.active,\n &.active:hover,\n &.active:focus {\n color: #fff;\n background-color: @color;\n border-color: @color;\n }\n }\n }\n}\n\n\n\n// Individual list items\n//\n// Use on `li`s or `div`s within the `.list-group` parent.\n\n.list-group-item {\n position: relative;\n display: block;\n padding: 10px 15px;\n // Place the border on the list items and negative margin up for better styling\n margin-bottom: -1px;\n background-color: @list-group-bg;\n border: 1px solid @list-group-border;\n\n // Round the first and last items\n &:first-child {\n .border-top-radius(@list-group-border-radius);\n }\n &:last-child {\n margin-bottom: 0;\n .border-bottom-radius(@list-group-border-radius);\n }\n}\n\n\n// Interactive list items\n//\n// Use anchor or button elements instead of `li`s or `div`s to create interactive items.\n// Includes an extra `.active` modifier class for showing selected items.\n\na.list-group-item,\nbutton.list-group-item {\n color: @list-group-link-color;\n\n .list-group-item-heading {\n color: @list-group-link-heading-color;\n }\n\n // Hover state\n &:hover,\n &:focus {\n text-decoration: none;\n color: @list-group-link-hover-color;\n background-color: @list-group-hover-bg;\n }\n}\n\nbutton.list-group-item {\n width: 100%;\n text-align: left;\n}\n\n.list-group-item {\n // Disabled state\n &.disabled,\n &.disabled:hover,\n &.disabled:focus {\n background-color: @list-group-disabled-bg;\n color: @list-group-disabled-color;\n cursor: @cursor-disabled;\n\n // Force color to inherit for custom content\n .list-group-item-heading {\n color: inherit;\n }\n .list-group-item-text {\n color: @list-group-disabled-text-color;\n }\n }\n\n // Active class on item itself, not parent\n &.active,\n &.active:hover,\n &.active:focus {\n z-index: 2; // Place active items above their siblings for proper border styling\n color: @list-group-active-color;\n background-color: @list-group-active-bg;\n border-color: @list-group-active-border;\n\n // Force color to inherit for custom content\n .list-group-item-heading,\n .list-group-item-heading > small,\n .list-group-item-heading > .small {\n color: inherit;\n }\n .list-group-item-text {\n color: @list-group-active-text-color;\n }\n }\n}\n\n\n// Contextual variants\n//\n// Add modifier classes to change text and background color on individual items.\n// Organizationally, this must come after the `:hover` states.\n\n.list-group-item-variant(success; @state-success-bg; @state-success-text);\n.list-group-item-variant(info; @state-info-bg; @state-info-text);\n.list-group-item-variant(warning; @state-warning-bg; @state-warning-text);\n.list-group-item-variant(danger; @state-danger-bg; @state-danger-text);\n\n\n// Custom content options\n//\n// Extra classes for creating well-formatted content within `.list-group-item`s.\n\n.list-group-item-heading {\n margin-top: 0;\n margin-bottom: 5px;\n}\n.list-group-item-text {\n margin-bottom: 0;\n line-height: 1.3;\n}\n\n\n\n// This is a bootstrap override\n// ---------------------------------------------\n\n.list-group,\n.list-group .list-group-item {\n background-color: transparent;\n border: none;\n padding: 0;\n margin: 0;\n position: static;\n}\n\n.list-group,\n.list-tree {\n margin: 0;\n padding: 0;\n list-style: none;\n cursor: default;\n\n li:not(.list-nested-item),\n li.list-nested-item > .list-item {\n line-height: @component-line-height;\n text-wrap: none;\n white-space: nowrap;\n }\n\n // The background highlight uses ::before rather than the item background so\n // it can span the entire width of the parent container rather than the size\n // of the list item.\n .selected::before {\n content: '';\n background-color: @background-color-selected;\n position: absolute;\n left: 0;\n right: 0;\n height: @component-line-height;\n }\n\n // Make sure the background highlight is below the content.\n .selected > * {\n position: relative;\n }\n\n .icon::before {\n margin-right: @component-icon-padding;\n position: relative;\n top: 1px;\n }\n .no-icon {\n padding-left: @component-icon-padding + @component-icon-size;\n }\n}\n\n\n\n//\n// List Tree\n// --------------------------------------------------\n\n// Handle indentation of the tree. Assume disclosure arrows.\n\n.list-tree {\n .list-nested-item > .list-tree > li,\n .list-nested-item > .list-group > li {\n padding-left: @component-icon-size + @component-icon-padding;\n }\n\n &.has-collapsable-children {\n @disclosure-arrow-padding: @disclosure-arrow-size + @component-icon-padding;\n li.list-item {\n margin-left: @disclosure-arrow-padding;\n }\n\n .list-nested-item.collapsed > .list-group,\n .list-nested-item.collapsed > .list-tree {\n display: none;\n }\n\n // Nested items always get disclosure arrows\n .list-nested-item > .list-item {\n .octicon(chevron-down, @disclosure-arrow-size);\n &::before{\n position: relative;\n top: -1px;\n margin-right: @component-icon-padding;\n }\n }\n .list-nested-item.collapsed > .list-item {\n .octicon(chevron-right, @disclosure-arrow-size);\n &::before{\n left: 1px;\n }\n }\n\n .list-nested-item > .list-tree > li,\n .list-nested-item > .list-group > li {\n padding-left: @disclosure-arrow-padding;\n }\n\n // You want a subtree to be flat -- no collapsable children\n .has-flat-children,\n &.has-flat-children {\n li.list-item {\n margin-left: 0;\n }\n }\n }\n}\n","digest":"3d35a95a6e5d74bb2cddfe5b704d89fc757ca962"},"node_modules/atom-ui/styles/loading.less":{"content":"//\n// Loading\n// --------------------------------------------------\n\n.loading-spinner(@size) {\n display: block;\n width: @size;\n height: @size;\n background-image: url(images/octocat-spinner-128.gif);\n background-repeat: no-repeat;\n background-size: cover;\n\n &.inline-block {\n display: inline-block;\n }\n}\n\n.loading-spinner-tiny { .loading-spinner(16px); }\n.loading-spinner-small { .loading-spinner(32px); }\n.loading-spinner-medium { .loading-spinner(48px); }\n.loading-spinner-large { .loading-spinner(64px); }\n","digest":"d7fac726ef76e0c8ba33629fc4551f97748bf83f"},"node_modules/atom-ui/styles/messages.less":{"content":"@import \"ui-variables\";\n\n.info-messages,\n.error-messages {\n margin: 0;\n padding: 0;\n list-style: none;\n}\n\n.error-messages {\n color: @text-color-error;\n}\n\nul.background-message {\n font-size: @font-size * 3;\n\n margin: 0;\n padding: 0;\n\n li {\n margin: 0;\n padding: 0;\n list-style: none;\n }\n\n &.centered {\n display: flex;\n position: absolute;\n top: 0;\n left: 0;\n right: 0;\n bottom: 0;\n\n align-items: center;\n text-align: center;\n\n li {\n width: 100%;\n }\n }\n}\n","digest":"b549523e13f2ad116c02a6dfb42db8e1e4891e43"},"node_modules/atom-ui/styles/mixins/mixins.less":{"content":"\n// Core mixins\n// ----------------------------------------\n\n// Focus\n//\n.tab-focus() {\n outline: 2px auto @text-color-info;\n outline-offset: -2px;\n}\n\n\n// Border-radius\n//\n.border-top-radius(@radius) {\n border-top-right-radius: @radius;\n border-top-left-radius: @radius;\n}\n.border-right-radius(@radius) {\n border-bottom-right-radius: @radius;\n border-top-right-radius: @radius;\n}\n.border-bottom-radius(@radius) {\n border-bottom-right-radius: @radius;\n border-bottom-left-radius: @radius;\n}\n.border-left-radius(@radius) {\n border-bottom-left-radius: @radius;\n border-top-left-radius: @radius;\n}\n\n\n// Clearfix\n//\n// For modern browsers\n// 1. The space content is one way to avoid an Opera bug when the\n// contenteditable attribute is included anywhere else in the document.\n// Otherwise it causes space to appear at the top and bottom of elements\n// that are clearfixed.\n// 2. The use of `table` rather than `block` is only necessary if using\n// `:before` to contain the top-margins of child elements.\n//\n// Source: http://nicolasgallagher.com/micro-clearfix-hack/\n\n.clearfix() {\n &:before,\n &:after {\n content: \" \"; // 1\n display: table; // 2\n }\n &:after {\n clear: both;\n }\n}\n\n\n// CSS image replacement\n//\n// Heads up! v3 launched with only `.hide-text()`, but per our pattern for\n// mixins being reused as classes with the same name, this doesn't hold up. As\n// of v3.0.1 we have added `.text-hide()` and deprecated `.hide-text()`.\n//\n// Source: https://github.com/h5bp/html5-boilerplate/commit/aa0396eae757\n\n// Deprecated as of v3.0.1 (has been removed in v4)\n.hide-text() {\n font: ~\"0/0\" a;\n color: transparent;\n text-shadow: none;\n background-color: transparent;\n border: 0;\n}\n\n// New mixin to use as of v3.0.1\n.text-hide() {\n .hide-text();\n}\n\n\n// Text overflow\n// Requires inline-block or block for proper styling\n\n.text-overflow() {\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n}\n","digest":"9ebec64c3f38543a74bae00d43a3e168d3e3673b"},"node_modules/atom-ui/styles/modals.less":{"content":"\n//\n// Modals\n// --------------------------------------------------\n\n.overlay, // deprecated .overlay\natom-panel.modal {\n position: absolute;\n display: block;\n top: 0;\n left: 50%;\n width: 500px;\n margin-left: -250px;\n z-index: 9999;\n box-sizing: border-box;\n border-top: none;\n border-top-left-radius: 0;\n border-top-right-radius: 0;\n\n color: @text-color;\n background-color: @overlay-background-color;\n\n padding: 10px;\n\n // shrink modals when window gets narrow\n @media (max-width: 500px) {\n & {\n width: 100%;\n left: 0;\n margin-left: 0;\n }\n }\n\n h1 {\n margin-top: 0;\n color: @text-color-highlight;\n font-size: 1.6em;\n font-weight: bold;\n }\n\n h2 {\n font-size: 1.3em;\n }\n\n atom-text-editor[mini] {\n margin-bottom: 10px;\n }\n\n .message {\n padding-top: 5px;\n font-size: 11px;\n }\n\n &.mini {\n width: 200px;\n margin-left: -100px;\n font-size: 12px;\n }\n}\n\n\n// Deprecated: overlay, from-top, from-bottom, floating\n// --------------------------------------------------\n// TODO: Remove these!\n\n.overlay.from-top {\n top: 0;\n border-top: none;\n border-top-left-radius: 0;\n border-top-right-radius: 0;\n}\n\n.overlay.from-bottom {\n bottom: 0;\n border-bottom: none;\n border-bottom-left-radius: 0;\n border-bottom-right-radius: 0;\n}\n\n.overlay.floating {\n left: auto;\n}\n","digest":"4eb1b3e5c96df8baaee12ec1d0440c5745f9daba"},"node_modules/atom-ui/styles/panels.less":{"content":"//\n// Panels\n// --------------------------------------------------\n\n.tool-panel, // deprecated: .tool-panel\n.panel, // deprecated: .panel\natom-panel {\n background-color: @tool-panel-background-color;\n}\n\n.inset-panel {\n border-radius: @component-border-radius;\n background-color: @inset-panel-background-color;\n}\n\n.panel-heading {\n margin: 0;\n padding: @component-padding;\n border-radius: 0;\n font-size: @font-size;\n line-height: 1;\n background-color: @panel-heading-background-color;\n\n .inset-panel & {\n border-radius: @component-border-radius @component-border-radius 0 0;\n }\n\n .btn {\n @btn-height: @component-line-height - 5px;\n height: @btn-height;\n line-height: @btn-height;\n font-size: @font-size - 2px;\n position: relative;\n top: -5px;\n }\n}\n","digest":"53e1680a8654d881be4c5e09d473dc4039702a77"},"node_modules/atom-ui/styles/private/alerts.less":{"content":"@import \"../variables/variables\";\n@import \"ui-variables\";\n\n//\n// Alerts\n// --------------------------------------------------\n\n//## Define alert colors, border radius, and padding.\n\n@alert-padding: 15px;\n@alert-border-radius: @border-radius-base;\n@alert-link-font-weight: bold;\n\n@alert-success-bg: @state-success-bg;\n@alert-success-text: @state-success-text;\n@alert-success-border: @state-success-border;\n\n@alert-info-bg: @state-info-bg;\n@alert-info-text: @state-info-text;\n@alert-info-border: @state-info-border;\n\n@alert-warning-bg: @state-warning-bg;\n@alert-warning-text: @state-warning-text;\n@alert-warning-border: @state-warning-border;\n\n@alert-danger-bg: @state-danger-bg;\n@alert-danger-text: @state-danger-text;\n@alert-danger-border: @state-danger-border;\n\n\n//## variant mixin\n\n.alert-variant(@background; @border; @text-color) {\n background-color: @background;\n border-color: @border;\n color: @text-color;\n\n hr {\n border-top-color: darken(@border, 5%);\n }\n .alert-link {\n color: darken(@text-color, 10%);\n }\n}\n\n\n// Base styles\n// -------------------------\n\n.alert {\n padding: @alert-padding;\n margin-bottom: @line-height-computed;\n border: 1px solid transparent;\n border-radius: @alert-border-radius;\n\n // Headings for larger alerts\n h4 {\n margin-top: 0;\n // Specified for the h4 to prevent conflicts of changing @headings-color\n color: inherit;\n }\n\n // Provide class for links that match alerts\n .alert-link {\n font-weight: @alert-link-font-weight;\n }\n\n // Improve alignment and spacing of inner content\n > p,\n > ul {\n margin-bottom: 0;\n }\n\n > p + p {\n margin-top: 5px;\n }\n}\n\n// Dismissible alerts\n//\n// Expand the right padding and account for the close button's positioning.\n\n.alert-dismissable, // The misspelled .alert-dismissable was deprecated in 3.2.0.\n.alert-dismissible {\n padding-right: (@alert-padding + 20);\n\n // Adjust close link position\n .close {\n position: relative;\n top: -2px;\n right: -21px;\n color: inherit;\n }\n}\n\n// Alternate styles\n//\n// Generate contextual modifier classes for colorizing the alert.\n\n.alert-success {\n .alert-variant(@alert-success-bg; @alert-success-border; @alert-success-text);\n}\n\n.alert-info {\n .alert-variant(@alert-info-bg; @alert-info-border; @alert-info-text);\n}\n\n.alert-warning {\n .alert-variant(@alert-warning-bg; @alert-warning-border; @alert-warning-text);\n}\n\n.alert-danger {\n .alert-variant(@alert-danger-bg; @alert-danger-border; @alert-danger-text);\n}\n","digest":"9419c3622f08e1c99a5eaa25196791f0f129219e"},"node_modules/atom-ui/styles/private/close.less":{"content":"//\n// Close icon (deprecated)\n// --------------------------------------------------\n\n.close {\n @font-size-base: 14px;\n @close-font-weight: bold;\n @close-color: #000;\n @close-text-shadow: 0 1px 0 #fff;\n\n float: right;\n font-size: (@font-size-base * 1.5);\n font-weight: @close-font-weight;\n line-height: 1;\n color: @close-color;\n text-shadow: @close-text-shadow;\n opacity: .2;\n\n &:hover,\n &:focus {\n color: @close-color;\n text-decoration: none;\n cursor: pointer;\n opacity: .5;\n }\n\n // Additional properties for button version\n // iOS requires the button element instead of an anchor tag.\n // If you want the anchor version, it requires `href=\"#\"`.\n // See https://developer.mozilla.org/en-US/docs/Web/Events/click#Safari_Mobile\n button& {\n padding: 0;\n cursor: pointer;\n background: transparent;\n border: 0;\n -webkit-appearance: none;\n }\n}\n","digest":"cea1d83a2d61e483c5e943877738d5c230ec2c1c"},"node_modules/atom-ui/styles/private/code.less":{"content":"@import \"../variables/variables\";\n@import \"ui-variables\";\n\n//\n// Code (inline and block)\n// --------------------------------------------------\n\n@code-color: @text-color-highlight;\n@code-bg: @background-color-highlight;\n\n@pre-color: @code-color;\n@pre-bg: @code-bg;\n@pre-border-color: @base-border-color;\n@pre-scrollable-max-height: 340px;\n\n// Inline and block code styles\ncode,\nkbd,\npre,\nsamp {\n font-family: @font-family-monospace;\n}\n\n// Inline code\ncode {\n padding: 2px 4px;\n font-size: 90%;\n color: @code-color;\n background-color: @code-bg;\n border-radius: @border-radius-base;\n}\n\n// User input typically entered via keyboard\nkbd {\n padding: 2px 4px;\n font-size: 90%;\n color: @code-color;\n background-color: @code-bg;\n border-radius: @border-radius-small;\n\n kbd {\n padding: 0;\n font-size: 100%;\n font-weight: bold;\n }\n}\n\n// Blocks of code\npre {\n display: block;\n padding: ((@line-height-computed - 1) / 2);\n margin: 0 0 (@line-height-computed / 2);\n font-size: (@font-size-base - 1); // 14px to 13px\n line-height: @line-height-base;\n word-break: break-all;\n word-wrap: break-word;\n color: @pre-color;\n background-color: @pre-bg;\n border: 1px solid @pre-border-color;\n border-radius: @border-radius-base;\n\n // Account for some code outputs that place code tags in pre tags\n code {\n padding: 0;\n font-size: inherit;\n color: inherit;\n white-space: pre-wrap;\n background-color: transparent;\n border-radius: 0;\n }\n}\n\n// Enable scrollable blocks of code\n.pre-scrollable {\n max-height: @pre-scrollable-max-height;\n overflow-y: scroll;\n}\n","digest":"117b7c504d7d217641262f1e6ffc95a850270333"},"node_modules/atom-ui/styles/private/forms.less":{"content":"@import \"../variables/variables\";\n@import \"ui-variables\";\n@import \"../mixins/mixins\";\n\n//\n// Forms\n// --------------------------------------------------\n\n\n@input-bg: #fff; //** `<input>` background color\n@input-bg-disabled: @gray-lighter; //** `<input disabled>` background color\n@input-color: @gray; //** Text color for `<input>`s\n@input-border: #ccc; //** `<input>` border color\n\n// TODO: Rename `@input-border-radius` to `@input-border-radius-base` in v4\n//** Default `.form-control` border radius\n// This has no effect on `<select>`s in some browsers, due to the limited stylability of `<select>`s in CSS.\n@input-border-radius: @border-radius-base; //** Large `.form-control` border radius\n@input-border-radius-large: @border-radius-large; //** Small `.form-control` border radius\n@input-border-radius-small: @border-radius-small;\n@input-border-focus: #66afe9; //** Border color for inputs on focus\n@input-color-placeholder: #999; //** Placeholder text color\n@input-height-base: (@line-height-computed + (@padding-base-vertical * 2) + 2); //** Default `.form-control` height\n@input-height-large: (ceil(@font-size-large * @line-height-large) + (@padding-large-vertical * 2) + 2); //** Large `.form-control` height\n@input-height-small: (floor(@font-size-small * @line-height-small) + (@padding-small-vertical * 2) + 2); //** Small `.form-control` height\n\n@form-group-margin-bottom: 15px; //** `.form-group` margin\n\n@legend-color: @gray-dark;\n@legend-border-color: #e5e5e5;\n\n@input-group-addon-bg: @gray-lighter; //** Background color for textual input addons\n@input-group-addon-border-color: @input-border; //** Border color for textual input addons\n\n@cursor-disabled: not-allowed; //** Disabled cursor for form controls and buttons.\n\n@grid-gutter-width: 30px; //** Padding between columns. Gets divided in half for the left and right.\n\n\n// Form validation states\n//\n// Used in forms.less to generate the form validation CSS for warnings, errors,\n// and successes.\n\n.form-control-validation(@text-color: #555; @border-color: #ccc; @background-color: #f5f5f5) {\n // Color the label and help text\n .help-block,\n .control-label,\n .radio,\n .checkbox,\n .radio-inline,\n .checkbox-inline,\n &.radio label,\n &.checkbox label,\n &.radio-inline label,\n &.checkbox-inline label {\n color: @text-color;\n }\n // Set the border and box shadow on specific inputs to match\n .form-control {\n border-color: @border-color;\n box-shadow: inset 0 1px 1px rgba(0,0,0,.075); // Redeclare so transitions work\n &:focus {\n border-color: darken(@border-color, 10%);\n box-shadow: inset 0 1px 1px rgba(0,0,0,.075), 0 0 6px lighten(@border-color, 20%);\n }\n }\n // Set validation states also for addons\n .input-group-addon {\n color: @text-color;\n border-color: @border-color;\n background-color: @background-color;\n }\n // Optional feedback icon\n .form-control-feedback {\n color: @text-color;\n }\n}\n\n\n// Form control focus state\n//\n// Generate a customized focus state and for any input with the specified color,\n// which defaults to the `@input-border-focus` variable.\n//\n// We highly encourage you to not customize the default value, but instead use\n// this to tweak colors on an as-needed basis. This aesthetic change is based on\n// WebKit's default styles, but applicable to a wider range of browsers. Its\n// usability and accessibility should be taken into account with any change.\n//\n// Example usage: change the default blue border and shadow to white for better\n// contrast against a dark gray background.\n.form-control-focus(@color: @input-border-focus) {\n @color-rgba: rgba(red(@color), green(@color), blue(@color), .6);\n &:focus {\n border-color: @color;\n outline: 0;\n box-shadow: inset 0 1px 1px rgba(0,0,0,.075), 0 0 8px @color-rgba;\n }\n}\n\n// Form control sizing\n//\n// Relative text size, padding, and border-radii changes for form controls. For\n// horizontal sizing, wrap controls in the predefined grid classes. `<select>`\n// element gets special love because it's special, and that's a fact!\n.input-size(@input-height; @padding-vertical; @padding-horizontal; @font-size; @line-height; @border-radius) {\n height: @input-height;\n padding: @padding-vertical @padding-horizontal;\n font-size: @font-size;\n line-height: @line-height;\n border-radius: @border-radius;\n\n select& {\n height: @input-height;\n line-height: @input-height;\n }\n\n textarea&,\n select[multiple]& {\n height: auto;\n }\n}\n\n// Placeholder text\n.placeholder(@color: @input-color-placeholder) {\n &::-webkit-input-placeholder { color: @color; } // Safari and Chrome\n}\n\n// Creates a wrapper for a series of columns\n.make-row(@gutter: @grid-gutter-width) {\n margin-left: ceil((@gutter / -2));\n margin-right: floor((@gutter / -2));\n &:extend(.clearfix all);\n}\n\n\n// -----------------------------------------------------\n\n\n// Normalize non-controls\n//\n// Restyle and baseline non-control form elements.\n\nfieldset {\n padding: 0;\n margin: 0;\n border: 0;\n // Chrome and Firefox set a `min-width: min-content;` on fieldsets,\n // so we reset that to ensure it behaves more like a standard block element.\n // See https://github.com/twbs/bootstrap/issues/12359.\n min-width: 0;\n}\n\nlegend {\n display: block;\n width: 100%;\n padding: 0;\n margin-bottom: @line-height-computed;\n font-size: (@font-size-base * 1.5);\n line-height: inherit;\n color: @legend-color;\n border: 0;\n border-bottom: 1px solid @legend-border-color;\n}\n\nlabel {\n display: inline-block;\n max-width: 100%; // Force IE8 to wrap long content (see https://github.com/twbs/bootstrap/issues/13141)\n margin-bottom: 5px;\n font-weight: bold;\n}\n\n\n// Normalize form controls\n//\n// While most of our form styles require extra classes, some basic normalization\n// is required to ensure optimum display with or without those classes to better\n// address browser inconsistencies.\n\n// Override content-box in Normalize (* isn't specific enough)\ninput[type=\"search\"] {\n box-sizing: border-box;\n}\n\n// Position radios and checkboxes better\ninput[type=\"radio\"],\ninput[type=\"checkbox\"] {\n margin: 4px 0 0;\n margin-top: 1px \\9; // IE8-9\n line-height: normal;\n}\n\ninput[type=\"file\"] {\n display: block;\n}\n\n// Make range inputs behave like textual form controls\ninput[type=\"range\"] {\n display: block;\n width: 100%;\n}\n\n// Make multiple select elements height not fixed\nselect[multiple],\nselect[size] {\n height: auto;\n}\n\n// Focus for file, radio, and checkbox\ninput[type=\"file\"]:focus,\ninput[type=\"radio\"]:focus,\ninput[type=\"checkbox\"]:focus {\n .tab-focus();\n}\n\n// Adjust output element\noutput {\n display: block;\n padding-top: (@padding-base-vertical + 1);\n font-size: @font-size-base;\n line-height: @line-height-base;\n color: @input-color;\n}\n\n\n// Common form controls\n//\n// Shared size and type resets for form controls. Apply `.form-control` to any\n// of the following form controls:\n//\n// select\n// textarea\n// input[type=\"text\"]\n// input[type=\"password\"]\n// input[type=\"datetime\"]\n// input[type=\"datetime-local\"]\n// input[type=\"date\"]\n// input[type=\"month\"]\n// input[type=\"time\"]\n// input[type=\"week\"]\n// input[type=\"number\"]\n// input[type=\"email\"]\n// input[type=\"url\"]\n// input[type=\"search\"]\n// input[type=\"tel\"]\n// input[type=\"color\"]\n\n.form-control {\n display: block;\n width: 100%;\n height: @input-height-base; // Make inputs at least the height of their button counterpart (base line-height + padding + border)\n padding: @padding-base-vertical @padding-base-horizontal;\n font-size: @font-size-base;\n line-height: @line-height-base;\n color: @input-color;\n background-color: @input-bg;\n background-image: none; // Reset unusual Firefox-on-Android default style; see https://github.com/necolas/normalize.css/issues/214\n border: 1px solid @input-border;\n border-radius: @input-border-radius; // Note: This has no effect on <select>s in some browsers, due to the limited stylability of <select>s in CSS.\n box-shadow: inset 0 1px 1px rgba(0,0,0,.075);\n transition: border-color ease-in-out .15s, box-shadow ease-in-out .15s;\n\n // Customize the `:focus` state to imitate native WebKit styles.\n .form-control-focus();\n\n // Placeholder\n .placeholder();\n\n // Unstyle the caret on `<select>`s in IE10+.\n &::-ms-expand {\n border: 0;\n background-color: transparent;\n }\n\n // Disabled and read-only inputs\n //\n // HTML5 says that controls under a fieldset > legend:first-child won't be\n // disabled if the fieldset is disabled. Due to implementation difficulty, we\n // don't honor that edge case; we style them as disabled anyway.\n &[disabled],\n &[readonly],\n fieldset[disabled] & {\n background-color: @input-bg-disabled;\n opacity: 1; // iOS fix for unreadable disabled content; see https://github.com/twbs/bootstrap/issues/11655\n }\n\n &[disabled],\n fieldset[disabled] & {\n cursor: @cursor-disabled;\n }\n\n // Reset height for `textarea`s\n textarea& {\n height: auto;\n }\n}\n\n\n// Form groups\n//\n// Designed to help with the organization and spacing of vertical forms. For\n// horizontal forms, use the predefined grid classes.\n\n.form-group {\n margin-bottom: @form-group-margin-bottom;\n}\n\n\n// Checkboxes and radios\n//\n// Indent the labels to position radios/checkboxes as hanging controls.\n\n.radio,\n.checkbox {\n position: relative;\n display: block;\n margin-top: 10px;\n margin-bottom: 10px;\n\n label {\n min-height: @line-height-computed; // Ensure the input doesn't jump when there is no text\n padding-left: 20px;\n margin-bottom: 0;\n font-weight: normal;\n cursor: pointer;\n }\n}\n.radio input[type=\"radio\"],\n.radio-inline input[type=\"radio\"],\n.checkbox input[type=\"checkbox\"],\n.checkbox-inline input[type=\"checkbox\"] {\n position: absolute;\n margin-left: -20px;\n margin-top: 4px \\9;\n}\n\n.radio + .radio,\n.checkbox + .checkbox {\n margin-top: -5px; // Move up sibling radios or checkboxes for tighter spacing\n}\n\n// Radios and checkboxes on same line\n.radio-inline,\n.checkbox-inline {\n position: relative;\n display: inline-block;\n padding-left: 20px;\n margin-bottom: 0;\n vertical-align: middle;\n font-weight: normal;\n cursor: pointer;\n}\n.radio-inline + .radio-inline,\n.checkbox-inline + .checkbox-inline {\n margin-top: 0;\n margin-left: 10px; // space out consecutive inline controls\n}\n\n// Apply same disabled cursor tweak as for inputs\n// Some special care is needed because <label>s don't inherit their parent's `cursor`.\n//\n// Note: Neither radios nor checkboxes can be readonly.\ninput[type=\"radio\"],\ninput[type=\"checkbox\"] {\n &[disabled],\n &.disabled,\n fieldset[disabled] & {\n cursor: @cursor-disabled;\n }\n}\n// These classes are used directly on <label>s\n.radio-inline,\n.checkbox-inline {\n &.disabled,\n fieldset[disabled] & {\n cursor: @cursor-disabled;\n }\n}\n// These classes are used on elements with <label> descendants\n.radio,\n.checkbox {\n &.disabled,\n fieldset[disabled] & {\n label {\n cursor: @cursor-disabled;\n }\n }\n}\n\n\n// Static form control text\n//\n// Apply class to a `p` element to make any string of text align with labels in\n// a horizontal form layout.\n\n.form-control-static {\n // Size it appropriately next to real form controls\n padding-top: (@padding-base-vertical + 1);\n padding-bottom: (@padding-base-vertical + 1);\n // Remove default margin from `p`\n margin-bottom: 0;\n min-height: (@line-height-computed + @font-size-base);\n\n &.input-lg,\n &.input-sm {\n padding-left: 0;\n padding-right: 0;\n }\n}\n\n\n// Form control sizing\n//\n// Build on `.form-control` with modifier classes to decrease or increase the\n// height and font-size of form controls.\n//\n// The `.form-group-* form-control` variations are sadly duplicated to avoid the\n// issue documented in https://github.com/twbs/bootstrap/issues/15074.\n\n.input-sm {\n .input-size(@input-height-small; @padding-small-vertical; @padding-small-horizontal; @font-size-small; @line-height-small; @input-border-radius-small);\n}\n.form-group-sm {\n .form-control {\n height: @input-height-small;\n padding: @padding-small-vertical @padding-small-horizontal;\n font-size: @font-size-small;\n line-height: @line-height-small;\n border-radius: @input-border-radius-small;\n }\n select.form-control {\n height: @input-height-small;\n line-height: @input-height-small;\n }\n textarea.form-control,\n select[multiple].form-control {\n height: auto;\n }\n .form-control-static {\n height: @input-height-small;\n min-height: (@line-height-computed + @font-size-small);\n padding: (@padding-small-vertical + 1) @padding-small-horizontal;\n font-size: @font-size-small;\n line-height: @line-height-small;\n }\n}\n\n.input-lg {\n .input-size(@input-height-large; @padding-large-vertical; @padding-large-horizontal; @font-size-large; @line-height-large; @input-border-radius-large);\n}\n.form-group-lg {\n .form-control {\n height: @input-height-large;\n padding: @padding-large-vertical @padding-large-horizontal;\n font-size: @font-size-large;\n line-height: @line-height-large;\n border-radius: @input-border-radius-large;\n }\n select.form-control {\n height: @input-height-large;\n line-height: @input-height-large;\n }\n textarea.form-control,\n select[multiple].form-control {\n height: auto;\n }\n .form-control-static {\n height: @input-height-large;\n min-height: (@line-height-computed + @font-size-large);\n padding: (@padding-large-vertical + 1) @padding-large-horizontal;\n font-size: @font-size-large;\n line-height: @line-height-large;\n }\n}\n\n\n// Form control feedback states\n//\n// Apply contextual and semantic states to individual form controls.\n\n.has-feedback {\n // Enable absolute positioning\n position: relative;\n\n // Ensure icons don't overlap text\n .form-control {\n padding-right: (@input-height-base * 1.25);\n }\n}\n// Feedback icon (requires .glyphicon classes)\n.form-control-feedback {\n position: absolute;\n top: 0;\n right: 0;\n z-index: 2; // Ensure icon is above input groups\n display: block;\n width: @input-height-base;\n height: @input-height-base;\n line-height: @input-height-base;\n text-align: center;\n pointer-events: none;\n}\n.input-lg + .form-control-feedback,\n.input-group-lg + .form-control-feedback,\n.form-group-lg .form-control + .form-control-feedback {\n width: @input-height-large;\n height: @input-height-large;\n line-height: @input-height-large;\n}\n.input-sm + .form-control-feedback,\n.input-group-sm + .form-control-feedback,\n.form-group-sm .form-control + .form-control-feedback {\n width: @input-height-small;\n height: @input-height-small;\n line-height: @input-height-small;\n}\n\n// Feedback states\n.has-success {\n .form-control-validation(@state-success-text; @state-success-text; @state-success-bg);\n}\n.has-warning {\n .form-control-validation(@state-warning-text; @state-warning-text; @state-warning-bg);\n}\n.has-error {\n .form-control-validation(@state-danger-text; @state-danger-text; @state-danger-bg);\n}\n\n// Reposition feedback icon if input has visible label above\n.has-feedback label {\n\n & ~ .form-control-feedback {\n top: (@line-height-computed + 5); // Height of the `label` and its margin\n }\n &.sr-only ~ .form-control-feedback {\n top: 0;\n }\n}\n\n\n// Help text\n//\n// Apply to any element you wish to create light text for placement immediately\n// below a form control. Use for general help, formatting, or instructional text.\n\n.help-block {\n display: block; // account for any element using help-block\n margin-top: 5px;\n margin-bottom: 10px;\n color: lighten(@text-color, 25%); // lighten the text some for contrast\n}\n\n\n// Inline forms\n//\n// Make forms appear inline(-block) by adding the `.form-inline` class. Inline\n// forms begin stacked on extra small (mobile) devices and then go inline when\n// viewports reach <768px.\n//\n// Requires wrapping inputs and labels with `.form-group` for proper display of\n// default HTML form controls and our custom form controls (e.g., input groups).\n//\n// Heads up! This is mixin-ed into `.navbar-form` in navbars.less.\n\n.form-inline {\n\n // Kick in the inline\n @media (min-width: @screen-sm-min) {\n // Inline-block all the things for \"inline\"\n .form-group {\n display: inline-block;\n margin-bottom: 0;\n vertical-align: middle;\n }\n\n // In navbar-form, allow folks to *not* use `.form-group`\n .form-control {\n display: inline-block;\n width: auto; // Prevent labels from stacking above inputs in `.form-group`\n vertical-align: middle;\n }\n\n // Make static controls behave like regular ones\n .form-control-static {\n display: inline-block;\n }\n\n .input-group {\n display: inline-table;\n vertical-align: middle;\n\n .input-group-addon,\n .input-group-btn,\n .form-control {\n width: auto;\n }\n }\n\n // Input groups need that 100% width though\n .input-group > .form-control {\n width: 100%;\n }\n\n .control-label {\n margin-bottom: 0;\n vertical-align: middle;\n }\n\n // Remove default margin on radios/checkboxes that were used for stacking, and\n // then undo the floating of radios and checkboxes to match.\n .radio,\n .checkbox {\n display: inline-block;\n margin-top: 0;\n margin-bottom: 0;\n vertical-align: middle;\n\n label {\n padding-left: 0;\n }\n }\n .radio input[type=\"radio\"],\n .checkbox input[type=\"checkbox\"] {\n position: relative;\n margin-left: 0;\n }\n\n // Re-override the feedback icon.\n .has-feedback .form-control-feedback {\n top: 0;\n }\n }\n}\n\n\n// Horizontal forms\n//\n// Horizontal forms are built on grid classes and allow you to create forms with\n// labels on the left and inputs on the right.\n\n.form-horizontal {\n\n // Consistent vertical alignment of radios and checkboxes\n //\n // Labels also get some reset styles, but that is scoped to a media query below.\n .radio,\n .checkbox,\n .radio-inline,\n .checkbox-inline {\n margin-top: 0;\n margin-bottom: 0;\n padding-top: (@padding-base-vertical + 1); // Default padding plus a border\n }\n // Account for padding we're adding to ensure the alignment and of help text\n // and other content below items\n .radio,\n .checkbox {\n min-height: (@line-height-computed + (@padding-base-vertical + 1));\n }\n\n // Make form groups behave like rows\n .form-group {\n .make-row();\n }\n\n // Reset spacing and right align labels, but scope to media queries so that\n // labels on narrow viewports stack the same as a default form example.\n @media (min-width: @screen-sm-min) {\n .control-label {\n text-align: right;\n margin-bottom: 0;\n padding-top: (@padding-base-vertical + 1); // Default padding plus a border\n }\n }\n\n // Validation states\n //\n // Reposition the icon because it's now within a grid column and columns have\n // `position: relative;` on them. Also accounts for the grid gutter padding.\n .has-feedback .form-control-feedback {\n right: floor((@grid-gutter-width / 2));\n }\n\n // Form group sizes\n //\n // Quick utility class for applying `.input-lg` and `.input-sm` styles to the\n // inputs and labels within a `.form-group`.\n .form-group-lg {\n @media (min-width: @screen-sm-min) {\n .control-label {\n padding-top: (@padding-large-vertical + 1);\n font-size: @font-size-large;\n }\n }\n }\n .form-group-sm {\n @media (min-width: @screen-sm-min) {\n .control-label {\n padding-top: (@padding-small-vertical + 1);\n font-size: @font-size-small;\n }\n }\n }\n}\n","digest":"3a89d47796311e302bdcee941d9f97a67f23e1bc"},"node_modules/atom-ui/styles/private/links.less":{"content":"@import \"ui-variables\";\n@import \"../mixins/mixins\";\n\n// Links\n\na {\n cursor: pointer;\n color: @text-color-highlight;\n text-decoration: none;\n &:hover,\n &:focus {\n color: @text-color-highlight;\n text-decoration: underline;\n }\n &:focus {\n .tab-focus();\n }\n}\n","digest":"1b67395c0f1c96d9b4af3d82db7246f7f76f5f38"},"node_modules/atom-ui/styles/private/navs.less":{"content":"@import \"../variables/variables\";\n@import \"ui-variables\";\n@import \"../mixins/mixins\";\n\n//\n// Navs\n// --------------------------------------------------\n\n//=== Shared nav styles\n@nav-link-padding: 10px 15px;\n@nav-link-hover-bg: @gray-lighter;\n@nav-disabled-link-color: @gray-light;\n@nav-disabled-link-hover-color: @gray-light;\n\n//== Tabs\n@nav-tabs-border-color: #ddd;\n@nav-tabs-link-hover-border-color: @gray-lighter;\n@nav-tabs-active-link-hover-bg: @body-bg;\n@nav-tabs-active-link-hover-color: @gray;\n@nav-tabs-active-link-hover-border-color: #ddd;\n@nav-tabs-justified-link-border-color: #ddd;\n@nav-tabs-justified-active-link-border-color: @body-bg;\n\n//== Pills\n@nav-pills-border-radius: @border-radius-base;\n@nav-pills-active-link-hover-bg: @component-active-bg;\n@nav-pills-active-link-hover-color: @component-active-color;\n\n\n.nav-divider(@color: #e5e5e5) {\n height: 1px;\n margin: ((@line-height-computed / 2) - 1) 0;\n overflow: hidden;\n background-color: @color;\n}\n\n\n// Base class\n// --------------------------------------------------\n\n.nav {\n margin-bottom: 0;\n padding-left: 0; // Override default ul/ol\n list-style: none;\n &:extend(.clearfix all);\n\n > li {\n position: relative;\n display: block;\n\n > a {\n position: relative;\n display: block;\n padding: @nav-link-padding;\n border-radius: @component-border-radius;\n &:hover,\n &:focus {\n text-decoration: none;\n background-color: @background-color-highlight;\n }\n }\n\n // Disabled state sets text to gray and nukes hover/tab effects\n &.disabled > a {\n color: @nav-disabled-link-color;\n\n &:hover,\n &:focus {\n color: @nav-disabled-link-hover-color;\n text-decoration: none;\n background-color: transparent;\n cursor: @cursor-disabled;\n }\n }\n }\n\n // Open dropdowns\n .open > a {\n &,\n &:hover,\n &:focus {\n background-color: @nav-link-hover-bg;\n border-color: @link-color;\n }\n }\n\n // Nav dividers (deprecated with v3.0.1)\n //\n // This should have been removed in v3 with the dropping of `.nav-list`, but\n // we missed it. We don't currently support this anywhere, but in the interest\n // of maintaining backward compatibility in case you use it, it's deprecated.\n .nav-divider {\n .nav-divider();\n }\n\n // Prevent IE8 from misplacing imgs\n //\n // See https://github.com/h5bp/html5-boilerplate/issues/984#issuecomment-3985989\n > li > a > img {\n max-width: none;\n }\n}\n\n\n// Tabs\n// -------------------------\n\n// Give the tabs something to sit on\n.nav-tabs {\n border-bottom: 1px solid @nav-tabs-border-color;\n > li {\n float: left;\n // Make the list-items overlay the bottom border\n margin-bottom: -1px;\n\n // Actual tabs (as links)\n > a {\n margin-right: 2px;\n line-height: @line-height-base;\n border: 1px solid transparent;\n border-radius: @border-radius-base @border-radius-base 0 0;\n &:hover {\n border-color: @nav-tabs-link-hover-border-color @nav-tabs-link-hover-border-color @nav-tabs-border-color;\n }\n }\n\n // Active state, and its :hover to override normal :hover\n &.active > a {\n &,\n &:hover,\n &:focus {\n color: @nav-tabs-active-link-hover-color;\n background-color: @nav-tabs-active-link-hover-bg;\n border: 1px solid @nav-tabs-active-link-hover-border-color;\n border-bottom-color: transparent;\n cursor: default;\n }\n }\n }\n // pulling this in mainly for less shorthand\n &.nav-justified {\n .nav-justified();\n .nav-tabs-justified();\n }\n}\n\n\n// Pills\n// -------------------------\n.nav-pills {\n > li {\n float: left;\n\n // Links rendered as pills\n > a {\n border-radius: @nav-pills-border-radius;\n }\n + li {\n margin-left: 2px;\n }\n\n // Active state\n &.active > a {\n &,\n &:hover,\n &:focus {\n color: @nav-pills-active-link-hover-color;\n background-color: @background-color-selected;\n }\n }\n }\n}\n\n\n// Stacked pills\n.nav-stacked {\n > li {\n float: none;\n + li {\n margin-top: 2px;\n margin-left: 0; // no need for this gap between nav items\n }\n }\n}\n\n\n// Nav variations\n// --------------------------------------------------\n\n// Justified nav links\n// -------------------------\n\n.nav-justified {\n width: 100%;\n\n > li {\n float: none;\n > a {\n text-align: center;\n margin-bottom: 5px;\n }\n }\n\n > .dropdown .dropdown-menu {\n top: auto;\n left: auto;\n }\n\n @media (min-width: @screen-sm-min) {\n > li {\n display: table-cell;\n width: 1%;\n > a {\n margin-bottom: 0;\n }\n }\n }\n}\n\n// Move borders to anchors instead of bottom of list\n//\n// Mixin for adding on top the shared `.nav-justified` styles for our tabs\n.nav-tabs-justified {\n border-bottom: 0;\n\n > li > a {\n // Override margin from .nav-tabs\n margin-right: 0;\n border-radius: @border-radius-base;\n }\n\n > .active > a,\n > .active > a:hover,\n > .active > a:focus {\n border: 1px solid @nav-tabs-justified-link-border-color;\n }\n\n @media (min-width: @screen-sm-min) {\n > li > a {\n border-bottom: 1px solid @nav-tabs-justified-link-border-color;\n border-radius: @border-radius-base @border-radius-base 0 0;\n }\n > .active > a,\n > .active > a:hover,\n > .active > a:focus {\n border-bottom-color: @nav-tabs-justified-active-link-border-color;\n }\n }\n}\n\n\n// Tabbable tabs\n// -------------------------\n\n// Hide tabbable panes to start, show them when `.active`\n.tab-content {\n > .tab-pane {\n display: none;\n }\n > .active {\n display: block;\n }\n}\n\n\n// Dropdowns\n// -------------------------\n\n// Specific dropdowns\n.nav-tabs .dropdown-menu {\n // make dropdown border overlap tab border\n margin-top: -1px;\n // Remove the top rounded corners here since there is a hard edge above the menu\n .border-top-radius(0);\n}\n","digest":"b5935924a646fe81617f04f418e6fb77b6ad9393"},"node_modules/atom-ui/styles/private/scaffolding.less":{"content":"@import \"../variables/variables\";\n@import \"ui-variables\";\n@import \"../mixins/mixins\";\n\n//\n// Scaffolding\n// --------------------------------------------------\n\n// Remove focus style, be sure to add them back where useful\n:focus {\n outline: none;\n}\n\n// Reset fonts for relevant elements\ninput,\nbutton,\nselect,\ntextarea {\n font-family: inherit;\n font-size: inherit;\n line-height: inherit;\n}\n\n\n// Figures\n//\n// We reset this here because previously Normalize had no `figure` margins. This\n// ensures we don't break anyone's use of the element.\n\nfigure {\n margin: 0;\n}\n\n\n// Images\n\nimg {\n vertical-align: middle;\n}\n\n// Responsive images (ensure images don't scale beyond their parents)\n.img-responsive {\n display: block;\n max-width: 100%; // Set a maximum relative to the parent\n}\n\n\n// Horizontal rules\n\nhr {\n margin-top: @line-height-computed;\n margin-bottom: @line-height-computed;\n border: 0;\n border-top: 1px solid @hr-border;\n}\n","digest":"ecbeeca81d2b52e9af5ff5e988c2d1aeb73751aa"},"node_modules/atom-ui/styles/private/sections.less":{"content":"@import \"ui-variables\";\n\n// Deprecated\n// These selectors are too vague and should be used directly in Settings and Styleguide\n\nsection, .section {\n position: relative;\n margin-top: 0;\n &:last-child { margin-bottom: 0; }\n\n &.bordered {\n margin: 0;\n padding: @component-padding*2 0;\n border-top: 1px solid @background-color-highlight;\n border-bottom: 1px solid @tool-panel-border-color;\n }\n\n .section-heading:first-child {\n margin-top: 0;\n font-weight: bold;\n color: @text-color-highlight;\n }\n}\n\ndiv > section:first-child,\nform > section:first-child,\ndiv > .section:first-child,\nform > .section:first-child {\n border-top: none;\n padding-top: 0;\n}\ndiv > section:last-child,\nform > section:last-child,\ndiv > .section:last-child,\nform > .section:last-child {\n border-bottom: none;\n padding-bottom: 0;\n}\n","digest":"15cd6c2abed73f5339bd79465c7945ca6ce563c4"},"node_modules/atom-ui/styles/private/tables.less":{"content":"@import \"../variables/variables\";\n@import \"ui-variables\";\n\n//\n// Tables\n// --------------------------------------------------\n\n//## Customizes the `.table` component with basic values, each used across all table variations.\n\n@table-cell-padding: 8px; //** Padding for `<th>`s and `<td>`s.\n@table-condensed-cell-padding: 5px; //** Padding for cells in `.table-condensed`.\n@table-bg: transparent; //** Default background color used for all tables.\n@table-bg-accent: #f9f9f9; //** Background color used for `.table-striped`.\n@table-bg-hover: #f5f5f5; //** Background color used for `.table-hover`.\n@table-bg-active: @table-bg-hover;\n@table-border-color: #ddd; //** Border color for table and cell borders.\n\n\n\n// Variant mixin\n\n.table-row-variant(@state; @background) {\n // Exact selectors below required to override `.table-striped` and prevent\n // inheritance to nested tables.\n .table > thead > tr,\n .table > tbody > tr,\n .table > tfoot > tr {\n > td.@{state},\n > th.@{state},\n &.@{state} > td,\n &.@{state} > th {\n background-color: @background;\n }\n }\n\n // Hover states for `.table-hover`\n // Note: this is not available for cells or rows within `thead` or `tfoot`.\n .table-hover > tbody > tr {\n > td.@{state}:hover,\n > th.@{state}:hover,\n &.@{state}:hover > td,\n &:hover > .@{state},\n &.@{state}:hover > th {\n background-color: darken(@background, 5%);\n }\n }\n}\n\n\n// Global overrides\n\ntable {\n background-color: @table-bg;\n}\ncaption {\n padding-top: @table-cell-padding;\n padding-bottom: @table-cell-padding;\n color: @text-muted;\n text-align: left;\n}\nth {\n text-align: left;\n}\n\n\n// Baseline styles\n\n.table {\n width: 100%;\n max-width: 100%;\n margin-bottom: @line-height-computed;\n // Cells\n > thead,\n > tbody,\n > tfoot {\n > tr {\n > th,\n > td {\n padding: @table-cell-padding;\n line-height: @line-height-base;\n vertical-align: top;\n border-top: 1px solid @table-border-color;\n }\n }\n }\n // Bottom align for column headings\n > thead > tr > th {\n vertical-align: bottom;\n border-bottom: 2px solid @table-border-color;\n }\n // Remove top border from thead by default\n > caption + thead,\n > colgroup + thead,\n > thead:first-child {\n > tr:first-child {\n > th,\n > td {\n border-top: 0;\n }\n }\n }\n // Account for multiple tbody instances\n > tbody + tbody {\n border-top: 2px solid @table-border-color;\n }\n\n // Nesting\n .table {\n background-color: @body-bg;\n }\n}\n\n\n// Condensed table w/ half padding\n\n.table-condensed {\n > thead,\n > tbody,\n > tfoot {\n > tr {\n > th,\n > td {\n padding: @table-condensed-cell-padding;\n }\n }\n }\n}\n\n\n// Bordered version\n//\n// Add borders all around the table and between all the columns.\n\n.table-bordered {\n border: 1px solid @table-border-color;\n > thead,\n > tbody,\n > tfoot {\n > tr {\n > th,\n > td {\n border: 1px solid @table-border-color;\n }\n }\n }\n > thead > tr {\n > th,\n > td {\n border-bottom-width: 2px;\n }\n }\n}\n\n\n// Zebra-striping\n//\n// Default zebra-stripe styles (alternating gray and transparent backgrounds)\n\n.table-striped {\n > tbody > tr:nth-of-type(odd) {\n background-color: @table-bg-accent;\n }\n}\n\n\n// Hover effect\n//\n// Placed here since it has to come after the potential zebra striping\n\n.table-hover {\n > tbody > tr:hover {\n background-color: @table-bg-hover;\n }\n}\n\n\n// Table cell sizing\n//\n// Reset default table behavior\n\ntable col[class*=\"col-\"] {\n position: static; // Prevent border hiding in Firefox and IE9-11 (see https://github.com/twbs/bootstrap/issues/11623)\n float: none;\n display: table-column;\n}\ntable {\n td,\n th {\n &[class*=\"col-\"] {\n position: static; // Prevent border hiding in Firefox and IE9-11 (see https://github.com/twbs/bootstrap/issues/11623)\n float: none;\n display: table-cell;\n }\n }\n}\n\n\n// Table backgrounds\n//\n// Exact selectors below required to override `.table-striped` and prevent\n// inheritance to nested tables.\n\n// Generate the contextual variants\n.table-row-variant(active; @table-bg-active);\n.table-row-variant(success; @state-success-bg);\n.table-row-variant(info; @state-info-bg);\n.table-row-variant(warning; @state-warning-bg);\n.table-row-variant(danger; @state-danger-bg);\n","digest":"43ec0b62ed5ff57800040281069c44f9d177a599"},"node_modules/atom-ui/styles/private/utilities.less":{"content":"@import \"ui-variables\";\n@import \"../mixins/mixins\";\n\n// Toggling content\n// -------------------------\n\n// Note: Deprecated .hide in favor of .hidden or .sr-only (as appropriate) in v3.0.1\n.hide {\n display: none !important;\n}\n.show {\n display: block !important;\n}\n.invisible {\n visibility: hidden;\n}\n.text-hide {\n .text-hide();\n}\n\n\n// Hide from screenreaders and browsers\n//\n// Credit: HTML5 Boilerplate\n\n.hidden {\n display: none !important;\n}\n\n\n// Only display content to screen readers\n//\n// See: http://a11yproject.com/posts/how-to-hide-content/\n\n.sr-only {\n position: absolute;\n width: 1px;\n height: 1px;\n margin: -1px;\n padding: 0;\n overflow: hidden;\n clip: rect(0,0,0,0);\n border: 0;\n}\n\n// Use in conjunction with .sr-only to only display content when it's focused.\n// Useful for \"Skip to main content\" links; see http://www.w3.org/TR/2013/NOTE-WCAG20-TECHS-20130905/G1\n// Credit: HTML5 Boilerplate\n\n.sr-only-focusable {\n &:active,\n &:focus {\n position: static;\n width: auto;\n height: auto;\n margin: 0;\n overflow: visible;\n clip: auto;\n }\n}\n","digest":"d7308fc13c56e919be53b486744b05819a64fd40"},"node_modules/atom-ui/styles/select-list.less":{"content":"@import \"ui-variables\";\n@import \"octicon-mixins\";\n\n.select-list {\n .loading {\n .loading-message {\n .octicon(hourglass);\n\n &:before {\n font-size: 1.1em;\n width: 1.1em;\n height: 1.1em;\n margin-right: 5px;\n }\n }\n\n .badge {\n margin-left: 10px;\n }\n }\n\n ol.list-group {\n position: relative;\n overflow-y: auto;\n max-height: 312px;\n margin: @component-padding 0 0 0;\n padding: 0;\n\n li {\n display: block;\n\n .primary-line,\n .secondary-line {\n text-overflow: ellipsis;\n white-space: nowrap;\n overflow: hidden;\n }\n }\n }\n}\n\n\n// Popover List\n\n.select-list.popover-list {\n width: 200px;\n min-width: 200px;\n margin-left: 0;\n position: relative;\n background-color: @overlay-background-color;\n\n ol.list-group {\n position: relative;\n overflow-y: scroll;\n max-height: 200px;\n }\n}\n","digest":"518848bc20eb40cc04f71321a2842ce354550fcf"},"node_modules/atom-ui/styles/site-colors.less":{"content":"//\n// Site colors\n// --------------------------------------------------\n\n.ui-site-1 { background-color: @ui-site-color-1; }\n.ui-site-2 { background-color: @ui-site-color-2; }\n.ui-site-3 { background-color: @ui-site-color-3; }\n.ui-site-4 { background-color: @ui-site-color-4; }\n.ui-site-5 { background-color: @ui-site-color-5; }\n","digest":"e44c2b7ce99bf5e19306f74e52078ce190fd8ea4"},"node_modules/atom-ui/styles/text.less":{"content":"@import \"variables/variables\";\n@import \"ui-variables\";\n@import \"mixins/mixins\";\n\n//\n// Typography\n// --------------------------------------------------\n\n@font-size-h1: floor((@font-size-base * 2.6)); // ~36px\n@font-size-h2: floor((@font-size-base * 2.15)); // ~30px\n@font-size-h3: ceil((@font-size-base * 1.7)); // ~24px\n@font-size-h4: ceil((@font-size-base * 1.25)); // ~18px\n@font-size-h5: @font-size-base;\n@font-size-h6: ceil((@font-size-base * 0.85)); // ~12px\n\n@headings-font-family: inherit;\n@headings-font-weight: 500;\n@headings-line-height: 1.1;\n@headings-color: inherit;\n\n// Mixins\n// -------------------------\n\n.text-variant(@type) {\n @text-color-name: \"text-color-@{type}\";\n @bg-color-name: \"background-color-@{type}\";\n\n @text-color: @@text-color-name;\n @bg-color: @@bg-color-name;\n\n color: @text-color;\n a&:hover,\n a&:focus {\n color: darken(@text-color, 10%);\n }\n\n code {\n color: @text-color;\n background: fadeout(@bg-color, 80%);\n }\n\n a, a code {\n text-decoration: underline;\n color: darken(@text-color, 10%);\n\n &:hover {\n color: darken(@text-color, 15%);\n }\n }\n}\n\n.bg-variant(@color) {\n background-color: @color;\n a&:hover,\n a&:focus {\n background-color: darken(@color, 10%);\n }\n}\n\n// Headings\n// -------------------------\n\nh1, h2, h3, h4, h5, h6,\n.h1, .h2, .h3, .h4, .h5, .h6 {\n font-family: @headings-font-family;\n font-weight: @headings-font-weight;\n line-height: @headings-line-height;\n color: @headings-color;\n\n small,\n .small {\n font-weight: normal;\n line-height: 1;\n color: @headings-small-color;\n }\n}\n\nh1, .h1,\nh2, .h2,\nh3, .h3 {\n margin-top: @line-height-computed;\n margin-bottom: (@line-height-computed / 2);\n\n small,\n .small {\n font-size: 65%;\n }\n}\nh4, .h4,\nh5, .h5,\nh6, .h6 {\n margin-top: (@line-height-computed / 2);\n margin-bottom: (@line-height-computed / 2);\n\n small,\n .small {\n font-size: 75%;\n }\n}\n\nh1, .h1 { font-size: @font-size-h1; }\nh2, .h2 { font-size: @font-size-h2; }\nh3, .h3 { font-size: @font-size-h3; }\nh4, .h4 { font-size: @font-size-h4; }\nh5, .h5 { font-size: @font-size-h5; }\nh6, .h6 { font-size: @font-size-h6; }\n\n\n// Body text\n// -------------------------\n\np {\n margin: 0 0 (@line-height-computed / 2);\n}\n\n\n// Emphasis & misc\n// -------------------------\n\n// Ex: (12px small font / 14px base font) * 100% = about 85%\n.text-smaller,\nsmall,\n.small {\n font-size: floor((100% * @font-size-small / @font-size-base));\n}\n\nmark,\n.mark {\n background-color: @state-warning-bg;\n padding: .2em;\n}\n\n// Alignment\n.text-left { text-align: left; }\n.text-right { text-align: right; }\n.text-center { text-align: center; }\n.text-justify { text-align: justify; }\n.text-nowrap { white-space: nowrap; }\n\n// Transformation\n.text-lowercase { text-transform: lowercase; }\n.text-uppercase { text-transform: uppercase; }\n.text-capitalize { text-transform: capitalize; }\n\n// text-classes\n.text-subtle, .text-muted { color: @text-color-subtle; }\n.text-highlight { color: @text-color-highlight; }\n\n// Contextual colors\n.text-info, .text-primary { .text-variant(info); }\n.text-success { .text-variant(success); }\n.text-warning { .text-variant(warning); }\n.text-error, .text-danger { .text-variant(error); }\n\n// Contextual backgrounds\n// For now we'll leave these alongside the text classes until v4 when we can\n// safely shift things around (per SemVer rules).\n.bg-primary {\n // Given the contrast here, this is the only class to have its color inverted\n // automatically.\n color: #fff;\n .bg-variant(@brand-primary);\n}\n.bg-success {\n .bg-variant(@state-success-bg);\n}\n.bg-info {\n .bg-variant(@state-info-bg);\n}\n.bg-warning {\n .bg-variant(@state-warning-bg);\n}\n.bg-danger {\n .bg-variant(@state-danger-bg);\n}\n\n\n// Highlight\n// -------------------------\n\n.highlight() {\n font-weight: bold;\n border-radius: @component-border-radius;\n}\n\n.highlight {\n .highlight();\n color: @text-color-highlight;\n background-color: @background-color-highlight;\n}\n\n.highlight-color(@name, @color) {\n .highlight-@{name} {\n .highlight();\n color: #fff;\n background-color: fadeout(@color, 50%);\n }\n}\n\n.highlight-color(info, @background-color-info);\n.highlight-color(warning, @background-color-warning);\n.highlight-color(error, @background-color-error);\n.highlight-color(success, @background-color-success);\n\n\n// Lists\n// -------------------------\n\n// Unordered and Ordered lists\nul,\nol {\n margin-top: 0;\n margin-bottom: (@line-height-computed / 2);\n ul,\n ol {\n margin-bottom: 0;\n }\n}\n\n// Description Lists\ndl {\n margin-top: 0; // Remove browser default\n margin-bottom: @line-height-computed;\n}\ndt,\ndd {\n line-height: @line-height-base;\n}\ndt {\n font-weight: bold;\n}\ndd {\n margin-left: 0; // Undo browser default\n}\n\n\n// Misc\n// -------------------------\n\n// Abbreviations and acronyms\nabbr[title],\n// Add data-* attribute to help out our tooltip plugin, per https://github.com/twbs/bootstrap/issues/5257\nabbr[data-original-title] {\n cursor: help;\n border-bottom: 1px dotted @abbr-border-color;\n}\n\n// Blockquotes\nblockquote {\n padding: (@line-height-computed / 2) @line-height-computed;\n margin: 0 0 @line-height-computed;\n font-size: @blockquote-font-size;\n border-left: 5px solid @blockquote-border-color;\n\n p,\n ul,\n ol {\n &:last-child {\n margin-bottom: 0;\n }\n }\n}\n\n// Addresses\naddress {\n margin-bottom: @line-height-computed;\n font-style: normal;\n line-height: @line-height-base;\n}\n","digest":"d7d7f46cfbf517e31d08e97d60eb3eb2d646c1d7"},"node_modules/atom-ui/styles/tooltip.less":{"content":"@import \"ui-variables\";\n\n//\n// Tooltips\n// --------------------------------------------------\n\n@tooltip-max-width: 200px; //** Tooltip max width\n@tooltip-color: #fff; //** Tooltip text color\n@tooltip-bg: @background-color-info; //** Tooltip background color\n@tooltip-opacity: .9;\n@tooltip-arrow-width: 5px; //** Tooltip arrow width\n@tooltip-arrow-color: @tooltip-bg; //** Tooltip arrow color\n@tooltip-zindex: 1070;\n\n\n// Base class\n.tooltip {\n // Our parent element can be arbitrary since tooltips are by default inserted as a sibling of their target element.\n // So reset our font and text properties to avoid inheriting weird values.\n all: initial;\n\n position: absolute;\n z-index: @tooltip-zindex;\n display: block;\n font-family: @font-family;\n font-size: @font-size;\n opacity: 0;\n\n &.in { opacity: @tooltip-opacity; }\n &.top { margin-top: -3px; padding: @tooltip-arrow-width 0; }\n &.right { margin-left: 3px; padding: 0 @tooltip-arrow-width; }\n &.bottom { margin-top: 3px; padding: @tooltip-arrow-width 0; }\n &.left { margin-left: -3px; padding: 0 @tooltip-arrow-width; }\n}\n\n// Wrapper for the tooltip content\n.tooltip-inner {\n max-width: @tooltip-max-width;\n padding: 3px 8px;\n color: @tooltip-color;\n text-align: center;\n background-color: @tooltip-bg;\n border-radius: @component-border-radius;\n}\n\n// Arrows\n.tooltip-arrow {\n position: absolute;\n width: 0;\n height: 0;\n border-color: transparent;\n border-style: solid;\n}\n// Note: Deprecated .top-left, .top-right, .bottom-left, and .bottom-right as of v3.3.1\n.tooltip {\n &.top .tooltip-arrow {\n bottom: 0;\n left: 50%;\n margin-left: -@tooltip-arrow-width;\n border-width: @tooltip-arrow-width @tooltip-arrow-width 0;\n border-top-color: @tooltip-arrow-color;\n }\n &.top-left .tooltip-arrow {\n bottom: 0;\n right: @tooltip-arrow-width;\n margin-bottom: -@tooltip-arrow-width;\n border-width: @tooltip-arrow-width @tooltip-arrow-width 0;\n border-top-color: @tooltip-arrow-color;\n }\n &.top-right .tooltip-arrow {\n bottom: 0;\n left: @tooltip-arrow-width;\n margin-bottom: -@tooltip-arrow-width;\n border-width: @tooltip-arrow-width @tooltip-arrow-width 0;\n border-top-color: @tooltip-arrow-color;\n }\n &.right .tooltip-arrow {\n top: 50%;\n left: 0;\n margin-top: -@tooltip-arrow-width;\n border-width: @tooltip-arrow-width @tooltip-arrow-width @tooltip-arrow-width 0;\n border-right-color: @tooltip-arrow-color;\n }\n &.left .tooltip-arrow {\n top: 50%;\n right: 0;\n margin-top: -@tooltip-arrow-width;\n border-width: @tooltip-arrow-width 0 @tooltip-arrow-width @tooltip-arrow-width;\n border-left-color: @tooltip-arrow-color;\n }\n &.bottom .tooltip-arrow {\n top: 0;\n left: 50%;\n margin-left: -@tooltip-arrow-width;\n border-width: 0 @tooltip-arrow-width @tooltip-arrow-width;\n border-bottom-color: @tooltip-arrow-color;\n }\n &.bottom-left .tooltip-arrow {\n top: 0;\n right: @tooltip-arrow-width;\n margin-top: -@tooltip-arrow-width;\n border-width: 0 @tooltip-arrow-width @tooltip-arrow-width;\n border-bottom-color: @tooltip-arrow-color;\n }\n &.bottom-right .tooltip-arrow {\n top: 0;\n left: @tooltip-arrow-width;\n margin-top: -@tooltip-arrow-width;\n border-width: 0 @tooltip-arrow-width @tooltip-arrow-width;\n border-bottom-color: @tooltip-arrow-color;\n }\n}\n","digest":"4a9234eaed3a3b47b953cdfd4cf4526070c05eea"},"node_modules/atom-ui/styles/variables/variables.less":{"content":"@import \"ui-variables\";\n\n//\n// Variables (Forked from Bootstrap 3.3.6)\n// Don't use these variables in packages/themes.\n// Only use the public ui-variables.less + syntax-variables.less\n// --------------------------------------------------\n\n\n//== Colors\n//\n//## Gray and brand colors for use across Bootstrap.\n\n@gray-base: #000;\n@gray-darker: lighten(@gray-base, 13.5%); // #222\n@gray-dark: lighten(@gray-base, 20%); // #333\n@gray: lighten(@gray-base, 33.5%); // #555\n@gray-light: lighten(@gray-base, 46.7%); // #777\n@gray-lighter: lighten(@gray-base, 93.5%); // #eee\n\n@brand-primary: @text-color-info;\n@brand-info: @text-color-info;\n@brand-success: @text-color-success;\n@brand-warning: @text-color-warning;\n@brand-danger: @text-color-error;\n\n\n//== Scaffolding\n//\n//## Settings for some of the most global styles.\n\n//** Background color for `<body>`.\n@body-bg: @app-background-color;\n//** Global textual link color.\n@link-color: @brand-primary;\n//** Link hover color set via `darken()` function.\n@link-hover-color: darken(@link-color, 15%);\n//** Link hover decoration.\n@link-hover-decoration: underline;\n\n\n//== Typography\n//\n//## Font, line-height, and color for body text, headings, and more.\n\n//** Default monospace fonts for `<code>`, `<kbd>`, and `<pre>`.\n@font-family-monospace: Menlo, Monaco, Consolas, \"Courier New\", monospace;\n\n@font-size-base: @font-size;\n@font-size-large: ceil((@font-size-base * 1.25)); // ~18px\n@font-size-small: ceil((@font-size-base * 0.85)); // ~12px\n\n//** Unit-less `line-height` for use in components like buttons.\n@line-height-base: 1.428571429; // 20/14\n//** Computed \"line-height\" (`font-size` * `line-height`) for use with `margin`, `padding`, etc.\n@line-height-computed: floor((@font-size-base * @line-height-base)); // ~20px\n\n\n//== Components\n//\n//## Define common padding and border radius sizes and more. Values based on 14px text and 1.428 line-height (~20px to start).\n\n@padding-base-vertical: 6px;\n@padding-base-horizontal: 12px;\n\n@padding-large-vertical: 10px;\n@padding-large-horizontal: 16px;\n\n@padding-small-vertical: 5px;\n@padding-small-horizontal: 10px;\n\n@padding-xs-vertical: 1px;\n@padding-xs-horizontal: 5px;\n\n@line-height-large: 1.3333333; // extra decimals for Win 8.1 Chrome\n@line-height-small: 1.5;\n\n@border-radius-base: 4px;\n@border-radius-large: 6px;\n@border-radius-small: 3px;\n\n//** Global color for active items (e.g., navs or dropdowns).\n@component-active-color: #fff;\n//** Global background color for active items (e.g., navs or dropdowns).\n@component-active-bg: @brand-primary;\n\n//** Width of the `border` for generating carets that indicator dropdowns.\n@caret-width-base: 4px;\n//** Carets increase slightly in size for larger components.\n@caret-width-large: 5px;\n\n\n//== Buttons\n//\n//## For each of Bootstrap's buttons, define text, background and border color.\n\n@btn-default-color: @text-color;\n@btn-default-bg: @button-background-color;\n\n@btn-primary-color: #fff;\n@btn-primary-bg: @background-color-info;\n\n@btn-success-color: #fff;\n@btn-success-bg: @background-color-success;\n\n@btn-info-color: #fff;\n@btn-info-bg: @background-color-info;\n\n@btn-warning-color: #fff;\n@btn-warning-bg: @background-color-warning;\n\n@btn-error-color: #fff;\n@btn-error-bg: @background-color-error;\n\n@btn-link-disabled-color: @text-color-subtle;\n\n// Allows for customizing button radius independently from global border radius\n@btn-border-radius-base: @component-border-radius;\n@btn-border-radius-large: @component-border-radius * 2;\n@btn-border-radius-small: @component-border-radius / 2;\n\n\n\n//== Media queries breakpoints\n//\n//## Define the breakpoints at which your layout will change, adapting to different screen sizes\n\n@screen-sm: 768px;\n@screen-sm-min: @screen-sm;\n\n@screen-xs-max: (@screen-sm-min - 1);\n\n// //== Form states and alerts\n// //\n// //## Define colors for form feedback states and, by default, alerts.\n//\n@state-success-text: #3c763d;\n@state-success-bg: #dff0d8;\n@state-success-border: darken(spin(@state-success-bg, -10), 5%);\n\n@state-info-text: #31708f;\n@state-info-bg: #d9edf7;\n@state-info-border: darken(spin(@state-info-bg, -10), 7%);\n\n@state-warning-text: #8a6d3b;\n@state-warning-bg: #fcf8e3;\n@state-warning-border: darken(spin(@state-warning-bg, -10), 5%);\n\n@state-danger-text: #a94442;\n@state-danger-bg: #f2dede;\n@state-danger-border: darken(spin(@state-danger-bg, -10), 5%);\n\n\n// == List group\n//\n// ##\n\n//** Background color on `.list-group-item`\n@list-group-bg: #fff;\n//** `.list-group-item` border color\n@list-group-border: #ddd;\n//** List group border radius\n@list-group-border-radius: @border-radius-base;\n\n//** Background color of single list items on hover\n@list-group-hover-bg: #f5f5f5;\n//** Text color of active list items\n@list-group-active-color: @component-active-color;\n//** Background color of active list items\n@list-group-active-bg: @component-active-bg;\n//** Border color of active list elements\n@list-group-active-border: @list-group-active-bg;\n//** Text color for content within active list items\n@list-group-active-text-color: lighten(@list-group-active-bg, 40%);\n\n//** Text color of disabled list items\n@list-group-disabled-color: @gray-light;\n//** Background color of disabled list items\n@list-group-disabled-bg: @gray-lighter;\n//** Text color for content within disabled list items\n@list-group-disabled-text-color: @list-group-disabled-color;\n\n@list-group-link-color: #555;\n@list-group-link-hover-color: @list-group-link-color;\n@list-group-link-heading-color: #333;\n\n\n//== Thumbnails\n//\n//##\n\n//** Padding around the thumbnail image\n@thumbnail-padding: 4px;\n//** Thumbnail background color\n@thumbnail-bg: @body-bg;\n//** Thumbnail border color\n@thumbnail-border: #ddd;\n//** Thumbnail border radius\n@thumbnail-border-radius: @border-radius-base;\n\n\n//== Type\n//\n//##\n\n//** Horizontal offset for forms and lists.\n@component-offset-horizontal: 180px;\n//** Text muted color\n@text-muted: @gray-light;\n//** Abbreviations and acronyms border color\n@abbr-border-color: @gray-light;\n//** Headings small color\n@headings-small-color: @gray-light;\n//** Blockquote small color\n@blockquote-small-color: @gray-light;\n//** Blockquote font size\n@blockquote-font-size: (@font-size-base * 1.25);\n//** Blockquote border color\n@blockquote-border-color: @gray-lighter;\n//** Page header border color\n@page-header-border-color: @gray-lighter;\n//** Horizontal line color.\n@hr-border: @gray-lighter;\n\n\n//== Misc\n//\n//##\n\n//** Disabled cursor for form controls and buttons.\n@cursor-disabled: not-allowed;\n","digest":"e874519c3f95c02da4def52962c25490bf586713"}},"importedFilePathsByRelativeImportPath":{"node_modules/atom-dark-syntax/styles":["node_modules/atom-dark-syntax/styles/syntax-variables.less"],"node_modules/atom-dark-ui/styles":["node_modules/atom-dark-ui/styles/atom.less","node_modules/atom-dark-ui/styles/buttons.less","node_modules/atom-dark-ui/styles/dropdowns.less","node_modules/atom-dark-ui/styles/editor.less","node_modules/atom-dark-ui/styles/git.less","node_modules/atom-dark-ui/styles/lists.less","node_modules/atom-dark-ui/styles/messages.less","node_modules/atom-dark-ui/styles/nav.less","node_modules/atom-dark-ui/styles/overlays.less","node_modules/atom-dark-ui/styles/panels.less","node_modules/atom-dark-ui/styles/panes.less","node_modules/atom-dark-ui/styles/progress.less","node_modules/atom-dark-ui/styles/sites.less","node_modules/atom-dark-ui/styles/tabs.less","node_modules/atom-dark-ui/styles/text.less","node_modules/atom-dark-ui/styles/tooltips.less","node_modules/atom-dark-ui/styles/tree-view.less","node_modules/atom-dark-ui/styles/ui-mixins.less","node_modules/atom-dark-ui/styles/ui-variables.less","node_modules/atom-dark-ui/styles/utilities.less"],"static/variables":["static/variables/octicon-mixins.less","static/variables/octicon-utf-codes.less","static/variables/syntax-variables.less","static/variables/ui-variables.less"],"static":["static/atom.less","static/atomicons.woff","static/babelrc.json","static/cursors.less","static/docks.less","static/images/octocat-spinner-128.gif","static/images/transparent-background.gif","static/index.html","static/index.js","static/jasmine.less","static/linux.less","static/normalize.less","static/octicons-2.1.2.woff","static/octicons.less","static/octicons.woff","static/panels.less","static/panes.less","static/scaffolding.less","static/syntax.less","static/text-editor.less","static/title-bar.less","static/variables/octicon-mixins.less","static/variables/octicon-utf-codes.less","static/variables/syntax-variables.less","static/variables/ui-variables.less","static/workspace-view.less"],"node_modules/atom-light-syntax/styles":["node_modules/atom-light-syntax/styles/syntax-variables.less"],"node_modules/base16-tomorrow-dark-theme/styles":["node_modules/base16-tomorrow-dark-theme/styles/colors.less","node_modules/base16-tomorrow-dark-theme/styles/editor.less","node_modules/base16-tomorrow-dark-theme/styles/syntax/_base.less","node_modules/base16-tomorrow-dark-theme/styles/syntax/cs.less","node_modules/base16-tomorrow-dark-theme/styles/syntax/json.less","node_modules/base16-tomorrow-dark-theme/styles/syntax-variables.less"],"node_modules/base16-tomorrow-light-theme/styles":["node_modules/base16-tomorrow-light-theme/styles/colors.less","node_modules/base16-tomorrow-light-theme/styles/editor.less","node_modules/base16-tomorrow-light-theme/styles/syntax/_base.less","node_modules/base16-tomorrow-light-theme/styles/syntax/cs.less","node_modules/base16-tomorrow-light-theme/styles/syntax/json.less","node_modules/base16-tomorrow-light-theme/styles/syntax-variables.less"],"node_modules/one-dark-syntax/styles":["node_modules/one-dark-syntax/styles/colors.less","node_modules/one-dark-syntax/styles/editor.less","node_modules/one-dark-syntax/styles/syntax/_base.less","node_modules/one-dark-syntax/styles/syntax/c.less","node_modules/one-dark-syntax/styles/syntax/cpp.less","node_modules/one-dark-syntax/styles/syntax/cs.less","node_modules/one-dark-syntax/styles/syntax/css.less","node_modules/one-dark-syntax/styles/syntax/elixir.less","node_modules/one-dark-syntax/styles/syntax/gfm.less","node_modules/one-dark-syntax/styles/syntax/go.less","node_modules/one-dark-syntax/styles/syntax/ini.less","node_modules/one-dark-syntax/styles/syntax/java.less","node_modules/one-dark-syntax/styles/syntax/javascript.less","node_modules/one-dark-syntax/styles/syntax/json.less","node_modules/one-dark-syntax/styles/syntax/python.less","node_modules/one-dark-syntax/styles/syntax/ruby.less","node_modules/one-dark-syntax/styles/syntax-variables.less"],"node_modules/one-light-syntax/styles":["node_modules/one-light-syntax/styles/colors.less","node_modules/one-light-syntax/styles/editor.less","node_modules/one-light-syntax/styles/syntax/_base.less","node_modules/one-light-syntax/styles/syntax/c.less","node_modules/one-light-syntax/styles/syntax/cpp.less","node_modules/one-light-syntax/styles/syntax/cs.less","node_modules/one-light-syntax/styles/syntax/css.less","node_modules/one-light-syntax/styles/syntax/elixir.less","node_modules/one-light-syntax/styles/syntax/gfm.less","node_modules/one-light-syntax/styles/syntax/go.less","node_modules/one-light-syntax/styles/syntax/ini.less","node_modules/one-light-syntax/styles/syntax/java.less","node_modules/one-light-syntax/styles/syntax/javascript.less","node_modules/one-light-syntax/styles/syntax/json.less","node_modules/one-light-syntax/styles/syntax/python.less","node_modules/one-light-syntax/styles/syntax/ruby.less","node_modules/one-light-syntax/styles/syntax-variables.less"],"node_modules/solarized-dark-syntax/styles":["node_modules/solarized-dark-syntax/styles/colors.less","node_modules/solarized-dark-syntax/styles/editor.less","node_modules/solarized-dark-syntax/styles/syntax/_base.less","node_modules/solarized-dark-syntax/styles/syntax/c.less","node_modules/solarized-dark-syntax/styles/syntax/coffee.less","node_modules/solarized-dark-syntax/styles/syntax/css.less","node_modules/solarized-dark-syntax/styles/syntax/go.less","node_modules/solarized-dark-syntax/styles/syntax/java.less","node_modules/solarized-dark-syntax/styles/syntax/javascript.less","node_modules/solarized-dark-syntax/styles/syntax/markdown.less","node_modules/solarized-dark-syntax/styles/syntax/markup.less","node_modules/solarized-dark-syntax/styles/syntax/php.less","node_modules/solarized-dark-syntax/styles/syntax/python.less","node_modules/solarized-dark-syntax/styles/syntax/ruby.less","node_modules/solarized-dark-syntax/styles/syntax/scala.less","node_modules/solarized-dark-syntax/styles/syntax-variables.less"],"node_modules/solarized-light-syntax/styles":["node_modules/solarized-light-syntax/styles/colors.less","node_modules/solarized-light-syntax/styles/editor.less","node_modules/solarized-light-syntax/styles/syntax/_base.less","node_modules/solarized-light-syntax/styles/syntax/c.less","node_modules/solarized-light-syntax/styles/syntax/coffee.less","node_modules/solarized-light-syntax/styles/syntax/css.less","node_modules/solarized-light-syntax/styles/syntax/go.less","node_modules/solarized-light-syntax/styles/syntax/java.less","node_modules/solarized-light-syntax/styles/syntax/javascript.less","node_modules/solarized-light-syntax/styles/syntax/markdown.less","node_modules/solarized-light-syntax/styles/syntax/markup.less","node_modules/solarized-light-syntax/styles/syntax/php.less","node_modules/solarized-light-syntax/styles/syntax/python.less","node_modules/solarized-light-syntax/styles/syntax/ruby.less","node_modules/solarized-light-syntax/styles/syntax/scala.less","node_modules/solarized-light-syntax/styles/syntax-variables.less"],"node_modules/atom-light-ui/styles":["node_modules/atom-light-ui/styles/atom.less","node_modules/atom-light-ui/styles/buttons.less","node_modules/atom-light-ui/styles/editor.less","node_modules/atom-light-ui/styles/git.less","node_modules/atom-light-ui/styles/lists.less","node_modules/atom-light-ui/styles/messages.less","node_modules/atom-light-ui/styles/overlays.less","node_modules/atom-light-ui/styles/panels.less","node_modules/atom-light-ui/styles/panes.less","node_modules/atom-light-ui/styles/progress.less","node_modules/atom-light-ui/styles/sites.less","node_modules/atom-light-ui/styles/tabs.less","node_modules/atom-light-ui/styles/text.less","node_modules/atom-light-ui/styles/tooltips.less","node_modules/atom-light-ui/styles/tree-view.less","node_modules/atom-light-ui/styles/ui-mixins.less","node_modules/atom-light-ui/styles/ui-variables.less","node_modules/atom-light-ui/styles/utilities.less"],"node_modules/one-dark-ui/styles":["node_modules/one-dark-ui/styles/atom.less","node_modules/one-dark-ui/styles/badges.less","node_modules/one-dark-ui/styles/buttons.less","node_modules/one-dark-ui/styles/config.less","node_modules/one-dark-ui/styles/core.less","node_modules/one-dark-ui/styles/docks.less","node_modules/one-dark-ui/styles/dropdowns.less","node_modules/one-dark-ui/styles/editor.less","node_modules/one-dark-ui/styles/git.less","node_modules/one-dark-ui/styles/inputs.less","node_modules/one-dark-ui/styles/key-binding.less","node_modules/one-dark-ui/styles/lists.less","node_modules/one-dark-ui/styles/messages.less","node_modules/one-dark-ui/styles/modal.less","node_modules/one-dark-ui/styles/nav.less","node_modules/one-dark-ui/styles/notifications.less","node_modules/one-dark-ui/styles/packages.less","node_modules/one-dark-ui/styles/panels.less","node_modules/one-dark-ui/styles/panes.less","node_modules/one-dark-ui/styles/progress.less","node_modules/one-dark-ui/styles/settings.less","node_modules/one-dark-ui/styles/sites.less","node_modules/one-dark-ui/styles/status-bar.less","node_modules/one-dark-ui/styles/tabs.less","node_modules/one-dark-ui/styles/text.less","node_modules/one-dark-ui/styles/title-bar.less","node_modules/one-dark-ui/styles/tooltips.less","node_modules/one-dark-ui/styles/tree-view.less","node_modules/one-dark-ui/styles/ui-mixins.less","node_modules/one-dark-ui/styles/ui-variables-custom.less","node_modules/one-dark-ui/styles/ui-variables.less"],"node_modules/one-light-ui/styles":["node_modules/one-light-ui/styles/atom.less","node_modules/one-light-ui/styles/badges.less","node_modules/one-light-ui/styles/buttons.less","node_modules/one-light-ui/styles/config.less","node_modules/one-light-ui/styles/core.less","node_modules/one-light-ui/styles/docks.less","node_modules/one-light-ui/styles/dropdowns.less","node_modules/one-light-ui/styles/editor.less","node_modules/one-light-ui/styles/git.less","node_modules/one-light-ui/styles/inputs.less","node_modules/one-light-ui/styles/key-binding.less","node_modules/one-light-ui/styles/lists.less","node_modules/one-light-ui/styles/messages.less","node_modules/one-light-ui/styles/modal.less","node_modules/one-light-ui/styles/nav.less","node_modules/one-light-ui/styles/notifications.less","node_modules/one-light-ui/styles/packages.less","node_modules/one-light-ui/styles/panels.less","node_modules/one-light-ui/styles/panes.less","node_modules/one-light-ui/styles/progress.less","node_modules/one-light-ui/styles/settings.less","node_modules/one-light-ui/styles/sites.less","node_modules/one-light-ui/styles/status-bar.less","node_modules/one-light-ui/styles/tabs.less","node_modules/one-light-ui/styles/text.less","node_modules/one-light-ui/styles/title-bar.less","node_modules/one-light-ui/styles/tooltips.less","node_modules/one-light-ui/styles/tree-view.less","node_modules/one-light-ui/styles/ui-mixins.less","node_modules/one-light-ui/styles/ui-variables-custom.less","node_modules/one-light-ui/styles/ui-variables.less"]}};;
function generateSnapshot() {
let process = {};
Object.defineProperties(process, {
'platform': { value: 'darwin', enumerable: false },
'argv': { value: [], enumerable: false },
'env': { value: { 'NODE_ENV': 'production' }, enumerable: false }
});
function get_process() {
return process;
}
function createElement(_type) {
return {
innerHTML: '',
style: {}
};
}
let documentElement = {
textContent: '',
style: {
cssFloat: ''
}
};
let document = {};
Object.defineProperties(document, {
'createElement': { value: createElement, enumerable: false },
'addEventListener': { value: function () {}, enumerable: false },
'documentElement': { value: documentElement, enumerable: false },
'oninput': { value: {}, enumerable: false },
'onchange': { value: {}, enumerable: false }
});
function get_document() {
return document;
}
let global = {};
Object.defineProperties(global, {
'document': { value: document, enumerable: false },
'process': { value: process, enumerable: false },
'WeakMap': { value: WeakMap, enumerable: false },
'isGeneratingSnapshot': { value: true, enumerable: false }
});
function get_global() {
return global;
}
let window = {};
Object.defineProperties(window, {
'document': { value: document, enumerable: false },
'location': { value: { href: '' }, enumerable: false },
'addEventListener': { value: function () {}, enumerable: false },
'screen': { value: {}, enumerable: false }
});
function get_window() {
return window;
}
let console = {};
function consoleNoop() {
throw new Error('Cannot use `console` functions in the snapshot.');
}
Object.defineProperties(console, {
'debug': { value: consoleNoop, enumerable: false },
'error': { value: consoleNoop, enumerable: false },
'info': { value: consoleNoop, enumerable: false },
'log': { value: consoleNoop, enumerable: false },
'warn': { value: consoleNoop, enumerable: false },
'time': { value: consoleNoop, enumerable: false },
'timeEnd': { value: consoleNoop, enumerable: false }
});
function get_console() {
return console;
}
let require = moduleName => {
throw new Error(`Cannot require module "${moduleName}".\n` + "To use Node's require you need to call `snapshotResult.setGlobals` first!");
};
function customRequire(modulePath) {
let module = customRequire.cache[modulePath];
if (!module) {
module = { exports: {} };
const dirname = modulePath.split('/').slice(0, -1).join('/');
function define(callback) {
callback(customRequire, module.exports, module);
}
if (customRequire.definitions.hasOwnProperty(modulePath)) {
customRequire.cache[modulePath] = module;
customRequire.definitions[modulePath].apply(module.exports, [module.exports, module, modulePath, dirname, customRequire, define]);
} else {
module.exports = require(modulePath);
customRequire.cache[modulePath] = module;
}
}
return module.exports;
}
customRequire.extensions = {};
customRequire.cache = {};
customRequire.definitions = {
"../src/initialize-application-window.js": function (exports, module, __filename, __dirname, require, define) {
(function() {
var ApplicationDelegate, AtomEnvironment, Clipboard, CompileCache, FileSystemBlobStore, ModuleCache, NativeCompileCache, TextEditor, TextEditorComponent, clipboard;
AtomEnvironment = require("../src/atom-environment.js");
ApplicationDelegate = require("../src/application-delegate.js");
Clipboard = require("../src/clipboard.js");
TextEditor = require("../src/text-editor.js");
TextEditorComponent = require("../src/text-editor-component.js");
FileSystemBlobStore = require("../src/file-system-blob-store.js");
NativeCompileCache = require("../src/native-compile-cache.js");
CompileCache = require("../src/compile-cache.js");
ModuleCache = require("../src/module-cache.js");
if (get_global().isGeneratingSnapshot) {
require("../node_modules/about/lib/main.js");
require("../node_modules/archive-view/lib/archive-editor.js");
require("../node_modules/autocomplete-atom-api/lib/main.js");
require("../node_modules/autocomplete-css/lib/main.js");
require("../node_modules/autocomplete-html/lib/main.js");
require("../node_modules/autocomplete-plus/lib/main.js");
require("../node_modules/autocomplete-snippets/lib/autocomplete-snippets.js");
require("../node_modules/autoflow/lib/autoflow.js");
require("../node_modules/autosave/lib/autosave.js");
require("../node_modules/background-tips/lib/background-tips.js");
require("../node_modules/bookmarks/lib/main.js");
require("../node_modules/bracket-matcher/lib/main.js");
require("../node_modules/command-palette/lib/command-palette-package.js");
require("../node_modules/deprecation-cop/lib/main.js");
require("../node_modules/dev-live-reload/lib/main.js");
require("../node_modules/encoding-selector/lib/main.js");
require("../node_modules/exception-reporting/lib/main.js");
require("../node_modules/dalek/lib/main.js");
require("../node_modules/find-and-replace/lib/find.js");
require("../node_modules/fuzzy-finder/lib/main.js");
require("../node_modules/github/lib/index.js");
require("../node_modules/git-diff/lib/main.js");
require("../node_modules/go-to-line/lib/go-to-line-view.js");
require("../node_modules/grammar-selector/lib/main.js");
require("../node_modules/image-view/lib/main.js");
require("../node_modules/incompatible-packages/lib/main.js");
require("../node_modules/keybinding-resolver/lib/main.js");
require("../node_modules/line-ending-selector/lib/main.js");
require("../node_modules/link/lib/link.js");
require("../node_modules/markdown-preview/lib/main.js");
require("../node_modules/metrics/lib/metrics.js");
require("../node_modules/notifications/lib/main.js");
require("../node_modules/open-on-github/lib/main.js");
require("../node_modules/package-generator/lib/main.js");
require("../node_modules/settings-view/lib/main.js");
require("../node_modules/snippets/lib/snippets.js");
require("../node_modules/spell-check/lib/main.js");
require("../node_modules/status-bar/lib/main.js");
require("../node_modules/styleguide/lib/styleguide.js");
require("../node_modules/symbols-view/lib/main.js");
require("../node_modules/tabs/lib/main.js");
require("../node_modules/timecop/lib/main.js");
require("../node_modules/tree-view/lib/main.js");
require("../node_modules/update-package-dependencies/lib/update-package-dependencies.js");
require("../node_modules/welcome/lib/main.js");
require("../node_modules/whitespace/lib/main.js");
require("../node_modules/wrap-guide/lib/main.js");
}
clipboard = new Clipboard;
TextEditor.setClipboard(clipboard);
TextEditor.viewForItem = function(item) {
return atom.views.getView(item);
};
get_global().atom = new AtomEnvironment({
clipboard: clipboard,
applicationDelegate: new ApplicationDelegate,
enablePersistence: true
});
TextEditor.setScheduler(get_global().atom.views);
get_global().atom.preloadPackages();
module.exports = function(arg) {
var base, blobStore, devMode, env, exportsPath, getWindowLoadSettings, ipcRenderer, path, ref, resourcePath, updateProcessEnv;
blobStore = arg.blobStore;
updateProcessEnv = require("../src/update-process-env.js").updateProcessEnv;
path = require('path');
require("../src/window.js");
getWindowLoadSettings = require("../src/get-window-load-settings.js");
ipcRenderer = require('electron').ipcRenderer;
ref = getWindowLoadSettings(), resourcePath = ref.resourcePath, devMode = ref.devMode, env = ref.env;
require("../src/electron-shims.js");
exportsPath = path.join(resourcePath, 'exports');
require('module').globalPaths.push(exportsPath);
get_process().env.NODE_PATH = exportsPath;
if (!devMode) {
if ((base = get_process().env).NODE_ENV == null) {
base.NODE_ENV = 'production';
}
}
get_global().atom.initialize({
window: get_window(),
document: get_document(),
blobStore: blobStore,
configDirPath: get_process().env.ATOM_HOME,
env: get_process().env
});
return get_global().atom.startEditorWindow().then(function() {
var windowFocused;
windowFocused = function() {
get_window().removeEventListener('focus', windowFocused);
return setTimeout((function() {
return get_document().querySelector('atom-workspace').focus();
}), 0);
};
get_window().addEventListener('focus', windowFocused);
return ipcRenderer.on('environment', function(event, env) {
return updateProcessEnv(env);
});
});
};
}).call(this);
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiL1VzZXJzL2xlcm9peC9naXRodWIvYXRvbS9vdXQvYXBwL3NyYy9pbml0aWFsaXplLWFwcGxpY2F0aW9uLXdpbmRvdy5jb2ZmZWUiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7QUFBQSxNQUFBOztFQUFBLGVBQUEsR0FBa0IsT0FBQSxDQUFRLG9CQUFSOztFQUNsQixtQkFBQSxHQUFzQixPQUFBLENBQVEsd0JBQVI7O0VBQ3RCLFNBQUEsR0FBWSxPQUFBLENBQVEsYUFBUjs7RUFDWixVQUFBLEdBQWEsT0FBQSxDQUFRLGVBQVI7O0VBQ2IsbUJBQUEsR0FBc0IsT0FBQSxDQUFRLHlCQUFSOztFQUN0QixtQkFBQSxHQUFzQixPQUFBLENBQVEsMEJBQVI7O0VBQ3RCLGtCQUFBLEdBQXFCLE9BQUEsQ0FBUSx3QkFBUjs7RUFDckIsWUFBQSxHQUFlLE9BQUEsQ0FBUSxpQkFBUjs7RUFDZixXQUFBLEdBQWMsT0FBQSxDQUFRLGdCQUFSOztFQUVkLElBQUcsTUFBTSxDQUFDLG9CQUFWO0lBQ0UsT0FBQSxDQUFRLE9BQVI7SUFDQSxPQUFBLENBQVEsY0FBUjtJQUNBLE9BQUEsQ0FBUSx1QkFBUjtJQUNBLE9BQUEsQ0FBUSxrQkFBUjtJQUNBLE9BQUEsQ0FBUSxtQkFBUjtJQUNBLE9BQUEsQ0FBUSxtQkFBUjtJQUNBLE9BQUEsQ0FBUSx1QkFBUjtJQUNBLE9BQUEsQ0FBUSxVQUFSO0lBQ0EsT0FBQSxDQUFRLFVBQVI7SUFDQSxPQUFBLENBQVEsaUJBQVI7SUFDQSxPQUFBLENBQVEsV0FBUjtJQUNBLE9BQUEsQ0FBUSxpQkFBUjtJQUNBLE9BQUEsQ0FBUSxpQkFBUjtJQUNBLE9BQUEsQ0FBUSxpQkFBUjtJQUNBLE9BQUEsQ0FBUSxpQkFBUjtJQUNBLE9BQUEsQ0FBUSxtQkFBUjtJQUNBLE9BQUEsQ0FBUSxxQkFBUjtJQUNBLE9BQUEsQ0FBUSxPQUFSO0lBQ0EsT0FBQSxDQUFRLGtCQUFSO0lBQ0EsT0FBQSxDQUFRLGNBQVI7SUFDQSxPQUFBLENBQVEsUUFBUjtJQUNBLE9BQUEsQ0FBUSxVQUFSO0lBQ0EsT0FBQSxDQUFRLFlBQVI7SUFDQSxPQUFBLENBQVEsa0JBQVI7SUFDQSxPQUFBLENBQVEsWUFBUjtJQUNBLE9BQUEsQ0FBUSx1QkFBUjtJQUNBLE9BQUEsQ0FBUSxxQkFBUjtJQUNBLE9BQUEsQ0FBUSxzQkFBUjtJQUNBLE9BQUEsQ0FBUSxNQUFSO0lBQ0EsT0FBQSxDQUFRLGtCQUFSO0lBQ0EsT0FBQSxDQUFRLFNBQVI7SUFDQSxPQUFBLENBQVEsZUFBUjtJQUNBLE9BQUEsQ0FBUSxnQkFBUjtJQUNBLE9BQUEsQ0FBUSxtQkFBUjtJQUNBLE9BQUEsQ0FBUSxlQUFSO0lBQ0EsT0FBQSxDQUFRLFVBQVI7SUFDQSxPQUFBLENBQVEsYUFBUjtJQUNBLE9BQUEsQ0FBUSxZQUFSO0lBQ0EsT0FBQSxDQUFRLFlBQVI7SUFDQSxPQUFBLENBQVEsY0FBUjtJQUNBLE9BQUEsQ0FBUSxNQUFSO0lBQ0EsT0FBQSxDQUFRLFNBQVI7SUFDQSxPQUFBLENBQVEsV0FBUjtJQUNBLE9BQUEsQ0FBUSw2QkFBUjtJQUNBLE9BQUEsQ0FBUSxTQUFSO0lBQ0EsT0FBQSxDQUFRLFlBQVI7SUFDQSxPQUFBLENBQVEsWUFBUixFQS9DRjs7O0VBaURBLFNBQUEsR0FBWSxJQUFJOztFQUNoQixVQUFVLENBQUMsWUFBWCxDQUF3QixTQUF4Qjs7RUFDQSxVQUFVLENBQUMsV0FBWCxHQUF5QixTQUFDLElBQUQ7V0FBVSxJQUFJLENBQUMsS0FBSyxDQUFDLE9BQVgsQ0FBbUIsSUFBbkI7RUFBVjs7RUFFekIsTUFBTSxDQUFDLElBQVAsR0FBYyxJQUFJLGVBQUosQ0FBb0I7SUFDaEMsV0FBQSxTQURnQztJQUVoQyxtQkFBQSxFQUFxQixJQUFJLG1CQUZPO0lBR2hDLGlCQUFBLEVBQW1CLElBSGE7R0FBcEI7O0VBTWQsVUFBVSxDQUFDLFlBQVgsQ0FBd0IsTUFBTSxDQUFDLElBQUksQ0FBQyxLQUFwQzs7RUFDQSxNQUFNLENBQUMsSUFBSSxDQUFDLGVBQVosQ0FBQTs7RUFHQSxNQUFNLENBQUMsT0FBUCxHQUFpQixTQUFDLEdBQUQ7QUFDZixRQUFBO0lBRGlCLFlBQUQ7SUFDZixtQkFBb0IsT0FBQSxDQUFRLHNCQUFSO0lBQ3JCLElBQUEsR0FBTyxPQUFBLENBQVEsTUFBUjtJQUNQLE9BQUEsQ0FBUSxVQUFSO0lBQ0EscUJBQUEsR0FBd0IsT0FBQSxDQUFRLDRCQUFSO0lBQ3ZCLGNBQWUsT0FBQSxDQUFRLFVBQVI7SUFDaEIsTUFBK0IscUJBQUEsQ0FBQSxDQUEvQixFQUFDLCtCQUFELEVBQWUscUJBQWYsRUFBd0I7SUFDeEIsT0FBQSxDQUFRLGtCQUFSO0lBR0EsV0FBQSxHQUFjLElBQUksQ0FBQyxJQUFMLENBQVUsWUFBVixFQUF3QixTQUF4QjtJQUNkLE9BQUEsQ0FBUSxRQUFSLENBQWlCLENBQUMsV0FBVyxDQUFDLElBQTlCLENBQW1DLFdBQW5DO0lBQ0EsT0FBTyxDQUFDLEdBQUcsQ0FBQyxTQUFaLEdBQXdCO0lBR3hCLElBQUEsQ0FBNEMsT0FBNUM7O1lBQVcsQ0FBQyxXQUFZO09BQXhCOztJQUVBLE1BQU0sQ0FBQyxJQUFJLENBQUMsVUFBWixDQUF1QjtNQUNyQixRQUFBLE1BRHFCO01BQ2IsVUFBQSxRQURhO01BQ0gsV0FBQSxTQURHO01BRXJCLGFBQUEsRUFBZSxPQUFPLENBQUMsR0FBRyxDQUFDLFNBRk47TUFHckIsR0FBQSxFQUFLLE9BQU8sQ0FBQyxHQUhRO0tBQXZCO1dBTUEsTUFBTSxDQUFDLElBQUksQ0FBQyxpQkFBWixDQUFBLENBQStCLENBQUMsSUFBaEMsQ0FBcUMsU0FBQTtBQUVuQyxVQUFBO01BQUEsYUFBQSxHQUFnQixTQUFBO1FBQ2QsTUFBTSxDQUFDLG1CQUFQLENBQTJCLE9BQTNCLEVBQW9DLGFBQXBDO2VBQ0EsVUFBQSxDQUFXLENBQUMsU0FBQTtpQkFBRyxRQUFRLENBQUMsYUFBVCxDQUF1QixnQkFBdkIsQ0FBd0MsQ0FBQyxLQUF6QyxDQUFBO1FBQUgsQ0FBRCxDQUFYLEVBQWtFLENBQWxFO01BRmM7TUFHaEIsTUFBTSxDQUFDLGdCQUFQLENBQXdCLE9BQXhCLEVBQWlDLGFBQWpDO2FBQ0EsV0FBVyxDQUFDLEVBQVosQ0FBZSxhQUFmLEVBQThCLFNBQUMsS0FBRCxFQUFRLEdBQVI7ZUFDNUIsZ0JBQUEsQ0FBaUIsR0FBakI7TUFENEIsQ0FBOUI7SUFObUMsQ0FBckM7RUF2QmU7QUF6RWpCIiwic291cmNlc0NvbnRlbnQiOlsiQXRvbUVudmlyb25tZW50ID0gcmVxdWlyZSAnLi9hdG9tLWVudmlyb25tZW50J1xuQXBwbGljYXRpb25EZWxlZ2F0ZSA9IHJlcXVpcmUgJy4vYXBwbGljYXRpb24tZGVsZWdhdGUnXG5DbGlwYm9hcmQgPSByZXF1aXJlICcuL2NsaXBib2FyZCdcblRleHRFZGl0b3IgPSByZXF1aXJlICcuL3RleHQtZWRpdG9yJ1xuVGV4dEVkaXRvckNvbXBvbmVudCA9IHJlcXVpcmUgJy4vdGV4dC1lZGl0b3ItY29tcG9uZW50J1xuRmlsZVN5c3RlbUJsb2JTdG9yZSA9IHJlcXVpcmUgJy4vZmlsZS1zeXN0ZW0tYmxvYi1zdG9yZSdcbk5hdGl2ZUNvbXBpbGVDYWNoZSA9IHJlcXVpcmUgJy4vbmF0aXZlLWNvbXBpbGUtY2FjaGUnXG5Db21waWxlQ2FjaGUgPSByZXF1aXJlICcuL2NvbXBpbGUtY2FjaGUnXG5Nb2R1bGVDYWNoZSA9IHJlcXVpcmUgJy4vbW9kdWxlLWNhY2hlJ1xuXG5pZiBnbG9iYWwuaXNHZW5lcmF0aW5nU25hcHNob3RcbiAgcmVxdWlyZSgnYWJvdXQnKVxuICByZXF1aXJlKCdhcmNoaXZlLXZpZXcnKVxuICByZXF1aXJlKCdhdXRvY29tcGxldGUtYXRvbS1hcGknKVxuICByZXF1aXJlKCdhdXRvY29tcGxldGUtY3NzJylcbiAgcmVxdWlyZSgnYXV0b2NvbXBsZXRlLWh0bWwnKVxuICByZXF1aXJlKCdhdXRvY29tcGxldGUtcGx1cycpXG4gIHJlcXVpcmUoJ2F1dG9jb21wbGV0ZS1zbmlwcGV0cycpXG4gIHJlcXVpcmUoJ2F1dG9mbG93JylcbiAgcmVxdWlyZSgnYXV0b3NhdmUnKVxuICByZXF1aXJlKCdiYWNrZ3JvdW5kLXRpcHMnKVxuICByZXF1aXJlKCdib29rbWFya3MnKVxuICByZXF1aXJlKCdicmFja2V0LW1hdGNoZXInKVxuICByZXF1aXJlKCdjb21tYW5kLXBhbGV0dGUnKVxuICByZXF1aXJlKCdkZXByZWNhdGlvbi1jb3AnKVxuICByZXF1aXJlKCdkZXYtbGl2ZS1yZWxvYWQnKVxuICByZXF1aXJlKCdlbmNvZGluZy1zZWxlY3RvcicpXG4gIHJlcXVpcmUoJ2V4Y2VwdGlvbi1yZXBvcnRpbmcnKVxuICByZXF1aXJlKCdkYWxlaycpXG4gIHJlcXVpcmUoJ2ZpbmQtYW5kLXJlcGxhY2UnKVxuICByZXF1aXJlKCdmdXp6eS1maW5kZXInKVxuICByZXF1aXJlKCdnaXRodWInKVxuICByZXF1aXJlKCdnaXQtZGlmZicpXG4gIHJlcXVpcmUoJ2dvLXRvLWxpbmUnKVxuICByZXF1aXJlKCdncmFtbWFyLXNlbGVjdG9yJylcbiAgcmVxdWlyZSgnaW1hZ2UtdmlldycpXG4gIHJlcXVpcmUoJ2luY29tcGF0aWJsZS1wYWNrYWdlcycpXG4gIHJlcXVpcmUoJ2tleWJpbmRpbmctcmVzb2x2ZXInKVxuICByZXF1aXJlKCdsaW5lLWVuZGluZy1zZWxlY3RvcicpXG4gIHJlcXVpcmUoJ2xpbmsnKVxuICByZXF1aXJlKCdtYXJrZG93bi1wcmV2aWV3JylcbiAgcmVxdWlyZSgnbWV0cmljcycpXG4gIHJlcXVpcmUoJ25vdGlmaWNhdGlvbnMnKVxuICByZXF1aXJlKCdvcGVuLW9uLWdpdGh1YicpXG4gIHJlcXVpcmUoJ3BhY2thZ2UtZ2VuZXJhdG9yJylcbiAgcmVxdWlyZSgnc2V0dGluZ3MtdmlldycpXG4gIHJlcXVpcmUoJ3NuaXBwZXRzJylcbiAgcmVxdWlyZSgnc3BlbGwtY2hlY2snKVxuICByZXF1aXJlKCdzdGF0dXMtYmFyJylcbiAgcmVxdWlyZSgnc3R5bGVndWlkZScpXG4gIHJlcXVpcmUoJ3N5bWJvbHMtdmlldycpXG4gIHJlcXVpcmUoJ3RhYnMnKVxuICByZXF1aXJlKCd0aW1lY29wJylcbiAgcmVxdWlyZSgndHJlZS12aWV3JylcbiAgcmVxdWlyZSgndXBkYXRlLXBhY2thZ2UtZGVwZW5kZW5jaWVzJylcbiAgcmVxdWlyZSgnd2VsY29tZScpXG4gIHJlcXVpcmUoJ3doaXRlc3BhY2UnKVxuICByZXF1aXJlKCd3cmFwLWd1aWRlJylcblxuY2xpcGJvYXJkID0gbmV3IENsaXBib2FyZFxuVGV4dEVkaXRvci5zZXRDbGlwYm9hcmQoY2xpcGJvYXJkKVxuVGV4dEVkaXRvci52aWV3Rm9ySXRlbSA9IChpdGVtKSAtPiBhdG9tLnZpZXdzLmdldFZpZXcoaXRlbSlcblxuZ2xvYmFsLmF0b20gPSBuZXcgQXRvbUVudmlyb25tZW50KHtcbiAgY2xpcGJvYXJkLFxuICBhcHBsaWNhdGlvbkRlbGVnYXRlOiBuZXcgQXBwbGljYXRpb25EZWxlZ2F0ZSxcbiAgZW5hYmxlUGVyc2lzdGVuY2U6IHRydWVcbn0pXG5cblRleHRFZGl0b3Iuc2V0U2NoZWR1bGVyKGdsb2JhbC5hdG9tLnZpZXdzKVxuZ2xvYmFsLmF0b20ucHJlbG9hZFBhY2thZ2VzKClcblxuIyBMaWtlIHNhbmRzIHRocm91Z2ggdGhlIGhvdXJnbGFzcywgc28gYXJlIHRoZSBkYXlzIG9mIG91ciBsaXZlcy5cbm1vZHVsZS5leHBvcnRzID0gKHtibG9iU3RvcmV9KSAtPlxuICB7dXBkYXRlUHJvY2Vzc0Vudn0gPSByZXF1aXJlKCcuL3VwZGF0ZS1wcm9jZXNzLWVudicpXG4gIHBhdGggPSByZXF1aXJlICdwYXRoJ1xuICByZXF1aXJlICcuL3dpbmRvdydcbiAgZ2V0V2luZG93TG9hZFNldHRpbmdzID0gcmVxdWlyZSAnLi9nZXQtd2luZG93LWxvYWQtc2V0dGluZ3MnXG4gIHtpcGNSZW5kZXJlcn0gPSByZXF1aXJlICdlbGVjdHJvbidcbiAge3Jlc291cmNlUGF0aCwgZGV2TW9kZSwgZW52fSA9IGdldFdpbmRvd0xvYWRTZXR0aW5ncygpXG4gIHJlcXVpcmUgJy4vZWxlY3Ryb24tc2hpbXMnXG5cbiAgIyBBZGQgYXBwbGljYXRpb24tc3BlY2lmaWMgZXhwb3J0cyB0byBtb2R1bGUgc2VhcmNoIHBhdGguXG4gIGV4cG9ydHNQYXRoID0gcGF0aC5qb2luKHJlc291cmNlUGF0aCwgJ2V4cG9ydHMnKVxuICByZXF1aXJlKCdtb2R1bGUnKS5nbG9iYWxQYXRocy5wdXNoKGV4cG9ydHNQYXRoKVxuICBwcm9jZXNzLmVudi5OT0RFX1BBVEggPSBleHBvcnRzUGF0aFxuXG4gICMgTWFrZSBSZWFjdCBmYXN0ZXJcbiAgcHJvY2Vzcy5lbnYuTk9ERV9FTlYgPz0gJ3Byb2R1Y3Rpb24nIHVubGVzcyBkZXZNb2RlXG5cbiAgZ2xvYmFsLmF0b20uaW5pdGlhbGl6ZSh7XG4gICAgd2luZG93LCBkb2N1bWVudCwgYmxvYlN0b3JlLFxuICAgIGNvbmZpZ0RpclBhdGg6IHByb2Nlc3MuZW52LkFUT01fSE9NRSxcbiAgICBlbnY6IHByb2Nlc3MuZW52XG4gIH0pXG5cbiAgZ2xvYmFsLmF0b20uc3RhcnRFZGl0b3JXaW5kb3coKS50aGVuIC0+XG4gICAgIyBXb3JrYXJvdW5kIGZvciBmb2N1cyBnZXR0aW5nIGNsZWFyZWQgdXBvbiB3aW5kb3cgY3JlYXRpb25cbiAgICB3aW5kb3dGb2N1c2VkID0gLT5cbiAgICAgIHdpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCdmb2N1cycsIHdpbmRvd0ZvY3VzZWQpXG4gICAgICBzZXRUaW1lb3V0ICgtPiBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCdhdG9tLXdvcmtzcGFjZScpLmZvY3VzKCkpLCAwXG4gICAgd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoJ2ZvY3VzJywgd2luZG93Rm9jdXNlZClcbiAgICBpcGNSZW5kZXJlci5vbignZW52aXJvbm1lbnQnLCAoZXZlbnQsIGVudikgLT5cbiAgICAgIHVwZGF0ZVByb2Nlc3NFbnYoZW52KVxuICAgIClcbiJdfQ==
},
"../src/atom-environment.js": function (exports, module, __filename, __dirname, require, define) {
let crypto;
function get_crypto() {
return crypto = crypto || require('crypto');
}
let path;
function get_path() {
return path = path || require('path');
}
let {ipcRenderer} = {};
function get_ipcRenderer() {
return ipcRenderer = ipcRenderer || require('electron').ipcRenderer;
}
const _ = require("../node_modules/underscore-plus/lib/underscore-plus.js")
const {deprecate} = require("../node_modules/grim/lib/grim.js")
const {CompositeDisposable, Disposable, Emitter} = require("../node_modules/event-kit/lib/event-kit.js")
const fs = require("../node_modules/fs-plus/lib/fs-plus.js")
const {mapSourcePosition} = require("../node_modules/@atom/source-map-support/source-map-support.js")
const WindowEventHandler = require("../src/window-event-handler.js")
const StateStore = require("../src/state-store.js")
const StorageFolder = require("../src/storage-folder.js")
const registerDefaultCommands = require("../src/register-default-commands.js")
const {updateProcessEnv} = require("../src/update-process-env.js")
const ConfigSchema = require("../src/config-schema.js")
const DeserializerManager = require("../src/deserializer-manager.js")
const ViewRegistry = require("../src/view-registry.js")
const NotificationManager = require("../src/notification-manager.js")
const Config = require("../src/config.js")
const KeymapManager = require("../src/keymap-extensions.js")
const TooltipManager = require("../src/tooltip-manager.js")
const CommandRegistry = require("../src/command-registry.js")
const URIHandlerRegistry = require("../src/uri-handler-registry.js")
const GrammarRegistry = require("../src/grammar-registry.js")
const {HistoryManager} = require("../src/history-manager.js")
const ReopenProjectMenuManager = require("../src/reopen-project-menu-manager.js")
const StyleManager = require("../src/style-manager.js")
const PackageManager = require("../src/package-manager.js")
const ThemeManager = require("../src/theme-manager.js")
const MenuManager = require("../src/menu-manager.js")
const ContextMenuManager = require("../src/context-menu-manager.js")
const CommandInstaller = require("../src/command-installer.js")
const CoreURIHandlers = require("../src/core-uri-handlers.js")
const ProtocolHandlerInstaller = require("../src/protocol-handler-installer.js")
const Project = require("../src/project.js")
const TitleBar = require("../src/title-bar.js")
const Workspace = require("../src/workspace.js")
const PaneContainer = require("../src/pane-container.js")
const PaneAxis = require("../src/pane-axis.js")
const Pane = require("../src/pane.js")
const Dock = require("../src/dock.js")
const TextEditor = require("../src/text-editor.js")
const TextBuffer = require("../node_modules/text-buffer/lib/text-buffer.js")
const TextEditorRegistry = require("../src/text-editor-registry.js")
const AutoUpdateManager = require("../src/auto-update-manager.js")
let nextId = 0
// Essential: Atom global for dealing with packages, themes, menus, and the window.
//
// An instance of this class is always available as the `atom` global.
class AtomEnvironment {
/*
Section: Construction and Destruction
*/
// Call .loadOrCreate instead
constructor (params = {}) {
this.id = (params.id != null) ? params.id : nextId++
this.clipboard = params.clipboard
this.updateProcessEnv = params.updateProcessEnv || updateProcessEnv
this.enablePersistence = params.enablePersistence
this.applicationDelegate = params.applicationDelegate
this.nextProxyRequestId = 0
this.unloaded = false
this.loadTime = null
this.emitter = new Emitter()
this.disposables = new CompositeDisposable()
this.deserializers = new DeserializerManager(this)
this.deserializeTimings = {}
this.views = new ViewRegistry(this)
this.notifications = new NotificationManager()
this.stateStore = new StateStore('AtomEnvironments', 1)
this.config = new Config({
notificationManager: this.notifications,
enablePersistence: this.enablePersistence
})
this.config.setSchema(null, {type: 'object', properties: _.clone(ConfigSchema)})
this.keymaps = new KeymapManager({notificationManager: this.notifications})
this.tooltips = new TooltipManager({keymapManager: this.keymaps, viewRegistry: this.views})
this.commands = new CommandRegistry()
this.uriHandlerRegistry = new URIHandlerRegistry()
this.grammars = new GrammarRegistry({config: this.config})
this.styles = new StyleManager()
this.packages = new PackageManager({
config: this.config,
styleManager: this.styles,
commandRegistry: this.commands,
keymapManager: this.keymaps,
notificationManager: this.notifications,
grammarRegistry: this.grammars,
deserializerManager: this.deserializers,
viewRegistry: this.views,
uriHandlerRegistry: this.uriHandlerRegistry
})
this.themes = new ThemeManager({
packageManager: this.packages,
config: this.config,
styleManager: this.styles,
notificationManager: this.notifications,
viewRegistry: this.views
})
this.menu = new MenuManager({keymapManager: this.keymaps, packageManager: this.packages})
this.contextMenu = new ContextMenuManager({keymapManager: this.keymaps})
this.packages.setMenuManager(this.menu)
this.packages.setContextMenuManager(this.contextMenu)
this.packages.setThemeManager(this.themes)
this.project = new Project({
notificationManager: this.notifications,
packageManager: this.packages,
grammarRegistry: this.grammars,
config: this.config,
applicationDelegate: this.applicationDelegate
})
this.commandInstaller = new CommandInstaller(this.applicationDelegate)
this.protocolHandlerInstaller = new ProtocolHandlerInstaller()
this.textEditors = new TextEditorRegistry({
config: this.config,
grammarRegistry: this.grammars,
assert: this.assert.bind(this),
packageManager: this.packages
})
this.workspace = new Workspace({
config: this.config,
project: this.project,
packageManager: this.packages,
grammarRegistry: this.grammars,
deserializerManager: this.deserializers,
notificationManager: this.notifications,
applicationDelegate: this.applicationDelegate,
viewRegistry: this.views,
assert: this.assert.bind(this),
textEditorRegistry: this.textEditors,
styleManager: this.styles,
enablePersistence: this.enablePersistence
})
this.themes.workspace = this.workspace
this.autoUpdater = new AutoUpdateManager({applicationDelegate: this.applicationDelegate})
if (this.keymaps.canLoadBundledKeymapsFromMemory()) {
this.keymaps.loadBundledKeymaps()
}
this.registerDefaultCommands()
this.registerDefaultOpeners()
this.registerDefaultDeserializers()
this.windowEventHandler = new WindowEventHandler({atomEnvironment: this, applicationDelegate: this.applicationDelegate})
this.history = new HistoryManager({project: this.project, commands: this.commands, stateStore: this.stateStore})
// Keep instances of HistoryManager in sync
this.disposables.add(this.history.onDidChangeProjects(event => {
if (!event.reloaded) this.applicationDelegate.didChangeHistoryManager()
}))
}
initialize (params = {}) {
// This will force TextEditorElement to register the custom element, so that
// using `document.createElement('atom-text-editor')` works if it's called
// before opening a buffer.
require("../src/text-editor-element.js")
this.window = params.window
this.document = params.document
this.blobStore = params.blobStore
this.configDirPath = params.configDirPath
const {devMode, safeMode, resourcePath, clearWindowState} = this.getLoadSettings()
if (clearWindowState) {
this.getStorageFolder().clear()
this.stateStore.clear()
}
ConfigSchema.projectHome = {
type: 'string',
default: get_path().join(fs.getHomeDirectory(), 'github'),
description: 'The directory where projects are assumed to be located. Packages created using the Package Generator will be stored here by default.'
}
this.config.initialize({configDirPath: this.configDirPath, resourcePath, projectHomeSchema: ConfigSchema.projectHome})
this.menu.initialize({resourcePath})
this.contextMenu.initialize({resourcePath, devMode})
this.keymaps.configDirPath = this.configDirPath
this.keymaps.resourcePath = resourcePath
this.keymaps.devMode = devMode
if (!this.keymaps.canLoadBundledKeymapsFromMemory()) {
this.keymaps.loadBundledKeymaps()
}
this.commands.attach(this.window)
this.styles.initialize({configDirPath: this.configDirPath})
this.packages.initialize({devMode, configDirPath: this.configDirPath, resourcePath, safeMode})
this.themes.initialize({configDirPath: this.configDirPath, resourcePath, safeMode, devMode})
this.commandInstaller.initialize(this.getVersion())
this.protocolHandlerInstaller.initialize(this.config, this.notifications)
this.uriHandlerRegistry.registerHostHandler('core', CoreURIHandlers.create(this))
this.autoUpdater.initialize()
this.config.load()
this.themes.loadBaseStylesheets()
this.initialStyleElements = this.styles.getSnapshot()
if (params.onlyLoadBaseStyleSheets) this.themes.initialLoadComplete = true
this.setBodyPlatformClass()
this.stylesElement = this.styles.buildStylesElement()
this.document.head.appendChild(this.stylesElement)
this.keymaps.subscribeToFileReadFailure()
this.installUncaughtErrorHandler()
this.attachSaveStateListeners()
this.windowEventHandler.initialize(this.window, this.document)
const didChangeStyles = this.didChangeStyles.bind(this)
this.disposables.add(this.styles.onDidAddStyleElement(didChangeStyles))
this.disposables.add(this.styles.onDidUpdateStyleElement(didChangeStyles))
this.disposables.add(this.styles.onDidRemoveStyleElement(didChangeStyles))
this.observeAutoHideMenuBar()
this.disposables.add(this.applicationDelegate.onDidChangeHistoryManager(() => this.history.loadState()))
}
preloadPackages () {
return this.packages.preloadPackages()
}
attachSaveStateListeners () {
const saveState = _.debounce(() => {
this.window.requestIdleCallback(() => {
if (!this.unloaded) this.saveState({isUnloading: false})
})
}, this.saveStateDebounceInterval)
this.document.addEventListener('mousedown', saveState, true)
this.document.addEventListener('keydown', saveState, true)
this.disposables.add(new Disposable(() => {
this.document.removeEventListener('mousedown', saveState, true)
this.document.removeEventListener('keydown', saveState, true)
}))
}
registerDefaultDeserializers () {
this.deserializers.add(Workspace)
this.deserializers.add(PaneContainer)
this.deserializers.add(PaneAxis)
this.deserializers.add(Pane)
this.deserializers.add(Dock)
this.deserializers.add(Project)
this.deserializers.add(TextEditor)
this.deserializers.add(TextBuffer)
}
registerDefaultCommands () {
registerDefaultCommands({commandRegistry: this.commands, config: this.config, commandInstaller: this.commandInstaller, notificationManager: this.notifications, project: this.project, clipboard: this.clipboard})
}
registerDefaultOpeners () {
this.workspace.addOpener(uri => {
switch (uri) {
case 'atom://.atom/stylesheet':
return this.workspace.openTextFile(this.styles.getUserStyleSheetPath())
case 'atom://.atom/keymap':
return this.workspace.openTextFile(this.keymaps.getUserKeymapPath())
case 'atom://.atom/config':
return this.workspace.openTextFile(this.config.getUserConfigPath())
case 'atom://.atom/init-script':
return this.workspace.openTextFile(this.getUserInitScriptPath())
}
})
}
registerDefaultTargetForKeymaps () {
this.keymaps.defaultTarget = this.workspace.getElement()
}
observeAutoHideMenuBar () {
this.disposables.add(this.config.onDidChange('core.autoHideMenuBar', ({newValue}) => {
this.setAutoHideMenuBar(newValue)
}))
if (this.config.get('core.autoHideMenuBar')) this.setAutoHideMenuBar(true)
}
async reset () {
this.deserializers.clear()
this.registerDefaultDeserializers()
this.config.clear()
this.config.setSchema(null, {type: 'object', properties: _.clone(ConfigSchema)})
this.keymaps.clear()
this.keymaps.loadBundledKeymaps()
this.commands.clear()
this.registerDefaultCommands()
this.styles.restoreSnapshot(this.initialStyleElements)
this.menu.clear()
this.clipboard.reset()
this.notifications.clear()
this.contextMenu.clear()
await this.packages.reset()
this.workspace.reset(this.packages)
this.registerDefaultOpeners()
this.project.reset(this.packages)
this.workspace.subscribeToEvents()
this.grammars.clear()
this.textEditors.clear()
this.views.clear()
}
destroy () {
if (!this.project) return
this.disposables.dispose()
if (this.workspace) this.workspace.destroy()
this.workspace = null
this.themes.workspace = null
if (this.project) this.project.destroy()
this.project = null
this.commands.clear()
this.stylesElement.remove()
this.config.unobserveUserConfig()
this.autoUpdater.destroy()
this.uriHandlerRegistry.destroy()
this.uninstallWindowEventHandler()
}
/*
Section: Event Subscription
*/
// Extended: Invoke the given callback whenever {::beep} is called.
//
// * `callback` {Function} to be called whenever {::beep} is called.
//
// Returns a {Disposable} on which `.dispose()` can be called to unsubscribe.
onDidBeep (callback) {
return this.emitter.on('did-beep', callback)
}
// Extended: Invoke the given callback when there is an unhandled error, but
// before the devtools pop open
//
// * `callback` {Function} to be called whenever there is an unhandled error
// * `event` {Object}
// * `originalError` {Object} the original error object
// * `message` {String} the original error object
// * `url` {String} Url to the file where the error originated.
// * `line` {Number}
// * `column` {Number}
// * `preventDefault` {Function} call this to avoid popping up the dev tools.
//
// Returns a {Disposable} on which `.dispose()` can be called to unsubscribe.
onWillThrowError (callback) {
return this.emitter.on('will-throw-error', callback)
}
// Extended: Invoke the given callback whenever there is an unhandled error.
//
// * `callback` {Function} to be called whenever there is an unhandled error
// * `event` {Object}
// * `originalError` {Object} the original error object
// * `message` {String} the original error object
// * `url` {String} Url to the file where the error originated.
// * `line` {Number}
// * `column` {Number}
//
// Returns a {Disposable} on which `.dispose()` can be called to unsubscribe.
onDidThrowError (callback) {
return this.emitter.on('did-throw-error', callback)
}
// TODO: Make this part of the public API. We should make onDidThrowError
// match the interface by only yielding an exception object to the handler
// and deprecating the old behavior.
onDidFailAssertion (callback) {
return this.emitter.on('did-fail-assertion', callback)
}
// Extended: Invoke the given callback as soon as the shell environment is
// loaded (or immediately if it was already loaded).
//
// * `callback` {Function} to be called whenever there is an unhandled error
whenShellEnvironmentLoaded (callback) {
if (this.shellEnvironmentLoaded) {
callback()
return new Disposable()
} else {
return this.emitter.once('loaded-shell-environment', callback)
}
}
/*
Section: Atom Details
*/
// Public: Returns a {Boolean} that is `true` if the current window is in development mode.
inDevMode () {
if (this.devMode == null) this.devMode = this.getLoadSettings().devMode
return this.devMode
}
// Public: Returns a {Boolean} that is `true` if the current window is in safe mode.
inSafeMode () {
if (this.safeMode == null) this.safeMode = this.getLoadSettings().safeMode
return this.safeMode
}
// Public: Returns a {Boolean} that is `true` if the current window is running specs.
inSpecMode () {
if (this.specMode == null) this.specMode = this.getLoadSettings().isSpec
return this.specMode
}
// Returns a {Boolean} indicating whether this the first time the window's been
// loaded.
isFirstLoad () {
if (this.firstLoad == null) this.firstLoad = this.getLoadSettings().firstLoad
return this.firstLoad
}
// Public: Get the version of the Atom application.
//
// Returns the version text {String}.
getVersion () {
if (this.appVersion == null) this.appVersion = this.getLoadSettings().appVersion
return this.appVersion
}
// Public: Gets the release channel of the Atom application.
//
// Returns the release channel as a {String}. Will return one of `dev`, `beta`, or `stable`.
getReleaseChannel () {
const version = this.getVersion()
if (version.includes('beta')) {
return 'beta'
} else if (version.includes('dev')) {
return 'dev'
} else {
return 'stable'
}
}
// Public: Returns a {Boolean} that is `true` if the current version is an official release.
isReleasedVersion () {
return !/\w{7}/.test(this.getVersion()) // Check if the release is a 7-character SHA prefix
}
// Public: Get the time taken to completely load the current window.
//
// This time include things like loading and activating packages, creating
// DOM elements for the editor, and reading the config.
//
// Returns the {Number} of milliseconds taken to load the window or null
// if the window hasn't finished loading yet.
getWindowLoadTime () {
return this.loadTime
}
// Public: Get the load settings for the current window.
//
// Returns an {Object} containing all the load setting key/value pairs.
getLoadSettings () {
return this.applicationDelegate.getWindowLoadSettings()
}
/*
Section: Managing The Atom Window
*/
// Essential: Open a new Atom window using the given options.
//
// Calling this method without an options parameter will open a prompt to pick
// a file/folder to open in the new window.
//
// * `params` An {Object} with the following keys:
// * `pathsToOpen` An {Array} of {String} paths to open.
// * `newWindow` A {Boolean}, true to always open a new window instead of
// reusing existing windows depending on the paths to open.
// * `devMode` A {Boolean}, true to open the window in development mode.
// Development mode loads the Atom source from the locally cloned
// repository and also loads all the packages in ~/.atom/dev/packages
// * `safeMode` A {Boolean}, true to open the window in safe mode. Safe
// mode prevents all packages installed to ~/.atom/packages from loading.
open (params) {
return this.applicationDelegate.open(params)
}
// Extended: Prompt the user to select one or more folders.
//
// * `callback` A {Function} to call once the user has confirmed the selection.
// * `paths` An {Array} of {String} paths that the user selected, or `null`
// if the user dismissed the dialog.
pickFolder (callback) {
return this.applicationDelegate.pickFolder(callback)
}
// Essential: Close the current window.
close () {
return this.applicationDelegate.closeWindow()
}
// Essential: Get the size of current window.
//
// Returns an {Object} in the format `{width: 1000, height: 700}`
getSize () {
return this.applicationDelegate.getWindowSize()
}
// Essential: Set the size of current window.
//
// * `width` The {Number} of pixels.
// * `height` The {Number} of pixels.
setSize (width, height) {
return this.applicationDelegate.setWindowSize(width, height)
}
// Essential: Get the position of current window.
//
// Returns an {Object} in the format `{x: 10, y: 20}`
getPosition () {
return this.applicationDelegate.getWindowPosition()
}
// Essential: Set the position of current window.
//
// * `x` The {Number} of pixels.
// * `y` The {Number} of pixels.
setPosition (x, y) {
return this.applicationDelegate.setWindowPosition(x, y)
}
// Extended: Get the current window
getCurrentWindow () {
return this.applicationDelegate.getCurrentWindow()
}
// Extended: Move current window to the center of the screen.
center () {
return this.applicationDelegate.centerWindow()
}
// Extended: Focus the current window.
focus () {
this.applicationDelegate.focusWindow()
return this.window.focus()
}
// Extended: Show the current window.
show () {
return this.applicationDelegate.showWindow()
}
// Extended: Hide the current window.
hide () {
return this.applicationDelegate.hideWindow()
}
// Extended: Reload the current window.
reload () {
return this.applicationDelegate.reloadWindow()
}
// Extended: Relaunch the entire application.
restartApplication () {
return this.applicationDelegate.restartApplication()
}
// Extended: Returns a {Boolean} that is `true` if the current window is maximized.
isMaximized () {
return this.applicationDelegate.isWindowMaximized()
}
maximize () {
return this.applicationDelegate.maximizeWindow()
}
// Extended: Returns a {Boolean} that is `true` if the current window is in full screen mode.
isFullScreen () {
return this.applicationDelegate.isWindowFullScreen()
}
// Extended: Set the full screen state of the current window.
setFullScreen (fullScreen = false) {
return this.applicationDelegate.setWindowFullScreen(fullScreen)
}
// Extended: Toggle the full screen state of the current window.
toggleFullScreen () {
return this.setFullScreen(!this.isFullScreen())
}
// Restore the window to its previous dimensions and show it.
//
// Restores the full screen and maximized state after the window has resized to
// prevent resize glitches.
async displayWindow () {
await this.restoreWindowDimensions()
const steps = [
this.restoreWindowBackground(),
this.show(),
this.focus()
]
if (this.windowDimensions && this.windowDimensions.fullScreen) {
steps.push(this.setFullScreen(true))
}
if (this.windowDimensions && this.windowDimensions.maximized && get_process().platform !== 'darwin') {
steps.push(this.maximize())
}
await Promise.all(steps)
}
// Get the dimensions of this window.
//
// Returns an {Object} with the following keys:
// * `x` The window's x-position {Number}.
// * `y` The window's y-position {Number}.
// * `width` The window's width {Number}.
// * `height` The window's height {Number}.
getWindowDimensions () {
const browserWindow = this.getCurrentWindow()
const [x, y] = browserWindow.getPosition()
const [width, height] = browserWindow.getSize()
const maximized = browserWindow.isMaximized()
return {x, y, width, height, maximized}
}
// Set the dimensions of the window.
//
// The window will be centered if either the x or y coordinate is not set
// in the dimensions parameter. If x or y are omitted the window will be
// centered. If height or width are omitted only the position will be changed.
//
// * `dimensions` An {Object} with the following keys:
// * `x` The new x coordinate.
// * `y` The new y coordinate.
// * `width` The new width.
// * `height` The new height.
setWindowDimensions ({x, y, width, height}) {
const steps = []
if (width != null && height != null) {
steps.push(this.setSize(width, height))
}
if (x != null && y != null) {
steps.push(this.setPosition(x, y))
} else {
steps.push(this.center())
}
return Promise.all(steps)
}
// Returns true if the dimensions are useable, false if they should be ignored.
// Work around for https://github.com/atom/atom-shell/issues/473
isValidDimensions ({x, y, width, height} = {}) {
return (width > 0) && (height > 0) && ((x + width) > 0) && ((y + height) > 0)
}
storeWindowDimensions () {
this.windowDimensions = this.getWindowDimensions()
if (this.isValidDimensions(this.windowDimensions)) {
localStorage.setItem('defaultWindowDimensions', JSON.stringify(this.windowDimensions))
}
}
getDefaultWindowDimensions () {
const {windowDimensions} = this.getLoadSettings()
if (windowDimensions) return windowDimensions
let dimensions
try {
dimensions = JSON.parse(localStorage.getItem('defaultWindowDimensions'))
} catch (error) {
get_console().warn('Error parsing default window dimensions', error)
localStorage.removeItem('defaultWindowDimensions')
}
if (dimensions && this.isValidDimensions(dimensions)) {
return dimensions
} else {
const {width, height} = this.applicationDelegate.getPrimaryDisplayWorkAreaSize()
return {x: 0, y: 0, width: Math.min(1024, width), height}
}
}
async restoreWindowDimensions () {
if (!this.windowDimensions || !this.isValidDimensions(this.windowDimensions)) {
this.windowDimensions = this.getDefaultWindowDimensions()
}
await this.setWindowDimensions(this.windowDimensions)
return this.windowDimensions
}
restoreWindowBackground () {
const backgroundColor = get_window().localStorage.getItem('atom:window-background-color')
if (backgroundColor) {
this.backgroundStylesheet = get_document().createElement('style')
this.backgroundStylesheet.type = 'text/css'
this.backgroundStylesheet.innerText = `html, body { background: ${backgroundColor} !important; }`
get_document().head.appendChild(this.backgroundStylesheet)
}
}
storeWindowBackground () {
if (this.inSpecMode()) return
const backgroundColor = this.window.getComputedStyle(this.workspace.getElement())['background-color']
this.window.localStorage.setItem('atom:window-background-color', backgroundColor)
}
// Call this method when establishing a real application window.
startEditorWindow () {
this.unloaded = false
const updateProcessEnvPromise = this.updateProcessEnvAndTriggerHooks()
const loadStatePromise = this.loadState().then(async state => {
this.windowDimensions = state && state.windowDimensions
await this.displayWindow()
this.commandInstaller.installAtomCommand(false, (error) => {
if (error) get_console().warn(error.message)
})
this.commandInstaller.installApmCommand(false, (error) => {
if (error) get_console().warn(error.message)
})
this.disposables.add(this.applicationDelegate.onDidOpenLocations(this.openLocations.bind(this)))
this.disposables.add(this.applicationDelegate.onApplicationMenuCommand(this.dispatchApplicationMenuCommand.bind(this)))
this.disposables.add(this.applicationDelegate.onContextMenuCommand(this.dispatchContextMenuCommand.bind(this)))
this.disposables.add(this.applicationDelegate.onURIMessage(this.dispatchURIMessage.bind(this)))
this.disposables.add(this.applicationDelegate.onDidRequestUnload(async () => {
try {
await this.saveState({isUnloading: true})
} catch (error) {
get_console().error(error)
}
const closing = !this.workspace || await this.workspace.confirmClose({
windowCloseRequested: true,
projectHasPaths: this.project.getPaths().length > 0
})
if (closing) await this.packages.deactivatePackages()
return closing
}))
this.listenForUpdates()
this.registerDefaultTargetForKeymaps()
this.packages.loadPackages()
const startTime = Date.now()
await this.deserialize(state)
this.deserializeTimings.atom = Date.now() - startTime
if (get_process().platform === 'darwin' && this.config.get('core.titleBar') === 'custom') {
this.workspace.addHeaderPanel({item: new TitleBar({workspace: this.workspace, themes: this.themes, applicationDelegate: this.applicationDelegate})})
this.document.body.classList.add('custom-title-bar')
}
if (get_process().platform === 'darwin' && this.config.get('core.titleBar') === 'custom-inset') {
this.workspace.addHeaderPanel({item: new TitleBar({workspace: this.workspace, themes: this.themes, applicationDelegate: this.applicationDelegate})})
this.document.body.classList.add('custom-inset-title-bar')
}
if (get_process().platform === 'darwin' && this.config.get('core.titleBar') === 'hidden') {
this.document.body.classList.add('hidden-title-bar')
}
this.document.body.appendChild(this.workspace.getElement())
if (this.backgroundStylesheet) this.backgroundStylesheet.remove()
this.watchProjectPaths()
this.packages.activate()
this.keymaps.loadUserKeymap()
if (!this.getLoadSettings().safeMode) this.requireUserInitScript()
this.menu.update()
await this.openInitialEmptyEditorIfNecessary()
})
const loadHistoryPromise = this.history.loadState().then(() => {
this.reopenProjectMenuManager = new ReopenProjectMenuManager({
menu: this.menu,
commands: this.commands,
history: this.history,
config: this.config,
open: paths => this.open({pathsToOpen: paths})
})
this.reopenProjectMenuManager.update()
})
return Promise.all([loadStatePromise, loadHistoryPromise, updateProcessEnvPromise])
}
serialize (options) {
return {
version: this.constructor.version,
project: this.project.serialize(options),
workspace: this.workspace.serialize(),
packageStates: this.packages.serialize(),
grammars: this.grammars.serialize(),
fullScreen: this.isFullScreen(),
windowDimensions: this.windowDimensions
}
}
unloadEditorWindow () {
if (!this.project) return
this.storeWindowBackground()
this.saveBlobStoreSync()
this.unloaded = true
}
saveBlobStoreSync () {
if (this.enablePersistence) {
this.blobStore.save()
}
}
openInitialEmptyEditorIfNecessary () {
if (!this.config.get('core.openEmptyEditorOnStart')) return
const {initialPaths} = this.getLoadSettings()
if (initialPaths && initialPaths.length === 0 && this.workspace.getPaneItems().length === 0) {
return this.workspace.open(null)
}
}
installUncaughtErrorHandler () {
this.previousWindowErrorHandler = this.window.onerror
this.window.onerror = (message, url, line, column, originalError) => {
const mapping = mapSourcePosition({source: url, line, column})
line = mapping.line
column = mapping.column
if (url === '<embedded>') url = mapping.source
const eventObject = {message, url, line, column, originalError}
let openDevTools = true
eventObject.preventDefault = () => { openDevTools = false }
this.emitter.emit('will-throw-error', eventObject)
if (openDevTools) {
this.openDevTools().then(() =>
this.executeJavaScriptInDevTools('DevToolsAPI.showPanel("console")')
)
}
this.emitter.emit('did-throw-error', {message, url, line, column, originalError})
}
}
uninstallUncaughtErrorHandler () {
this.window.onerror = this.previousWindowErrorHandler
}
installWindowEventHandler () {
this.windowEventHandler = new WindowEventHandler({atomEnvironment: this, applicationDelegate: this.applicationDelegate})
this.windowEventHandler.initialize(this.window, this.document)
}
uninstallWindowEventHandler () {
if (this.windowEventHandler) {
this.windowEventHandler.unsubscribe()
}
this.windowEventHandler = null
}
didChangeStyles (styleElement) {
TextEditor.didUpdateStyles()
if (styleElement.textContent.indexOf('scrollbar') >= 0) {
TextEditor.didUpdateScrollbarStyles()
}
}
async updateProcessEnvAndTriggerHooks () {
await this.updateProcessEnv(this.getLoadSettings().env)
this.shellEnvironmentLoaded = true
this.emitter.emit('loaded-shell-environment')
this.packages.triggerActivationHook('core:loaded-shell-environment')
}
/*
Section: Messaging the User
*/
// Essential: Visually and audibly trigger a beep.
beep () {
if (this.config.get('core.audioBeep')) this.applicationDelegate.playBeepSound()
this.emitter.emit('did-beep')
}
// Essential: A flexible way to open a dialog akin to an alert dialog.
//
// If the dialog is closed (via `Esc` key or `X` in the top corner) without selecting a button
// the first button will be clicked unless a "Cancel" or "No" button is provided.
//
// ## Examples
//
// ```coffee
// atom.confirm
// message: 'How you feeling?'
// detailedMessage: 'Be honest.'
// buttons:
// Good: -> window.alert('good to hear')
// Bad: -> window.alert('bummer')
// ```
//
// * `options` An {Object} with the following keys:
// * `message` The {String} message to display.
// * `detailedMessage` (optional) The {String} detailed message to display.
// * `buttons` (optional) Either an array of strings or an object where keys are
// button names and the values are callbacks to invoke when clicked.
//
// Returns the chosen button index {Number} if the buttons option is an array or the return value of the callback if the buttons option is an object.
confirm (params = {}) {
return this.applicationDelegate.confirm(params)
}
/*
Section: Managing the Dev Tools
*/
// Extended: Open the dev tools for the current window.
//
// Returns a {Promise} that resolves when the DevTools have been opened.
openDevTools () {
return this.applicationDelegate.openWindowDevTools()
}
// Extended: Toggle the visibility of the dev tools for the current window.
//
// Returns a {Promise} that resolves when the DevTools have been opened or
// closed.
toggleDevTools () {
return this.applicationDelegate.toggleWindowDevTools()
}
// Extended: Execute code in dev tools.
executeJavaScriptInDevTools (code) {
return this.applicationDelegate.executeJavaScriptInWindowDevTools(code)
}
/*
Section: Private
*/
assert (condition, message, callbackOrMetadata) {
if (condition) return true
const error = new Error(`Assertion failed: ${message}`)
Error.captureStackTrace(error, this.assert)
if (callbackOrMetadata) {
if (typeof callbackOrMetadata === 'function') {
callbackOrMetadata(error)
} else {
error.metadata = callbackOrMetadata
}
}
this.emitter.emit('did-fail-assertion', error)
if (!this.isReleasedVersion()) throw error
return false
}
loadThemes () {
return this.themes.load()
}
// Notify the browser project of the window's current project path
watchProjectPaths () {
this.disposables.add(this.project.onDidChangePaths(() => {
this.applicationDelegate.setRepresentedDirectoryPaths(this.project.getPaths())
}))
}
setDocumentEdited (edited) {
if (typeof this.applicationDelegate.setWindowDocumentEdited === 'function') {
this.applicationDelegate.setWindowDocumentEdited(edited)
}
}
setRepresentedFilename (filename) {
if (typeof this.applicationDelegate.setWindowRepresentedFilename === 'function') {
this.applicationDelegate.setWindowRepresentedFilename(filename)
}
}
addProjectFolder () {
this.pickFolder((selectedPaths = []) => {
this.addToProject(selectedPaths)
})
}
async addToProject (projectPaths) {
const state = await this.loadState(this.getStateKey(projectPaths))
if (state && (this.project.getPaths().length === 0)) {
this.attemptRestoreProjectStateForPaths(state, projectPaths)
} else {
projectPaths.map((folder) => this.project.addPath(folder))
}
}
attemptRestoreProjectStateForPaths (state, projectPaths, filesToOpen = []) {
const center = this.workspace.getCenter()
const windowIsUnused = () => {
for (let container of this.workspace.getPaneContainers()) {
for (let item of container.getPaneItems()) {
if (item instanceof TextEditor) {
if (item.getPath() || item.isModified()) return false
} else {
if (container === center) return false
}
}
}
return true
}
if (windowIsUnused()) {
this.restoreStateIntoThisEnvironment(state)
return Promise.all(filesToOpen.map(file => this.workspace.open(file)))
} else {
const nouns = projectPaths.length === 1 ? 'folder' : 'folders'
const choice = this.confirm({
message: 'Previous automatically-saved project state detected',
detailedMessage: `There is previously saved state for the selected ${nouns}. ` +
`Would you like to add the ${nouns} to this window, permanently discarding the saved state, ` +
`or open the ${nouns} in a new window, restoring the saved state?`,
buttons: [
'&Open in new window and recover state',
'&Add to this window and discard state'
]})
if (choice === 0) {
this.open({
pathsToOpen: projectPaths.concat(filesToOpen),
newWindow: true,
devMode: this.inDevMode(),
safeMode: this.inSafeMode()
})
return Promise.resolve(null)
} else if (choice === 1) {
for (let selectedPath of projectPaths) {
this.project.addPath(selectedPath)
}
return Promise.all(filesToOpen.map(file => this.workspace.open(file)))
}
}
}
restoreStateIntoThisEnvironment (state) {
state.fullScreen = this.isFullScreen()
for (let pane of this.workspace.getPanes()) {
pane.destroy()
}
return this.deserialize(state)
}
showSaveDialog (callback) {
callback(this.showSaveDialogSync())
}
showSaveDialogSync (options = {}) {
this.applicationDelegate.showSaveDialog(options)
}
async saveState (options, storageKey) {
if (this.enablePersistence && this.project) {
const state = this.serialize(options)
if (!storageKey) storageKey = this.getStateKey(this.project && this.project.getPaths())
if (storageKey) {
await this.stateStore.save(storageKey, state)
} else {
await this.applicationDelegate.setTemporaryWindowState(state)
}
}
}
loadState (stateKey) {
if (this.enablePersistence) {
if (!stateKey) stateKey = this.getStateKey(this.getLoadSettings().initialPaths)
if (stateKey) {
return this.stateStore.load(stateKey)
} else {
return this.applicationDelegate.getTemporaryWindowState()
}
} else {
return Promise.resolve(null)
}
}
async deserialize (state) {
if (!state) return Promise.resolve()
this.setFullScreen(state.fullScreen)
const missingProjectPaths = []
this.packages.packageStates = state.packageStates || {}
let startTime = Date.now()
if (state.project) {
try {
await this.project.deserialize(state.project, this.deserializers)
} catch (error) {
if (error.missingProjectPaths) {
missingProjectPaths.push(...error.missingProjectPaths)
} else {
this.notifications.addError('Unable to deserialize project', {
description: error.message,
stack: error.stack
})
}
}
}
this.deserializeTimings.project = Date.now() - startTime
if (state.grammars) this.grammars.deserialize(state.grammars)
startTime = Date.now()
if (state.workspace) this.workspace.deserialize(state.workspace, this.deserializers)
this.deserializeTimings.workspace = Date.now() - startTime
if (missingProjectPaths.length > 0) {
const count = missingProjectPaths.length === 1 ? '' : missingProjectPaths.length + ' '
const noun = missingProjectPaths.length === 1 ? 'directory' : 'directories'
const toBe = missingProjectPaths.length === 1 ? 'is' : 'are'
const escaped = missingProjectPaths.map(projectPath => `\`${projectPath}\``)
let group
switch (escaped.length) {
case 1:
group = escaped[0]
break
case 2:
group = `${escaped[0]} and ${escaped[1]}`
break
default:
group = escaped.slice(0, -1).join(', ') + `, and ${escaped[escaped.length - 1]}`
}
this.notifications.addError(`Unable to open ${count}project ${noun}`, {
description: `Project ${noun} ${group} ${toBe} no longer on disk.`
})
}
}
getStateKey (paths) {
if (paths && paths.length > 0) {
const sha1 = get_crypto().createHash('sha1').update(paths.slice().sort().join('\n')).digest('hex')
return `editor-${sha1}`
} else {
return null
}
}
getStorageFolder () {
if (!this.storageFolder) this.storageFolder = new StorageFolder(this.getConfigDirPath())
return this.storageFolder
}
getConfigDirPath () {
if (!this.configDirPath) this.configDirPath = get_process().env.ATOM_HOME
return this.configDirPath
}
getUserInitScriptPath () {
const initScriptPath = fs.resolve(this.getConfigDirPath(), 'init', ['js', 'coffee'])
return initScriptPath || get_path().join(this.getConfigDirPath(), 'init.coffee');
}
requireUserInitScript () {
const userInitScriptPath = this.getUserInitScriptPath()
if (userInitScriptPath) {
try {
if (fs.isFileSync(userInitScriptPath)) require(userInitScriptPath)
} catch (error) {
this.notifications.addError(`Failed to load \`${userInitScriptPath}\``, {
detail: error.message,
dismissable: true
})
}
}
}
// TODO: We should deprecate the update events here, and use `atom.autoUpdater` instead
onUpdateAvailable (callback) {
return this.emitter.on('update-available', callback)
}
updateAvailable (details) {
return this.emitter.emit('update-available', details)
}
listenForUpdates () {
// listen for updates available locally (that have been successfully downloaded)
this.disposables.add(this.autoUpdater.onDidCompleteDownloadingUpdate(this.updateAvailable.bind(this)))
}
setBodyPlatformClass () {
this.document.body.classList.add(`platform-${get_process().platform}`)
}
setAutoHideMenuBar (autoHide) {
this.applicationDelegate.setAutoHideWindowMenuBar(autoHide)
this.applicationDelegate.setWindowMenuBarVisibility(!autoHide)
}
dispatchApplicationMenuCommand (command, arg) {
let {activeElement} = this.document
// Use the workspace element if body has focus
if (activeElement === this.document.body) {
activeElement = this.workspace.getElement()
}
this.commands.dispatch(activeElement, command, arg)
}
dispatchContextMenuCommand (command, ...args) {
this.commands.dispatch(this.contextMenu.activeElement, command, args)
}
dispatchURIMessage (uri) {
if (this.packages.hasLoadedInitialPackages()) {
this.uriHandlerRegistry.handleURI(uri)
} else {
let subscription = this.packages.onDidLoadInitialPackages(() => {
subscription.dispose()
this.uriHandlerRegistry.handleURI(uri)
})
}
}
async openLocations (locations) {
const needsProjectPaths = this.project && this.project.getPaths().length === 0
const foldersToAddToProject = []
const fileLocationsToOpen = []
function pushFolderToOpen (folder) {
if (!foldersToAddToProject.includes(folder)) {
foldersToAddToProject.push(folder)
}
}
for (var {pathToOpen, initialLine, initialColumn, forceAddToWindow} of locations) {
if (pathToOpen && (needsProjectPaths || forceAddToWindow)) {
if (fs.existsSync(pathToOpen)) {
pushFolderToOpen(this.project.getDirectoryForProjectPath(pathToOpen).getPath())
} else if (fs.existsSync(get_path().dirname(pathToOpen))) {
pushFolderToOpen(this.project.getDirectoryForProjectPath(get_path().dirname(pathToOpen)).getPath())
} else {
pushFolderToOpen(this.project.getDirectoryForProjectPath(pathToOpen).getPath())
}
}
if (!fs.isDirectorySync(pathToOpen)) {
fileLocationsToOpen.push({pathToOpen, initialLine, initialColumn})
}
}
let restoredState = false
if (foldersToAddToProject.length > 0) {
const state = await this.loadState(this.getStateKey(foldersToAddToProject))
// only restore state if this is the first path added to the project
if (state && needsProjectPaths) {
const files = fileLocationsToOpen.map((location) => location.pathToOpen)
await this.attemptRestoreProjectStateForPaths(state, foldersToAddToProject, files)
restoredState = true
} else {
for (let folder of foldersToAddToProject) {
this.project.addPath(folder)
}
}
}
if (!restoredState) {
const fileOpenPromises = []
for ({pathToOpen, initialLine, initialColumn} of fileLocationsToOpen) {
fileOpenPromises.push(this.workspace && this.workspace.open(pathToOpen, {initialLine, initialColumn}))
}
await Promise.all(fileOpenPromises)
}
get_ipcRenderer().send('window-command', 'window:locations-opened')
}
resolveProxy (url) {
return new Promise((resolve, reject) => {
const requestId = this.nextProxyRequestId++
const disposable = this.applicationDelegate.onDidResolveProxy((id, proxy) => {
if (id === requestId) {
disposable.dispose()
resolve(proxy)
}
})
return this.applicationDelegate.resolveProxy(requestId, url)
})
}
}
AtomEnvironment.version = 1
AtomEnvironment.prototype.saveStateDebounceInterval = 1000
module.exports = AtomEnvironment
/* eslint-disable */
// Preserve this deprecation until 2.0. Sorry. Should have removed Q sooner.
Promise.prototype.done = function (callback) {
deprecate('Atom now uses ES6 Promises instead of Q. Call promise.then instead of promise.done')
return this.then(callback)
}
/* eslint-enable */
},
"../src/application-delegate.js": function (exports, module, __filename, __dirname, require, define) {
(function() {
var ApplicationDelegate, Disposable, getWindowLoadSettings, ipcHelpers, ipcRenderer, ref, remote, shell,
slice = [].slice;
function get_ref() {
return ref = ref || require('electron');
}
function get_ipcRenderer() {
return ipcRenderer = ipcRenderer || get_ref().ipcRenderer;
}
function get_remote() {
return remote = remote || get_ref().remote;
}
function get_shell() {
return shell = shell || get_ref().shell;
}
ipcHelpers = require("../src/ipc-helpers.js");
Disposable = require("../node_modules/event-kit/lib/event-kit.js").Disposable;
getWindowLoadSettings = require("../src/get-window-load-settings.js");
module.exports = ApplicationDelegate = (function() {
function ApplicationDelegate() {}
ApplicationDelegate.prototype.getWindowLoadSettings = function() {
return getWindowLoadSettings();
};
ApplicationDelegate.prototype.open = function(params) {
return get_ipcRenderer().send('open', params);
};
ApplicationDelegate.prototype.pickFolder = function(callback) {
var responseChannel;
responseChannel = "atom-pick-folder-response";
get_ipcRenderer().on(responseChannel, function(event, path) {
get_ipcRenderer().removeAllListeners(responseChannel);
return callback(path);
});
return get_ipcRenderer().send("pick-folder", responseChannel);
};
ApplicationDelegate.prototype.getCurrentWindow = function() {
return get_remote().getCurrentWindow();
};
ApplicationDelegate.prototype.closeWindow = function() {
return ipcHelpers.call('window-method', 'close');
};
ApplicationDelegate.prototype.getTemporaryWindowState = function() {
return ipcHelpers.call('get-temporary-window-state').then(function(stateJSON) {
return JSON.parse(stateJSON);
});
};
ApplicationDelegate.prototype.setTemporaryWindowState = function(state) {
return ipcHelpers.call('set-temporary-window-state', JSON.stringify(state));
};
ApplicationDelegate.prototype.getWindowSize = function() {
var height, ref1, width;
ref1 = get_remote().getCurrentWindow().getSize(), width = ref1[0], height = ref1[1];
return {
width: width,
height: height
};
};
ApplicationDelegate.prototype.setWindowSize = function(width, height) {
return ipcHelpers.call('set-window-size', width, height);
};
ApplicationDelegate.prototype.getWindowPosition = function() {
var ref1, x, y;
ref1 = get_remote().getCurrentWindow().getPosition(), x = ref1[0], y = ref1[1];
return {
x: x,
y: y
};
};
ApplicationDelegate.prototype.setWindowPosition = function(x, y) {
return ipcHelpers.call('set-window-position', x, y);
};
ApplicationDelegate.prototype.centerWindow = function() {
return ipcHelpers.call('center-window');
};
ApplicationDelegate.prototype.focusWindow = function() {
return ipcHelpers.call('focus-window');
};
ApplicationDelegate.prototype.showWindow = function() {
return ipcHelpers.call('show-window');
};
ApplicationDelegate.prototype.hideWindow = function() {
return ipcHelpers.call('hide-window');
};
ApplicationDelegate.prototype.reloadWindow = function() {
return ipcHelpers.call('window-method', 'reload');
};
ApplicationDelegate.prototype.restartApplication = function() {
return get_ipcRenderer().send("restart-application");
};
ApplicationDelegate.prototype.minimizeWindow = function() {
return ipcHelpers.call('window-method', 'minimize');
};
ApplicationDelegate.prototype.isWindowMaximized = function() {
return get_remote().getCurrentWindow().isMaximized();
};
ApplicationDelegate.prototype.maximizeWindow = function() {
return ipcHelpers.call('window-method', 'maximize');
};
ApplicationDelegate.prototype.unmaximizeWindow = function() {
return ipcHelpers.call('window-method', 'unmaximize');
};
ApplicationDelegate.prototype.isWindowFullScreen = function() {
return get_remote().getCurrentWindow().isFullScreen();
};
ApplicationDelegate.prototype.setWindowFullScreen = function(fullScreen) {
if (fullScreen == null) {
fullScreen = false;
}
return ipcHelpers.call('window-method', 'setFullScreen', fullScreen);
};
ApplicationDelegate.prototype.onDidEnterFullScreen = function(callback) {
return ipcHelpers.on(get_ipcRenderer(), 'did-enter-full-screen', callback);
};
ApplicationDelegate.prototype.onDidLeaveFullScreen = function(callback) {
return ipcHelpers.on(get_ipcRenderer(), 'did-leave-full-screen', callback);
};
ApplicationDelegate.prototype.openWindowDevTools = function() {
return new Promise(get_process().nextTick).then(function() {
return ipcHelpers.call('window-method', 'openDevTools');
});
};
ApplicationDelegate.prototype.closeWindowDevTools = function() {
return new Promise(get_process().nextTick).then(function() {
return ipcHelpers.call('window-method', 'closeDevTools');
});
};
ApplicationDelegate.prototype.toggleWindowDevTools = function() {
return new Promise(get_process().nextTick).then(function() {
return ipcHelpers.call('window-method', 'toggleDevTools');
});
};
ApplicationDelegate.prototype.executeJavaScriptInWindowDevTools = function(code) {
return get_ipcRenderer().send("execute-javascript-in-dev-tools", code);
};
ApplicationDelegate.prototype.setWindowDocumentEdited = function(edited) {
return ipcHelpers.call('window-method', 'setDocumentEdited', edited);
};
ApplicationDelegate.prototype.setRepresentedFilename = function(filename) {
return ipcHelpers.call('window-method', 'setRepresentedFilename', filename);
};
ApplicationDelegate.prototype.addRecentDocument = function(filename) {
return get_ipcRenderer().send("add-recent-document", filename);
};
ApplicationDelegate.prototype.setRepresentedDirectoryPaths = function(paths) {
return ipcHelpers.call('window-method', 'setRepresentedDirectoryPaths', paths);
};
ApplicationDelegate.prototype.setAutoHideWindowMenuBar = function(autoHide) {
return ipcHelpers.call('window-method', 'setAutoHideMenuBar', autoHide);
};
ApplicationDelegate.prototype.setWindowMenuBarVisibility = function(visible) {
return get_remote().getCurrentWindow().setMenuBarVisibility(visible);
};
ApplicationDelegate.prototype.getPrimaryDisplayWorkAreaSize = function() {
return get_remote().screen.getPrimaryDisplay().workAreaSize;
};
ApplicationDelegate.prototype.getUserDefault = function(key, type) {
return get_remote().systemPreferences.getUserDefault(key, type);
};
ApplicationDelegate.prototype.confirm = function(arg) {
var buttonLabels, buttons, callback, chosen, detailedMessage, message;
message = arg.message, detailedMessage = arg.detailedMessage, buttons = arg.buttons;
if (buttons == null) {
buttons = {};
}
if (Array.isArray(buttons)) {
buttonLabels = buttons;
} else {
buttonLabels = Object.keys(buttons);
}
chosen = get_remote().dialog.showMessageBox(get_remote().getCurrentWindow(), {
type: 'info',
message: message,
detail: detailedMessage,
buttons: buttonLabels,
normalizeAccessKeys: true
});
if (Array.isArray(buttons)) {
return chosen;
} else {
callback = buttons[buttonLabels[chosen]];
return typeof callback === "function" ? callback() : void 0;
}
};
ApplicationDelegate.prototype.showMessageDialog = function(params) {};
ApplicationDelegate.prototype.showSaveDialog = function(params) {
if (typeof params === 'string') {
params = {
defaultPath: params
};
}
return this.getCurrentWindow().showSaveDialog(params);
};
ApplicationDelegate.prototype.playBeepSound = function() {
return get_shell().beep();
};
ApplicationDelegate.prototype.onDidOpenLocations = function(callback) {
var outerCallback;
outerCallback = function(event, message, detail) {
if (message === 'open-locations') {
return callback(detail);
}
};
get_ipcRenderer().on('message', outerCallback);
return new Disposable(function() {
return get_ipcRenderer().removeListener('message', outerCallback);
});
};
ApplicationDelegate.prototype.onUpdateAvailable = function(callback) {
var outerCallback;
outerCallback = function(event, message, detail) {
if (message === 'did-begin-downloading-update') {
return callback(detail);
}
};
get_ipcRenderer().on('message', outerCallback);
return new Disposable(function() {
return get_ipcRenderer().removeListener('message', outerCallback);
});
};
ApplicationDelegate.prototype.onDidBeginDownloadingUpdate = function(callback) {
return this.onUpdateAvailable(callback);
};
ApplicationDelegate.prototype.onDidBeginCheckingForUpdate = function(callback) {
var outerCallback;
outerCallback = function(event, message, detail) {
if (message === 'checking-for-update') {
return callback(detail);
}
};
get_ipcRenderer().on('message', outerCallback);
return new Disposable(function() {
return get_ipcRenderer().removeListener('message', outerCallback);
});
};
ApplicationDelegate.prototype.onDidCompleteDownloadingUpdate = function(callback) {
var outerCallback;
outerCallback = function(event, message, detail) {
if (message === 'update-available') {
return callback(detail);
}
};
get_ipcRenderer().on('message', outerCallback);
return new Disposable(function() {
return get_ipcRenderer().removeListener('message', outerCallback);
});
};
ApplicationDelegate.prototype.onUpdateNotAvailable = function(callback) {
var outerCallback;
outerCallback = function(event, message, detail) {
if (message === 'update-not-available') {
return callback(detail);
}
};
get_ipcRenderer().on('message', outerCallback);
return new Disposable(function() {
return get_ipcRenderer().removeListener('message', outerCallback);
});
};
ApplicationDelegate.prototype.onUpdateError = function(callback) {
var outerCallback;
outerCallback = function(event, message, detail) {
if (message === 'update-error') {
return callback(detail);
}
};
get_ipcRenderer().on('message', outerCallback);
return new Disposable(function() {
return get_ipcRenderer().removeListener('message', outerCallback);
});
};
ApplicationDelegate.prototype.onApplicationMenuCommand = function(callback) {
var outerCallback;
outerCallback = function() {
var args, event;
event = arguments[0], args = 2 <= arguments.length ? slice.call(arguments, 1) : [];
return callback.apply(null, args);
};
get_ipcRenderer().on('command', outerCallback);
return new Disposable(function() {
return get_ipcRenderer().removeListener('command', outerCallback);
});
};
ApplicationDelegate.prototype.onContextMenuCommand = function(callback) {
var outerCallback;
outerCallback = function() {
var args, event;
event = arguments[0], args = 2 <= arguments.length ? slice.call(arguments, 1) : [];
return callback.apply(null, args);
};
get_ipcRenderer().on('context-command', outerCallback);
return new Disposable(function() {
return get_ipcRenderer().removeListener('context-command', outerCallback);
});
};
ApplicationDelegate.prototype.onURIMessage = function(callback) {
var outerCallback;
outerCallback = function() {
var args, event;
event = arguments[0], args = 2 <= arguments.length ? slice.call(arguments, 1) : [];
return callback.apply(null, args);
};
get_ipcRenderer().on('uri-message', outerCallback);
return new Disposable(function() {
return get_ipcRenderer().removeListener('uri-message', outerCallback);
});
};
ApplicationDelegate.prototype.onDidRequestUnload = function(callback) {
var outerCallback;
outerCallback = function(event, message) {
return callback(event).then(function(shouldUnload) {
return get_ipcRenderer().send('did-prepare-to-unload', shouldUnload);
});
};
get_ipcRenderer().on('prepare-to-unload', outerCallback);
return new Disposable(function() {
return get_ipcRenderer().removeListener('prepare-to-unload', outerCallback);
});
};
ApplicationDelegate.prototype.onDidChangeHistoryManager = function(callback) {
var outerCallback;
outerCallback = function(event, message) {
return callback(event);
};
get_ipcRenderer().on('did-change-history-manager', outerCallback);
return new Disposable(function() {
return get_ipcRenderer().removeListener('did-change-history-manager', outerCallback);
});
};
ApplicationDelegate.prototype.didChangeHistoryManager = function() {
return get_ipcRenderer().send('did-change-history-manager');
};
ApplicationDelegate.prototype.openExternal = function(url) {
return get_shell().openExternal(url);
};
ApplicationDelegate.prototype.checkForUpdate = function() {
return get_ipcRenderer().send('command', 'application:check-for-update');
};
ApplicationDelegate.prototype.restartAndInstallUpdate = function() {
return get_ipcRenderer().send('command', 'application:install-update');
};
ApplicationDelegate.prototype.getAutoUpdateManagerState = function() {
return get_ipcRenderer().sendSync('get-auto-update-manager-state');
};
ApplicationDelegate.prototype.getAutoUpdateManagerErrorMessage = function() {
return get_ipcRenderer().sendSync('get-auto-update-manager-error');
};
ApplicationDelegate.prototype.emitWillSavePath = function(path) {
return get_ipcRenderer().sendSync('will-save-path', path);
};
ApplicationDelegate.prototype.emitDidSavePath = function(path) {
return get_ipcRenderer().sendSync('did-save-path', path);
};
ApplicationDelegate.prototype.resolveProxy = function(requestId, url) {
return get_ipcRenderer().send('resolve-proxy', requestId, url);
};
ApplicationDelegate.prototype.onDidResolveProxy = function(callback) {
var outerCallback;
outerCallback = function(event, requestId, proxy) {
return callback(requestId, proxy);
};
get_ipcRenderer().on('did-resolve-proxy', outerCallback);
return new Disposable(function() {
return get_ipcRenderer().removeListener('did-resolve-proxy', outerCallback);
});
};
return ApplicationDelegate;
})();
}).call(this);
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiL1VzZXJzL2xlcm9peC9naXRodWIvYXRvbS9vdXQvYXBwL3NyYy9hcHBsaWNhdGlvbi1kZWxlZ2F0ZS5jb2ZmZWUiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7QUFBQSxNQUFBLG1HQUFBO0lBQUE7O0VBQUEsTUFBK0IsT0FBQSxDQUFRLFVBQVIsQ0FBL0IsRUFBQyw2QkFBRCxFQUFjLG1CQUFkLEVBQXNCOztFQUN0QixVQUFBLEdBQWEsT0FBQSxDQUFRLGVBQVI7O0VBQ1osYUFBYyxPQUFBLENBQVEsV0FBUjs7RUFDZixxQkFBQSxHQUF3QixPQUFBLENBQVEsNEJBQVI7O0VBRXhCLE1BQU0sQ0FBQyxPQUFQLEdBQ007OztrQ0FDSixxQkFBQSxHQUF1QixTQUFBO2FBQUcscUJBQUEsQ0FBQTtJQUFIOztrQ0FFdkIsSUFBQSxHQUFNLFNBQUMsTUFBRDthQUNKLFdBQVcsQ0FBQyxJQUFaLENBQWlCLE1BQWpCLEVBQXlCLE1BQXpCO0lBREk7O2tDQUdOLFVBQUEsR0FBWSxTQUFDLFFBQUQ7QUFDVixVQUFBO01BQUEsZUFBQSxHQUFrQjtNQUNsQixXQUFXLENBQUMsRUFBWixDQUFlLGVBQWYsRUFBZ0MsU0FBQyxLQUFELEVBQVEsSUFBUjtRQUM5QixXQUFXLENBQUMsa0JBQVosQ0FBK0IsZUFBL0I7ZUFDQSxRQUFBLENBQVMsSUFBVDtNQUY4QixDQUFoQzthQUdBLFdBQVcsQ0FBQyxJQUFaLENBQWlCLGFBQWpCLEVBQWdDLGVBQWhDO0lBTFU7O2tDQU9aLGdCQUFBLEdBQWtCLFNBQUE7YUFDaEIsTUFBTSxDQUFDLGdCQUFQLENBQUE7SUFEZ0I7O2tDQUdsQixXQUFBLEdBQWEsU0FBQTthQUNYLFVBQVUsQ0FBQyxJQUFYLENBQWdCLGVBQWhCLEVBQWlDLE9BQWpDO0lBRFc7O2tDQUdiLHVCQUFBLEdBQXlCLFNBQUE7YUFDdkIsVUFBVSxDQUFDLElBQVgsQ0FBZ0IsNEJBQWhCLENBQTZDLENBQUMsSUFBOUMsQ0FBbUQsU0FBQyxTQUFEO2VBQWUsSUFBSSxDQUFDLEtBQUwsQ0FBVyxTQUFYO01BQWYsQ0FBbkQ7SUFEdUI7O2tDQUd6Qix1QkFBQSxHQUF5QixTQUFDLEtBQUQ7YUFDdkIsVUFBVSxDQUFDLElBQVgsQ0FBZ0IsNEJBQWhCLEVBQThDLElBQUksQ0FBQyxTQUFMLENBQWUsS0FBZixDQUE5QztJQUR1Qjs7a0NBR3pCLGFBQUEsR0FBZSxTQUFBO0FBQ2IsVUFBQTtNQUFBLE9BQWtCLE1BQU0sQ0FBQyxnQkFBUCxDQUFBLENBQXlCLENBQUMsT0FBMUIsQ0FBQSxDQUFsQixFQUFDLGVBQUQsRUFBUTthQUNSO1FBQUMsT0FBQSxLQUFEO1FBQVEsUUFBQSxNQUFSOztJQUZhOztrQ0FJZixhQUFBLEdBQWUsU0FBQyxLQUFELEVBQVEsTUFBUjthQUNiLFVBQVUsQ0FBQyxJQUFYLENBQWdCLGlCQUFoQixFQUFtQyxLQUFuQyxFQUEwQyxNQUExQztJQURhOztrQ0FHZixpQkFBQSxHQUFtQixTQUFBO0FBQ2pCLFVBQUE7TUFBQSxPQUFTLE1BQU0sQ0FBQyxnQkFBUCxDQUFBLENBQXlCLENBQUMsV0FBMUIsQ0FBQSxDQUFULEVBQUMsV0FBRCxFQUFJO2FBQ0o7UUFBQyxHQUFBLENBQUQ7UUFBSSxHQUFBLENBQUo7O0lBRmlCOztrQ0FJbkIsaUJBQUEsR0FBbUIsU0FBQyxDQUFELEVBQUksQ0FBSjthQUNqQixVQUFVLENBQUMsSUFBWCxDQUFnQixxQkFBaEIsRUFBdUMsQ0FBdkMsRUFBMEMsQ0FBMUM7SUFEaUI7O2tDQUduQixZQUFBLEdBQWMsU0FBQTthQUNaLFVBQVUsQ0FBQyxJQUFYLENBQWdCLGVBQWhCO0lBRFk7O2tDQUdkLFdBQUEsR0FBYSxTQUFBO2FBQ1gsVUFBVSxDQUFDLElBQVgsQ0FBZ0IsY0FBaEI7SUFEVzs7a0NBR2IsVUFBQSxHQUFZLFNBQUE7YUFDVixVQUFVLENBQUMsSUFBWCxDQUFnQixhQUFoQjtJQURVOztrQ0FHWixVQUFBLEdBQVksU0FBQTthQUNWLFVBQVUsQ0FBQyxJQUFYLENBQWdCLGFBQWhCO0lBRFU7O2tDQUdaLFlBQUEsR0FBYyxTQUFBO2FBQ1osVUFBVSxDQUFDLElBQVgsQ0FBZ0IsZUFBaEIsRUFBaUMsUUFBakM7SUFEWTs7a0NBR2Qsa0JBQUEsR0FBb0IsU0FBQTthQUNsQixXQUFXLENBQUMsSUFBWixDQUFpQixxQkFBakI7SUFEa0I7O2tDQUdwQixjQUFBLEdBQWdCLFNBQUE7YUFDZCxVQUFVLENBQUMsSUFBWCxDQUFnQixlQUFoQixFQUFpQyxVQUFqQztJQURjOztrQ0FHaEIsaUJBQUEsR0FBbUIsU0FBQTthQUNqQixNQUFNLENBQUMsZ0JBQVAsQ0FBQSxDQUF5QixDQUFDLFdBQTFCLENBQUE7SUFEaUI7O2tDQUduQixjQUFBLEdBQWdCLFNBQUE7YUFDZCxVQUFVLENBQUMsSUFBWCxDQUFnQixlQUFoQixFQUFpQyxVQUFqQztJQURjOztrQ0FHaEIsZ0JBQUEsR0FBa0IsU0FBQTthQUNoQixVQUFVLENBQUMsSUFBWCxDQUFnQixlQUFoQixFQUFpQyxZQUFqQztJQURnQjs7a0NBR2xCLGtCQUFBLEdBQW9CLFNBQUE7YUFDbEIsTUFBTSxDQUFDLGdCQUFQLENBQUEsQ0FBeUIsQ0FBQyxZQUExQixDQUFBO0lBRGtCOztrQ0FHcEIsbUJBQUEsR0FBcUIsU0FBQyxVQUFEOztRQUFDLGFBQVc7O2FBQy9CLFVBQVUsQ0FBQyxJQUFYLENBQWdCLGVBQWhCLEVBQWlDLGVBQWpDLEVBQWtELFVBQWxEO0lBRG1COztrQ0FHckIsb0JBQUEsR0FBc0IsU0FBQyxRQUFEO2FBQ3BCLFVBQVUsQ0FBQyxFQUFYLENBQWMsV0FBZCxFQUEyQix1QkFBM0IsRUFBb0QsUUFBcEQ7SUFEb0I7O2tDQUd0QixvQkFBQSxHQUFzQixTQUFDLFFBQUQ7YUFDcEIsVUFBVSxDQUFDLEVBQVgsQ0FBYyxXQUFkLEVBQTJCLHVCQUEzQixFQUFvRCxRQUFwRDtJQURvQjs7a0NBR3RCLGtCQUFBLEdBQW9CLFNBQUE7YUFJbEIsSUFBSSxPQUFKLENBQVksT0FBTyxDQUFDLFFBQXBCLENBQTZCLENBQUMsSUFBOUIsQ0FBbUMsU0FBQTtlQUFHLFVBQVUsQ0FBQyxJQUFYLENBQWdCLGVBQWhCLEVBQWlDLGNBQWpDO01BQUgsQ0FBbkM7SUFKa0I7O2tDQU1wQixtQkFBQSxHQUFxQixTQUFBO2FBSW5CLElBQUksT0FBSixDQUFZLE9BQU8sQ0FBQyxRQUFwQixDQUE2QixDQUFDLElBQTlCLENBQW1DLFNBQUE7ZUFBRyxVQUFVLENBQUMsSUFBWCxDQUFnQixlQUFoQixFQUFpQyxlQUFqQztNQUFILENBQW5DO0lBSm1COztrQ0FNckIsb0JBQUEsR0FBc0IsU0FBQTthQUlwQixJQUFJLE9BQUosQ0FBWSxPQUFPLENBQUMsUUFBcEIsQ0FBNkIsQ0FBQyxJQUE5QixDQUFtQyxTQUFBO2VBQUcsVUFBVSxDQUFDLElBQVgsQ0FBZ0IsZUFBaEIsRUFBaUMsZ0JBQWpDO01BQUgsQ0FBbkM7SUFKb0I7O2tDQU10QixpQ0FBQSxHQUFtQyxTQUFDLElBQUQ7YUFDakMsV0FBVyxDQUFDLElBQVosQ0FBaUIsaUNBQWpCLEVBQW9ELElBQXBEO0lBRGlDOztrQ0FHbkMsdUJBQUEsR0FBeUIsU0FBQyxNQUFEO2FBQ3ZCLFVBQVUsQ0FBQyxJQUFYLENBQWdCLGVBQWhCLEVBQWlDLG1CQUFqQyxFQUFzRCxNQUF0RDtJQUR1Qjs7a0NBR3pCLHNCQUFBLEdBQXdCLFNBQUMsUUFBRDthQUN0QixVQUFVLENBQUMsSUFBWCxDQUFnQixlQUFoQixFQUFpQyx3QkFBakMsRUFBMkQsUUFBM0Q7SUFEc0I7O2tDQUd4QixpQkFBQSxHQUFtQixTQUFDLFFBQUQ7YUFDakIsV0FBVyxDQUFDLElBQVosQ0FBaUIscUJBQWpCLEVBQXdDLFFBQXhDO0lBRGlCOztrQ0FHbkIsNEJBQUEsR0FBOEIsU0FBQyxLQUFEO2FBQzVCLFVBQVUsQ0FBQyxJQUFYLENBQWdCLGVBQWhCLEVBQWlDLDhCQUFqQyxFQUFpRSxLQUFqRTtJQUQ0Qjs7a0NBRzlCLHdCQUFBLEdBQTBCLFNBQUMsUUFBRDthQUN4QixVQUFVLENBQUMsSUFBWCxDQUFnQixlQUFoQixFQUFpQyxvQkFBakMsRUFBdUQsUUFBdkQ7SUFEd0I7O2tDQUcxQiwwQkFBQSxHQUE0QixTQUFDLE9BQUQ7YUFDMUIsTUFBTSxDQUFDLGdCQUFQLENBQUEsQ0FBeUIsQ0FBQyxvQkFBMUIsQ0FBK0MsT0FBL0M7SUFEMEI7O2tDQUc1Qiw2QkFBQSxHQUErQixTQUFBO2FBQzdCLE1BQU0sQ0FBQyxNQUFNLENBQUMsaUJBQWQsQ0FBQSxDQUFpQyxDQUFDO0lBREw7O2tDQUcvQixjQUFBLEdBQWdCLFNBQUMsR0FBRCxFQUFNLElBQU47YUFDZCxNQUFNLENBQUMsaUJBQWlCLENBQUMsY0FBekIsQ0FBd0MsR0FBeEMsRUFBNkMsSUFBN0M7SUFEYzs7a0NBR2hCLE9BQUEsR0FBUyxTQUFDLEdBQUQ7QUFDUCxVQUFBO01BRFMsdUJBQVMsdUNBQWlCOztRQUNuQyxVQUFXOztNQUNYLElBQUcsS0FBSyxDQUFDLE9BQU4sQ0FBYyxPQUFkLENBQUg7UUFDRSxZQUFBLEdBQWUsUUFEakI7T0FBQSxNQUFBO1FBR0UsWUFBQSxHQUFlLE1BQU0sQ0FBQyxJQUFQLENBQVksT0FBWixFQUhqQjs7TUFLQSxNQUFBLEdBQVMsTUFBTSxDQUFDLE1BQU0sQ0FBQyxjQUFkLENBQTZCLE1BQU0sQ0FBQyxnQkFBUCxDQUFBLENBQTdCLEVBQXdEO1FBQy9ELElBQUEsRUFBTSxNQUR5RDtRQUUvRCxPQUFBLEVBQVMsT0FGc0Q7UUFHL0QsTUFBQSxFQUFRLGVBSHVEO1FBSS9ELE9BQUEsRUFBUyxZQUpzRDtRQUsvRCxtQkFBQSxFQUFxQixJQUwwQztPQUF4RDtNQVFULElBQUcsS0FBSyxDQUFDLE9BQU4sQ0FBYyxPQUFkLENBQUg7ZUFDRSxPQURGO09BQUEsTUFBQTtRQUdFLFFBQUEsR0FBVyxPQUFRLENBQUEsWUFBYSxDQUFBLE1BQUEsQ0FBYjtnREFDbkIsb0JBSkY7O0lBZk87O2tDQXFCVCxpQkFBQSxHQUFtQixTQUFDLE1BQUQsR0FBQTs7a0NBRW5CLGNBQUEsR0FBZ0IsU0FBQyxNQUFEO01BQ2QsSUFBRyxPQUFPLE1BQVAsS0FBaUIsUUFBcEI7UUFDRSxNQUFBLEdBQVM7VUFBQyxXQUFBLEVBQWEsTUFBZDtVQURYOzthQUVBLElBQUMsQ0FBQSxnQkFBRCxDQUFBLENBQW1CLENBQUMsY0FBcEIsQ0FBbUMsTUFBbkM7SUFIYzs7a0NBS2hCLGFBQUEsR0FBZSxTQUFBO2FBQ2IsS0FBSyxDQUFDLElBQU4sQ0FBQTtJQURhOztrQ0FHZixrQkFBQSxHQUFvQixTQUFDLFFBQUQ7QUFDbEIsVUFBQTtNQUFBLGFBQUEsR0FBZ0IsU0FBQyxLQUFELEVBQVEsT0FBUixFQUFpQixNQUFqQjtRQUNkLElBQW9CLE9BQUEsS0FBVyxnQkFBL0I7aUJBQUEsUUFBQSxDQUFTLE1BQVQsRUFBQTs7TUFEYztNQUdoQixXQUFXLENBQUMsRUFBWixDQUFlLFNBQWYsRUFBMEIsYUFBMUI7YUFDQSxJQUFJLFVBQUosQ0FBZSxTQUFBO2VBQ2IsV0FBVyxDQUFDLGNBQVosQ0FBMkIsU0FBM0IsRUFBc0MsYUFBdEM7TUFEYSxDQUFmO0lBTGtCOztrQ0FRcEIsaUJBQUEsR0FBbUIsU0FBQyxRQUFEO0FBQ2pCLFVBQUE7TUFBQSxhQUFBLEdBQWdCLFNBQUMsS0FBRCxFQUFRLE9BQVIsRUFBaUIsTUFBakI7UUFJZCxJQUFvQixPQUFBLEtBQVcsOEJBQS9CO2lCQUFBLFFBQUEsQ0FBUyxNQUFULEVBQUE7O01BSmM7TUFNaEIsV0FBVyxDQUFDLEVBQVosQ0FBZSxTQUFmLEVBQTBCLGFBQTFCO2FBQ0EsSUFBSSxVQUFKLENBQWUsU0FBQTtlQUNiLFdBQVcsQ0FBQyxjQUFaLENBQTJCLFNBQTNCLEVBQXNDLGFBQXRDO01BRGEsQ0FBZjtJQVJpQjs7a0NBV25CLDJCQUFBLEdBQTZCLFNBQUMsUUFBRDthQUMzQixJQUFDLENBQUEsaUJBQUQsQ0FBbUIsUUFBbkI7SUFEMkI7O2tDQUc3QiwyQkFBQSxHQUE2QixTQUFDLFFBQUQ7QUFDM0IsVUFBQTtNQUFBLGFBQUEsR0FBZ0IsU0FBQyxLQUFELEVBQVEsT0FBUixFQUFpQixNQUFqQjtRQUNkLElBQW9CLE9BQUEsS0FBVyxxQkFBL0I7aUJBQUEsUUFBQSxDQUFTLE1BQVQsRUFBQTs7TUFEYztNQUdoQixXQUFXLENBQUMsRUFBWixDQUFlLFNBQWYsRUFBMEIsYUFBMUI7YUFDQSxJQUFJLFVBQUosQ0FBZSxTQUFBO2VBQ2IsV0FBVyxDQUFDLGNBQVosQ0FBMkIsU0FBM0IsRUFBc0MsYUFBdEM7TUFEYSxDQUFmO0lBTDJCOztrQ0FRN0IsOEJBQUEsR0FBZ0MsU0FBQyxRQUFEO0FBQzlCLFVBQUE7TUFBQSxhQUFBLEdBQWdCLFNBQUMsS0FBRCxFQUFRLE9BQVIsRUFBaUIsTUFBakI7UUFFZCxJQUFvQixPQUFBLEtBQVcsa0JBQS9CO2lCQUFBLFFBQUEsQ0FBUyxNQUFULEVBQUE7O01BRmM7TUFJaEIsV0FBVyxDQUFDLEVBQVosQ0FBZSxTQUFmLEVBQTBCLGFBQTFCO2FBQ0EsSUFBSSxVQUFKLENBQWUsU0FBQTtlQUNiLFdBQVcsQ0FBQyxjQUFaLENBQTJCLFNBQTNCLEVBQXNDLGFBQXRDO01BRGEsQ0FBZjtJQU44Qjs7a0NBU2hDLG9CQUFBLEdBQXNCLFNBQUMsUUFBRDtBQUNwQixVQUFBO01BQUEsYUFBQSxHQUFnQixTQUFDLEtBQUQsRUFBUSxPQUFSLEVBQWlCLE1BQWpCO1FBQ2QsSUFBb0IsT0FBQSxLQUFXLHNCQUEvQjtpQkFBQSxRQUFBLENBQVMsTUFBVCxFQUFBOztNQURjO01BR2hCLFdBQVcsQ0FBQyxFQUFaLENBQWUsU0FBZixFQUEwQixhQUExQjthQUNBLElBQUksVUFBSixDQUFlLFNBQUE7ZUFDYixXQUFXLENBQUMsY0FBWixDQUEyQixTQUEzQixFQUFzQyxhQUF0QztNQURhLENBQWY7SUFMb0I7O2tDQVF0QixhQUFBLEdBQWUsU0FBQyxRQUFEO0FBQ2IsVUFBQTtNQUFBLGFBQUEsR0FBZ0IsU0FBQyxLQUFELEVBQVEsT0FBUixFQUFpQixNQUFqQjtRQUNkLElBQW9CLE9BQUEsS0FBVyxjQUEvQjtpQkFBQSxRQUFBLENBQVMsTUFBVCxFQUFBOztNQURjO01BR2hCLFdBQVcsQ0FBQyxFQUFaLENBQWUsU0FBZixFQUEwQixhQUExQjthQUNBLElBQUksVUFBSixDQUFlLFNBQUE7ZUFDYixXQUFXLENBQUMsY0FBWixDQUEyQixTQUEzQixFQUFzQyxhQUF0QztNQURhLENBQWY7SUFMYTs7a0NBUWYsd0JBQUEsR0FBMEIsU0FBQyxRQUFEO0FBQ3hCLFVBQUE7TUFBQSxhQUFBLEdBQWdCLFNBQUE7QUFDZCxZQUFBO1FBRGUsc0JBQU87ZUFDdEIsUUFBQSxhQUFTLElBQVQ7TUFEYztNQUdoQixXQUFXLENBQUMsRUFBWixDQUFlLFNBQWYsRUFBMEIsYUFBMUI7YUFDQSxJQUFJLFVBQUosQ0FBZSxTQUFBO2VBQ2IsV0FBVyxDQUFDLGNBQVosQ0FBMkIsU0FBM0IsRUFBc0MsYUFBdEM7TUFEYSxDQUFmO0lBTHdCOztrQ0FRMUIsb0JBQUEsR0FBc0IsU0FBQyxRQUFEO0FBQ3BCLFVBQUE7TUFBQSxhQUFBLEdBQWdCLFNBQUE7QUFDZCxZQUFBO1FBRGUsc0JBQU87ZUFDdEIsUUFBQSxhQUFTLElBQVQ7TUFEYztNQUdoQixXQUFXLENBQUMsRUFBWixDQUFlLGlCQUFmLEVBQWtDLGFBQWxDO2FBQ0EsSUFBSSxVQUFKLENBQWUsU0FBQTtlQUNiLFdBQVcsQ0FBQyxjQUFaLENBQTJCLGlCQUEzQixFQUE4QyxhQUE5QztNQURhLENBQWY7SUFMb0I7O2tDQVF0QixZQUFBLEdBQWMsU0FBQyxRQUFEO0FBQ1osVUFBQTtNQUFBLGFBQUEsR0FBZ0IsU0FBQTtBQUNkLFlBQUE7UUFEZSxzQkFBTztlQUN0QixRQUFBLGFBQVMsSUFBVDtNQURjO01BR2hCLFdBQVcsQ0FBQyxFQUFaLENBQWUsYUFBZixFQUE4QixhQUE5QjthQUNBLElBQUksVUFBSixDQUFlLFNBQUE7ZUFDYixXQUFXLENBQUMsY0FBWixDQUEyQixhQUEzQixFQUEwQyxhQUExQztNQURhLENBQWY7SUFMWTs7a0NBUWQsa0JBQUEsR0FBb0IsU0FBQyxRQUFEO0FBQ2xCLFVBQUE7TUFBQSxhQUFBLEdBQWdCLFNBQUMsS0FBRCxFQUFRLE9BQVI7ZUFDZCxRQUFBLENBQVMsS0FBVCxDQUFlLENBQUMsSUFBaEIsQ0FBcUIsU0FBQyxZQUFEO2lCQUNuQixXQUFXLENBQUMsSUFBWixDQUFpQix1QkFBakIsRUFBMEMsWUFBMUM7UUFEbUIsQ0FBckI7TUFEYztNQUloQixXQUFXLENBQUMsRUFBWixDQUFlLG1CQUFmLEVBQW9DLGFBQXBDO2FBQ0EsSUFBSSxVQUFKLENBQWUsU0FBQTtlQUNiLFdBQVcsQ0FBQyxjQUFaLENBQTJCLG1CQUEzQixFQUFnRCxhQUFoRDtNQURhLENBQWY7SUFOa0I7O2tDQVNwQix5QkFBQSxHQUEyQixTQUFDLFFBQUQ7QUFDekIsVUFBQTtNQUFBLGFBQUEsR0FBZ0IsU0FBQyxLQUFELEVBQVEsT0FBUjtlQUNkLFFBQUEsQ0FBUyxLQUFUO01BRGM7TUFHaEIsV0FBVyxDQUFDLEVBQVosQ0FBZSw0QkFBZixFQUE2QyxhQUE3QzthQUNBLElBQUksVUFBSixDQUFlLFNBQUE7ZUFDYixXQUFXLENBQUMsY0FBWixDQUEyQiw0QkFBM0IsRUFBeUQsYUFBekQ7TUFEYSxDQUFmO0lBTHlCOztrQ0FRM0IsdUJBQUEsR0FBeUIsU0FBQTthQUN2QixXQUFXLENBQUMsSUFBWixDQUFpQiw0QkFBakI7SUFEdUI7O2tDQUd6QixZQUFBLEdBQWMsU0FBQyxHQUFEO2FBQ1osS0FBSyxDQUFDLFlBQU4sQ0FBbUIsR0FBbkI7SUFEWTs7a0NBR2QsY0FBQSxHQUFnQixTQUFBO2FBQ2QsV0FBVyxDQUFDLElBQVosQ0FBaUIsU0FBakIsRUFBNEIsOEJBQTVCO0lBRGM7O2tDQUdoQix1QkFBQSxHQUF5QixTQUFBO2FBQ3ZCLFdBQVcsQ0FBQyxJQUFaLENBQWlCLFNBQWpCLEVBQTRCLDRCQUE1QjtJQUR1Qjs7a0NBR3pCLHlCQUFBLEdBQTJCLFNBQUE7YUFDekIsV0FBVyxDQUFDLFFBQVosQ0FBcUIsK0JBQXJCO0lBRHlCOztrQ0FHM0IsZ0NBQUEsR0FBa0MsU0FBQTthQUNoQyxXQUFXLENBQUMsUUFBWixDQUFxQiwrQkFBckI7SUFEZ0M7O2tDQUdsQyxnQkFBQSxHQUFrQixTQUFDLElBQUQ7YUFDaEIsV0FBVyxDQUFDLFFBQVosQ0FBcUIsZ0JBQXJCLEVBQXVDLElBQXZDO0lBRGdCOztrQ0FHbEIsZUFBQSxHQUFpQixTQUFDLElBQUQ7YUFDZixXQUFXLENBQUMsUUFBWixDQUFxQixlQUFyQixFQUFzQyxJQUF0QztJQURlOztrQ0FHakIsWUFBQSxHQUFjLFNBQUMsU0FBRCxFQUFZLEdBQVo7YUFDWixXQUFXLENBQUMsSUFBWixDQUFpQixlQUFqQixFQUFrQyxTQUFsQyxFQUE2QyxHQUE3QztJQURZOztrQ0FHZCxpQkFBQSxHQUFtQixTQUFDLFFBQUQ7QUFDakIsVUFBQTtNQUFBLGFBQUEsR0FBZ0IsU0FBQyxLQUFELEVBQVEsU0FBUixFQUFtQixLQUFuQjtlQUNkLFFBQUEsQ0FBUyxTQUFULEVBQW9CLEtBQXBCO01BRGM7TUFHaEIsV0FBVyxDQUFDLEVBQVosQ0FBZSxtQkFBZixFQUFvQyxhQUFwQzthQUNBLElBQUksVUFBSixDQUFlLFNBQUE7ZUFDYixXQUFXLENBQUMsY0FBWixDQUEyQixtQkFBM0IsRUFBZ0QsYUFBaEQ7TUFEYSxDQUFmO0lBTGlCOzs7OztBQTlSckIiLCJzb3VyY2VzQ29udGVudCI6WyJ7aXBjUmVuZGVyZXIsIHJlbW90ZSwgc2hlbGx9ID0gcmVxdWlyZSAnZWxlY3Ryb24nXG5pcGNIZWxwZXJzID0gcmVxdWlyZSAnLi9pcGMtaGVscGVycydcbntEaXNwb3NhYmxlfSA9IHJlcXVpcmUgJ2V2ZW50LWtpdCdcbmdldFdpbmRvd0xvYWRTZXR0aW5ncyA9IHJlcXVpcmUgJy4vZ2V0LXdpbmRvdy1sb2FkLXNldHRpbmdzJ1xuXG5tb2R1bGUuZXhwb3J0cyA9XG5jbGFzcyBBcHBsaWNhdGlvbkRlbGVnYXRlXG4gIGdldFdpbmRvd0xvYWRTZXR0aW5nczogLT4gZ2V0V2luZG93TG9hZFNldHRpbmdzKClcblxuICBvcGVuOiAocGFyYW1zKSAtPlxuICAgIGlwY1JlbmRlcmVyLnNlbmQoJ29wZW4nLCBwYXJhbXMpXG5cbiAgcGlja0ZvbGRlcjogKGNhbGxiYWNrKSAtPlxuICAgIHJlc3BvbnNlQ2hhbm5lbCA9IFwiYXRvbS1waWNrLWZvbGRlci1yZXNwb25zZVwiXG4gICAgaXBjUmVuZGVyZXIub24gcmVzcG9uc2VDaGFubmVsLCAoZXZlbnQsIHBhdGgpIC0+XG4gICAgICBpcGNSZW5kZXJlci5yZW1vdmVBbGxMaXN0ZW5lcnMocmVzcG9uc2VDaGFubmVsKVxuICAgICAgY2FsbGJhY2socGF0aClcbiAgICBpcGNSZW5kZXJlci5zZW5kKFwicGljay1mb2xkZXJcIiwgcmVzcG9uc2VDaGFubmVsKVxuXG4gIGdldEN1cnJlbnRXaW5kb3c6IC0+XG4gICAgcmVtb3RlLmdldEN1cnJlbnRXaW5kb3coKVxuXG4gIGNsb3NlV2luZG93OiAtPlxuICAgIGlwY0hlbHBlcnMuY2FsbCgnd2luZG93LW1ldGhvZCcsICdjbG9zZScpXG5cbiAgZ2V0VGVtcG9yYXJ5V2luZG93U3RhdGU6IC0+XG4gICAgaXBjSGVscGVycy5jYWxsKCdnZXQtdGVtcG9yYXJ5LXdpbmRvdy1zdGF0ZScpLnRoZW4gKHN0YXRlSlNPTikgLT4gSlNPTi5wYXJzZShzdGF0ZUpTT04pXG5cbiAgc2V0VGVtcG9yYXJ5V2luZG93U3RhdGU6IChzdGF0ZSkgLT5cbiAgICBpcGNIZWxwZXJzLmNhbGwoJ3NldC10ZW1wb3Jhcnktd2luZG93LXN0YXRlJywgSlNPTi5zdHJpbmdpZnkoc3RhdGUpKVxuXG4gIGdldFdpbmRvd1NpemU6IC0+XG4gICAgW3dpZHRoLCBoZWlnaHRdID0gcmVtb3RlLmdldEN1cnJlbnRXaW5kb3coKS5nZXRTaXplKClcbiAgICB7d2lkdGgsIGhlaWdodH1cblxuICBzZXRXaW5kb3dTaXplOiAod2lkdGgsIGhlaWdodCkgLT5cbiAgICBpcGNIZWxwZXJzLmNhbGwoJ3NldC13aW5kb3ctc2l6ZScsIHdpZHRoLCBoZWlnaHQpXG5cbiAgZ2V0V2luZG93UG9zaXRpb246IC0+XG4gICAgW3gsIHldID0gcmVtb3RlLmdldEN1cnJlbnRXaW5kb3coKS5nZXRQb3NpdGlvbigpXG4gICAge3gsIHl9XG5cbiAgc2V0V2luZG93UG9zaXRpb246ICh4LCB5KSAtPlxuICAgIGlwY0hlbHBlcnMuY2FsbCgnc2V0LXdpbmRvdy1wb3NpdGlvbicsIHgsIHkpXG5cbiAgY2VudGVyV2luZG93OiAtPlxuICAgIGlwY0hlbHBlcnMuY2FsbCgnY2VudGVyLXdpbmRvdycpXG5cbiAgZm9jdXNXaW5kb3c6IC0+XG4gICAgaXBjSGVscGVycy5jYWxsKCdmb2N1cy13aW5kb3cnKVxuXG4gIHNob3dXaW5kb3c6IC0+XG4gICAgaXBjSGVscGVycy5jYWxsKCdzaG93LXdpbmRvdycpXG5cbiAgaGlkZVdpbmRvdzogLT5cbiAgICBpcGNIZWxwZXJzLmNhbGwoJ2hpZGUtd2luZG93JylcblxuICByZWxvYWRXaW5kb3c6IC0+XG4gICAgaXBjSGVscGVycy5jYWxsKCd3aW5kb3ctbWV0aG9kJywgJ3JlbG9hZCcpXG5cbiAgcmVzdGFydEFwcGxpY2F0aW9uOiAtPlxuICAgIGlwY1JlbmRlcmVyLnNlbmQoXCJyZXN0YXJ0LWFwcGxpY2F0aW9uXCIpXG5cbiAgbWluaW1pemVXaW5kb3c6IC0+XG4gICAgaXBjSGVscGVycy5jYWxsKCd3aW5kb3ctbWV0aG9kJywgJ21pbmltaXplJylcblxuICBpc1dpbmRvd01heGltaXplZDogLT5cbiAgICByZW1vdGUuZ2V0Q3VycmVudFdpbmRvdygpLmlzTWF4aW1pemVkKClcblxuICBtYXhpbWl6ZVdpbmRvdzogLT5cbiAgICBpcGNIZWxwZXJzLmNhbGwoJ3dpbmRvdy1tZXRob2QnLCAnbWF4aW1pemUnKVxuXG4gIHVubWF4aW1pemVXaW5kb3c6IC0+XG4gICAgaXBjSGVscGVycy5jYWxsKCd3aW5kb3ctbWV0aG9kJywgJ3VubWF4aW1pemUnKVxuXG4gIGlzV2luZG93RnVsbFNjcmVlbjogLT5cbiAgICByZW1vdGUuZ2V0Q3VycmVudFdpbmRvdygpLmlzRnVsbFNjcmVlbigpXG5cbiAgc2V0V2luZG93RnVsbFNjcmVlbjogKGZ1bGxTY3JlZW49ZmFsc2UpIC0+XG4gICAgaXBjSGVscGVycy5jYWxsKCd3aW5kb3ctbWV0aG9kJywgJ3NldEZ1bGxTY3JlZW4nLCBmdWxsU2NyZWVuKVxuXG4gIG9uRGlkRW50ZXJGdWxsU2NyZWVuOiAoY2FsbGJhY2spIC0+XG4gICAgaXBjSGVscGVycy5vbihpcGNSZW5kZXJlciwgJ2RpZC1lbnRlci1mdWxsLXNjcmVlbicsIGNhbGxiYWNrKVxuXG4gIG9uRGlkTGVhdmVGdWxsU2NyZWVuOiAoY2FsbGJhY2spIC0+XG4gICAgaXBjSGVscGVycy5vbihpcGNSZW5kZXJlciwgJ2RpZC1sZWF2ZS1mdWxsLXNjcmVlbicsIGNhbGxiYWNrKVxuXG4gIG9wZW5XaW5kb3dEZXZUb29sczogLT5cbiAgICAjIERlZmVyIERldlRvb2xzIGludGVyYWN0aW9uIHRvIHRoZSBuZXh0IHRpY2ssIGJlY2F1c2UgdXNpbmcgdGhlbSBkdXJpbmdcbiAgICAjIGV2ZW50IGhhbmRsaW5nIGNhdXNlcyBzb21lIHdyb25nIGlucHV0IGV2ZW50cyB0byBiZSB0cmlnZ2VyZWQgb25cbiAgICAjIGBUZXh0RWRpdG9yQ29tcG9uZW50YCAoUmVmLjogaHR0cHM6Ly9naXRodWIuY29tL2F0b20vYXRvbS9pc3N1ZXMvOTY5NykuXG4gICAgbmV3IFByb21pc2UocHJvY2Vzcy5uZXh0VGljaykudGhlbigtPiBpcGNIZWxwZXJzLmNhbGwoJ3dpbmRvdy1tZXRob2QnLCAnb3BlbkRldlRvb2xzJykpXG5cbiAgY2xvc2VXaW5kb3dEZXZUb29sczogLT5cbiAgICAjIERlZmVyIERldlRvb2xzIGludGVyYWN0aW9uIHRvIHRoZSBuZXh0IHRpY2ssIGJlY2F1c2UgdXNpbmcgdGhlbSBkdXJpbmdcbiAgICAjIGV2ZW50IGhhbmRsaW5nIGNhdXNlcyBzb21lIHdyb25nIGlucHV0IGV2ZW50cyB0byBiZSB0cmlnZ2VyZWQgb25cbiAgICAjIGBUZXh0RWRpdG9yQ29tcG9uZW50YCAoUmVmLjogaHR0cHM6Ly9naXRodWIuY29tL2F0b20vYXRvbS9pc3N1ZXMvOTY5NykuXG4gICAgbmV3IFByb21pc2UocHJvY2Vzcy5uZXh0VGljaykudGhlbigtPiBpcGNIZWxwZXJzLmNhbGwoJ3dpbmRvdy1tZXRob2QnLCAnY2xvc2VEZXZUb29scycpKVxuXG4gIHRvZ2dsZVdpbmRvd0RldlRvb2xzOiAtPlxuICAgICMgRGVmZXIgRGV2VG9vbHMgaW50ZXJhY3Rpb24gdG8gdGhlIG5leHQgdGljaywgYmVjYXVzZSB1c2luZyB0aGVtIGR1cmluZ1xuICAgICMgZXZlbnQgaGFuZGxpbmcgY2F1c2VzIHNvbWUgd3JvbmcgaW5wdXQgZXZlbnRzIHRvIGJlIHRyaWdnZXJlZCBvblxuICAgICMgYFRleHRFZGl0b3JDb21wb25lbnRgIChSZWYuOiBodHRwczovL2dpdGh1Yi5jb20vYXRvbS9hdG9tL2lzc3Vlcy85Njk3KS5cbiAgICBuZXcgUHJvbWlzZShwcm9jZXNzLm5leHRUaWNrKS50aGVuKC0+IGlwY0hlbHBlcnMuY2FsbCgnd2luZG93LW1ldGhvZCcsICd0b2dnbGVEZXZUb29scycpKVxuXG4gIGV4ZWN1dGVKYXZhU2NyaXB0SW5XaW5kb3dEZXZUb29sczogKGNvZGUpIC0+XG4gICAgaXBjUmVuZGVyZXIuc2VuZChcImV4ZWN1dGUtamF2YXNjcmlwdC1pbi1kZXYtdG9vbHNcIiwgY29kZSlcblxuICBzZXRXaW5kb3dEb2N1bWVudEVkaXRlZDogKGVkaXRlZCkgLT5cbiAgICBpcGNIZWxwZXJzLmNhbGwoJ3dpbmRvdy1tZXRob2QnLCAnc2V0RG9jdW1lbnRFZGl0ZWQnLCBlZGl0ZWQpXG5cbiAgc2V0UmVwcmVzZW50ZWRGaWxlbmFtZTogKGZpbGVuYW1lKSAtPlxuICAgIGlwY0hlbHBlcnMuY2FsbCgnd2luZG93LW1ldGhvZCcsICdzZXRSZXByZXNlbnRlZEZpbGVuYW1lJywgZmlsZW5hbWUpXG5cbiAgYWRkUmVjZW50RG9jdW1lbnQ6IChmaWxlbmFtZSkgLT5cbiAgICBpcGNSZW5kZXJlci5zZW5kKFwiYWRkLXJlY2VudC1kb2N1bWVudFwiLCBmaWxlbmFtZSlcblxuICBzZXRSZXByZXNlbnRlZERpcmVjdG9yeVBhdGhzOiAocGF0aHMpIC0+XG4gICAgaXBjSGVscGVycy5jYWxsKCd3aW5kb3ctbWV0aG9kJywgJ3NldFJlcHJlc2VudGVkRGlyZWN0b3J5UGF0aHMnLCBwYXRocylcblxuICBzZXRBdXRvSGlkZVdpbmRvd01lbnVCYXI6IChhdXRvSGlkZSkgLT5cbiAgICBpcGNIZWxwZXJzLmNhbGwoJ3dpbmRvdy1tZXRob2QnLCAnc2V0QXV0b0hpZGVNZW51QmFyJywgYXV0b0hpZGUpXG5cbiAgc2V0V2luZG93TWVudUJhclZpc2liaWxpdHk6ICh2aXNpYmxlKSAtPlxuICAgIHJlbW90ZS5nZXRDdXJyZW50V2luZG93KCkuc2V0TWVudUJhclZpc2liaWxpdHkodmlzaWJsZSlcblxuICBnZXRQcmltYXJ5RGlzcGxheVdvcmtBcmVhU2l6ZTogLT5cbiAgICByZW1vdGUuc2NyZWVuLmdldFByaW1hcnlEaXNwbGF5KCkud29ya0FyZWFTaXplXG5cbiAgZ2V0VXNlckRlZmF1bHQ6IChrZXksIHR5cGUpIC0+XG4gICAgcmVtb3RlLnN5c3RlbVByZWZlcmVuY2VzLmdldFVzZXJEZWZhdWx0KGtleSwgdHlwZSlcblxuICBjb25maXJtOiAoe21lc3NhZ2UsIGRldGFpbGVkTWVzc2FnZSwgYnV0dG9uc30pIC0+XG4gICAgYnV0dG9ucyA/PSB7fVxuICAgIGlmIEFycmF5LmlzQXJyYXkoYnV0dG9ucylcbiAgICAgIGJ1dHRvbkxhYmVscyA9IGJ1dHRvbnNcbiAgICBlbHNlXG4gICAgICBidXR0b25MYWJlbHMgPSBPYmplY3Qua2V5cyhidXR0b25zKVxuXG4gICAgY2hvc2VuID0gcmVtb3RlLmRpYWxvZy5zaG93TWVzc2FnZUJveChyZW1vdGUuZ2V0Q3VycmVudFdpbmRvdygpLCB7XG4gICAgICB0eXBlOiAnaW5mbydcbiAgICAgIG1lc3NhZ2U6IG1lc3NhZ2VcbiAgICAgIGRldGFpbDogZGV0YWlsZWRNZXNzYWdlXG4gICAgICBidXR0b25zOiBidXR0b25MYWJlbHNcbiAgICAgIG5vcm1hbGl6ZUFjY2Vzc0tleXM6IHRydWVcbiAgICB9KVxuXG4gICAgaWYgQXJyYXkuaXNBcnJheShidXR0b25zKVxuICAgICAgY2hvc2VuXG4gICAgZWxzZVxuICAgICAgY2FsbGJhY2sgPSBidXR0b25zW2J1dHRvbkxhYmVsc1tjaG9zZW5dXVxuICAgICAgY2FsbGJhY2s/KClcblxuICBzaG93TWVzc2FnZURpYWxvZzogKHBhcmFtcykgLT5cblxuICBzaG93U2F2ZURpYWxvZzogKHBhcmFtcykgLT5cbiAgICBpZiB0eXBlb2YgcGFyYW1zIGlzICdzdHJpbmcnXG4gICAgICBwYXJhbXMgPSB7ZGVmYXVsdFBhdGg6IHBhcmFtc31cbiAgICBAZ2V0Q3VycmVudFdpbmRvdygpLnNob3dTYXZlRGlhbG9nKHBhcmFtcylcblxuICBwbGF5QmVlcFNvdW5kOiAtPlxuICAgIHNoZWxsLmJlZXAoKVxuXG4gIG9uRGlkT3BlbkxvY2F0aW9uczogKGNhbGxiYWNrKSAtPlxuICAgIG91dGVyQ2FsbGJhY2sgPSAoZXZlbnQsIG1lc3NhZ2UsIGRldGFpbCkgLT5cbiAgICAgIGNhbGxiYWNrKGRldGFpbCkgaWYgbWVzc2FnZSBpcyAnb3Blbi1sb2NhdGlvbnMnXG5cbiAgICBpcGNSZW5kZXJlci5vbignbWVzc2FnZScsIG91dGVyQ2FsbGJhY2spXG4gICAgbmV3IERpc3Bvc2FibGUgLT5cbiAgICAgIGlwY1JlbmRlcmVyLnJlbW92ZUxpc3RlbmVyKCdtZXNzYWdlJywgb3V0ZXJDYWxsYmFjaylcblxuICBvblVwZGF0ZUF2YWlsYWJsZTogKGNhbGxiYWNrKSAtPlxuICAgIG91dGVyQ2FsbGJhY2sgPSAoZXZlbnQsIG1lc3NhZ2UsIGRldGFpbCkgLT5cbiAgICAgICMgVE9ETzogWWVzLCB0aGlzIGlzIHN0cmFuZ2UgdGhhdCBgb25VcGRhdGVBdmFpbGFibGVgIGlzIGxpc3RlbmluZyBmb3JcbiAgICAgICMgYGRpZC1iZWdpbi1kb3dubG9hZGluZy11cGRhdGVgLiBXZSBjdXJyZW50bHkgaGF2ZSBubyBtZWNoYW5pc20gdG8ga25vd1xuICAgICAgIyBpZiB0aGVyZSBpcyBhbiB1cGRhdGUsIHNvIGJlZ2luIG9mIGRvd25sb2FkaW5nIGlzIGEgZ29vZCBwcm94eS5cbiAgICAgIGNhbGxiYWNrKGRldGFpbCkgaWYgbWVzc2FnZSBpcyAnZGlkLWJlZ2luLWRvd25sb2FkaW5nLXVwZGF0ZSdcblxuICAgIGlwY1JlbmRlcmVyLm9uKCdtZXNzYWdlJywgb3V0ZXJDYWxsYmFjaylcbiAgICBuZXcgRGlzcG9zYWJsZSAtPlxuICAgICAgaXBjUmVuZGVyZXIucmVtb3ZlTGlzdGVuZXIoJ21lc3NhZ2UnLCBvdXRlckNhbGxiYWNrKVxuXG4gIG9uRGlkQmVnaW5Eb3dubG9hZGluZ1VwZGF0ZTogKGNhbGxiYWNrKSAtPlxuICAgIEBvblVwZGF0ZUF2YWlsYWJsZShjYWxsYmFjaylcblxuICBvbkRpZEJlZ2luQ2hlY2tpbmdGb3JVcGRhdGU6IChjYWxsYmFjaykgLT5cbiAgICBvdXRlckNhbGxiYWNrID0gKGV2ZW50LCBtZXNzYWdlLCBkZXRhaWwpIC0+XG4gICAgICBjYWxsYmFjayhkZXRhaWwpIGlmIG1lc3NhZ2UgaXMgJ2NoZWNraW5nLWZvci11cGRhdGUnXG5cbiAgICBpcGNSZW5kZXJlci5vbignbWVzc2FnZScsIG91dGVyQ2FsbGJhY2spXG4gICAgbmV3IERpc3Bvc2FibGUgLT5cbiAgICAgIGlwY1JlbmRlcmVyLnJlbW92ZUxpc3RlbmVyKCdtZXNzYWdlJywgb3V0ZXJDYWxsYmFjaylcblxuICBvbkRpZENvbXBsZXRlRG93bmxvYWRpbmdVcGRhdGU6IChjYWxsYmFjaykgLT5cbiAgICBvdXRlckNhbGxiYWNrID0gKGV2ZW50LCBtZXNzYWdlLCBkZXRhaWwpIC0+XG4gICAgICAjIFRPRE86IFdlIGNvdWxkIHJlbmFtZSB0aGlzIGV2ZW50IHRvIGBkaWQtY29tcGxldGUtZG93bmxvYWRpbmctdXBkYXRlYFxuICAgICAgY2FsbGJhY2soZGV0YWlsKSBpZiBtZXNzYWdlIGlzICd1cGRhdGUtYXZhaWxhYmxlJ1xuXG4gICAgaXBjUmVuZGVyZXIub24oJ21lc3NhZ2UnLCBvdXRlckNhbGxiYWNrKVxuICAgIG5ldyBEaXNwb3NhYmxlIC0+XG4gICAgICBpcGNSZW5kZXJlci5yZW1vdmVMaXN0ZW5lcignbWVzc2FnZScsIG91dGVyQ2FsbGJhY2spXG5cbiAgb25VcGRhdGVOb3RBdmFpbGFibGU6IChjYWxsYmFjaykgLT5cbiAgICBvdXRlckNhbGxiYWNrID0gKGV2ZW50LCBtZXNzYWdlLCBkZXRhaWwpIC0+XG4gICAgICBjYWxsYmFjayhkZXRhaWwpIGlmIG1lc3NhZ2UgaXMgJ3VwZGF0ZS1ub3QtYXZhaWxhYmxlJ1xuXG4gICAgaXBjUmVuZGVyZXIub24oJ21lc3NhZ2UnLCBvdXRlckNhbGxiYWNrKVxuICAgIG5ldyBEaXNwb3NhYmxlIC0+XG4gICAgICBpcGNSZW5kZXJlci5yZW1vdmVMaXN0ZW5lcignbWVzc2FnZScsIG91dGVyQ2FsbGJhY2spXG5cbiAgb25VcGRhdGVFcnJvcjogKGNhbGxiYWNrKSAtPlxuICAgIG91dGVyQ2FsbGJhY2sgPSAoZXZlbnQsIG1lc3NhZ2UsIGRldGFpbCkgLT5cbiAgICAgIGNhbGxiYWNrKGRldGFpbCkgaWYgbWVzc2FnZSBpcyAndXBkYXRlLWVycm9yJ1xuXG4gICAgaXBjUmVuZGVyZXIub24oJ21lc3NhZ2UnLCBvdXRlckNhbGxiYWNrKVxuICAgIG5ldyBEaXNwb3NhYmxlIC0+XG4gICAgICBpcGNSZW5kZXJlci5yZW1vdmVMaXN0ZW5lcignbWVzc2FnZScsIG91dGVyQ2FsbGJhY2spXG5cbiAgb25BcHBsaWNhdGlvbk1lbnVDb21tYW5kOiAoY2FsbGJhY2spIC0+XG4gICAgb3V0ZXJDYWxsYmFjayA9IChldmVudCwgYXJncy4uLikgLT5cbiAgICAgIGNhbGxiYWNrKGFyZ3MuLi4pXG5cbiAgICBpcGNSZW5kZXJlci5vbignY29tbWFuZCcsIG91dGVyQ2FsbGJhY2spXG4gICAgbmV3IERpc3Bvc2FibGUgLT5cbiAgICAgIGlwY1JlbmRlcmVyLnJlbW92ZUxpc3RlbmVyKCdjb21tYW5kJywgb3V0ZXJDYWxsYmFjaylcblxuICBvbkNvbnRleHRNZW51Q29tbWFuZDogKGNhbGxiYWNrKSAtPlxuICAgIG91dGVyQ2FsbGJhY2sgPSAoZXZlbnQsIGFyZ3MuLi4pIC0+XG4gICAgICBjYWxsYmFjayhhcmdzLi4uKVxuXG4gICAgaXBjUmVuZGVyZXIub24oJ2NvbnRleHQtY29tbWFuZCcsIG91dGVyQ2FsbGJhY2spXG4gICAgbmV3IERpc3Bvc2FibGUgLT5cbiAgICAgIGlwY1JlbmRlcmVyLnJlbW92ZUxpc3RlbmVyKCdjb250ZXh0LWNvbW1hbmQnLCBvdXRlckNhbGxiYWNrKVxuXG4gIG9uVVJJTWVzc2FnZTogKGNhbGxiYWNrKSAtPlxuICAgIG91dGVyQ2FsbGJhY2sgPSAoZXZlbnQsIGFyZ3MuLi4pIC0+XG4gICAgICBjYWxsYmFjayhhcmdzLi4uKVxuXG4gICAgaXBjUmVuZGVyZXIub24oJ3VyaS1tZXNzYWdlJywgb3V0ZXJDYWxsYmFjaylcbiAgICBuZXcgRGlzcG9zYWJsZSAtPlxuICAgICAgaXBjUmVuZGVyZXIucmVtb3ZlTGlzdGVuZXIoJ3VyaS1tZXNzYWdlJywgb3V0ZXJDYWxsYmFjaylcblxuICBvbkRpZFJlcXVlc3RVbmxvYWQ6IChjYWxsYmFjaykgLT5cbiAgICBvdXRlckNhbGxiYWNrID0gKGV2ZW50LCBtZXNzYWdlKSAtPlxuICAgICAgY2FsbGJhY2soZXZlbnQpLnRoZW4gKHNob3VsZFVubG9hZCkgLT5cbiAgICAgICAgaXBjUmVuZGVyZXIuc2VuZCgnZGlkLXByZXBhcmUtdG8tdW5sb2FkJywgc2hvdWxkVW5sb2FkKVxuXG4gICAgaXBjUmVuZGVyZXIub24oJ3ByZXBhcmUtdG8tdW5sb2FkJywgb3V0ZXJDYWxsYmFjaylcbiAgICBuZXcgRGlzcG9zYWJsZSAtPlxuICAgICAgaXBjUmVuZGVyZXIucmVtb3ZlTGlzdGVuZXIoJ3ByZXBhcmUtdG8tdW5sb2FkJywgb3V0ZXJDYWxsYmFjaylcblxuICBvbkRpZENoYW5nZUhpc3RvcnlNYW5hZ2VyOiAoY2FsbGJhY2spIC0+XG4gICAgb3V0ZXJDYWxsYmFjayA9IChldmVudCwgbWVzc2FnZSkgLT5cbiAgICAgIGNhbGxiYWNrKGV2ZW50KVxuXG4gICAgaXBjUmVuZGVyZXIub24oJ2RpZC1jaGFuZ2UtaGlzdG9yeS1tYW5hZ2VyJywgb3V0ZXJDYWxsYmFjaylcbiAgICBuZXcgRGlzcG9zYWJsZSAtPlxuICAgICAgaXBjUmVuZGVyZXIucmVtb3ZlTGlzdGVuZXIoJ2RpZC1jaGFuZ2UtaGlzdG9yeS1tYW5hZ2VyJywgb3V0ZXJDYWxsYmFjaylcblxuICBkaWRDaGFuZ2VIaXN0b3J5TWFuYWdlcjogLT5cbiAgICBpcGNSZW5kZXJlci5zZW5kKCdkaWQtY2hhbmdlLWhpc3RvcnktbWFuYWdlcicpXG5cbiAgb3BlbkV4dGVybmFsOiAodXJsKSAtPlxuICAgIHNoZWxsLm9wZW5FeHRlcm5hbCh1cmwpXG5cbiAgY2hlY2tGb3JVcGRhdGU6IC0+XG4gICAgaXBjUmVuZGVyZXIuc2VuZCgnY29tbWFuZCcsICdhcHBsaWNhdGlvbjpjaGVjay1mb3ItdXBkYXRlJylcblxuICByZXN0YXJ0QW5kSW5zdGFsbFVwZGF0ZTogLT5cbiAgICBpcGNSZW5kZXJlci5zZW5kKCdjb21tYW5kJywgJ2FwcGxpY2F0aW9uOmluc3RhbGwtdXBkYXRlJylcblxuICBnZXRBdXRvVXBkYXRlTWFuYWdlclN0YXRlOiAtPlxuICAgIGlwY1JlbmRlcmVyLnNlbmRTeW5jKCdnZXQtYXV0by11cGRhdGUtbWFuYWdlci1zdGF0ZScpXG5cbiAgZ2V0QXV0b1VwZGF0ZU1hbmFnZXJFcnJvck1lc3NhZ2U6IC0+XG4gICAgaXBjUmVuZGVyZXIuc2VuZFN5bmMoJ2dldC1hdXRvLXVwZGF0ZS1tYW5hZ2VyLWVycm9yJylcblxuICBlbWl0V2lsbFNhdmVQYXRoOiAocGF0aCkgLT5cbiAgICBpcGNSZW5kZXJlci5zZW5kU3luYygnd2lsbC1zYXZlLXBhdGgnLCBwYXRoKVxuXG4gIGVtaXREaWRTYXZlUGF0aDogKHBhdGgpIC0+XG4gICAgaXBjUmVuZGVyZXIuc2VuZFN5bmMoJ2RpZC1zYXZlLXBhdGgnLCBwYXRoKVxuXG4gIHJlc29sdmVQcm94eTogKHJlcXVlc3RJZCwgdXJsKSAtPlxuICAgIGlwY1JlbmRlcmVyLnNlbmQoJ3Jlc29sdmUtcHJveHknLCByZXF1ZXN0SWQsIHVybClcblxuICBvbkRpZFJlc29sdmVQcm94eTogKGNhbGxiYWNrKSAtPlxuICAgIG91dGVyQ2FsbGJhY2sgPSAoZXZlbnQsIHJlcXVlc3RJZCwgcHJveHkpIC0+XG4gICAgICBjYWxsYmFjayhyZXF1ZXN0SWQsIHByb3h5KVxuXG4gICAgaXBjUmVuZGVyZXIub24oJ2RpZC1yZXNvbHZlLXByb3h5Jywgb3V0ZXJDYWxsYmFjaylcbiAgICBuZXcgRGlzcG9zYWJsZSAtPlxuICAgICAgaXBjUmVuZGVyZXIucmVtb3ZlTGlzdGVuZXIoJ2RpZC1yZXNvbHZlLXByb3h5Jywgb3V0ZXJDYWxsYmFjaylcbiJdfQ==
},
"../src/clipboard.js": function (exports, module, __filename, __dirname, require, define) {
Object.defineProperty(exports, '__esModule', {
value: true
});
var _createClass = (function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ('value' in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; })();
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { 'default': obj }; }
function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError('Cannot call a class as a function'); } }
/** @babel */
var _crypto;
function get__crypto() {
return _crypto = _crypto || require('crypto');
}
var _crypto2;
function get__crypto2() {
return _crypto2 = _crypto2 || _interopRequireDefault(get__crypto());
}
var _safeClipboard;
function get__safeClipboard() {
return _safeClipboard = _safeClipboard || require("../src/safe-clipboard.js");
}
var _safeClipboard2;
function get__safeClipboard2() {
return _safeClipboard2 = _safeClipboard2 || _interopRequireDefault(get__safeClipboard());
}
// Extended: Represents the clipboard used for copying and pasting in Atom.
//
// An instance of this class is always available as the `atom.clipboard` global.
//
// ## Examples
//
// ```coffee
// atom.clipboard.write('hello')
//
// console.log(atom.clipboard.read()) # 'hello'
// ```
var Clipboard = (function () {
function Clipboard() {
_classCallCheck(this, Clipboard);
this.reset();
}
_createClass(Clipboard, [{
key: 'reset',
value: function reset() {
this.metadata = null;
this.signatureForMetadata = null;
}
// Creates an `md5` hash of some text.
//
// * `text` A {String} to hash.
//
// Returns a hashed {String}.
}, {
key: 'md5',
value: function md5(text) {
return get__crypto2()['default'].createHash('md5').update(text, 'utf8').digest('hex');
}
// Public: Write the given text to the clipboard.
//
// The metadata associated with the text is available by calling
// {::readWithMetadata}.
//
// * `text` The {String} to store.
// * `metadata` (optional) The additional info to associate with the text.
}, {
key: 'write',
value: function write(text, metadata) {
this.signatureForMetadata = this.md5(text);
this.metadata = metadata;
get__safeClipboard2()['default'].writeText(text);
}
// Public: Read the text from the clipboard.
//
// Returns a {String}.
}, {
key: 'read',
value: function read() {
return get__safeClipboard2()['default'].readText();
}
// Public: Read the text from the clipboard and return both the text and the
// associated metadata.
//
// Returns an {Object} with the following keys:
// * `text` The {String} clipboard text.
// * `metadata` The metadata stored by an earlier call to {::write}.
}, {
key: 'readWithMetadata',
value: function readWithMetadata() {
var text = this.read();
if (this.signatureForMetadata === this.md5(text)) {
return { text: text, metadata: this.metadata };
} else {
return { text: text };
}
}
}]);
return Clipboard;
})();
exports['default'] = Clipboard;
module.exports = exports['default'];
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi9Vc2Vycy9sZXJvaXgvZ2l0aHViL2F0b20vb3V0L2FwcC9zcmMvY2xpcGJvYXJkLmpzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7OztzQkFFbUIsUUFBUTs7Ozs2QkFDTCxrQkFBa0I7Ozs7Ozs7Ozs7Ozs7Ozs7SUFhbkIsU0FBUztBQUNoQixXQURPLFNBQVMsR0FDYjswQkFESSxTQUFTOztBQUUxQixRQUFJLENBQUMsS0FBSyxFQUFFLENBQUE7R0FDYjs7ZUFIa0IsU0FBUzs7V0FLdEIsaUJBQUc7QUFDUCxVQUFJLENBQUMsUUFBUSxHQUFHLElBQUksQ0FBQTtBQUNwQixVQUFJLENBQUMsb0JBQW9CLEdBQUcsSUFBSSxDQUFBO0tBQ2pDOzs7Ozs7Ozs7V0FPRyxhQUFDLElBQUksRUFBRTtBQUNULGFBQU8sb0JBQU8sVUFBVSxDQUFDLEtBQUssQ0FBQyxDQUFDLE1BQU0sQ0FBQyxJQUFJLEVBQUUsTUFBTSxDQUFDLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQyxDQUFBO0tBQ25FOzs7Ozs7Ozs7OztXQVNLLGVBQUMsSUFBSSxFQUFFLFFBQVEsRUFBRTtBQUNyQixVQUFJLENBQUMsb0JBQW9CLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsQ0FBQTtBQUMxQyxVQUFJLENBQUMsUUFBUSxHQUFHLFFBQVEsQ0FBQTtBQUN4QixpQ0FBVSxTQUFTLENBQUMsSUFBSSxDQUFDLENBQUE7S0FDMUI7Ozs7Ozs7V0FLSSxnQkFBRztBQUNOLGFBQU8sMkJBQVUsUUFBUSxFQUFFLENBQUE7S0FDNUI7Ozs7Ozs7Ozs7V0FRZ0IsNEJBQUc7QUFDbEIsVUFBSSxJQUFJLEdBQUcsSUFBSSxDQUFDLElBQUksRUFBRSxDQUFBO0FBQ3RCLFVBQUksSUFBSSxDQUFDLG9CQUFvQixLQUFLLElBQUksQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLEVBQUU7QUFDaEQsZUFBTyxFQUFDLElBQUksRUFBSixJQUFJLEVBQUUsUUFBUSxFQUFFLElBQUksQ0FBQyxRQUFRLEVBQUMsQ0FBQTtPQUN2QyxNQUFNO0FBQ0wsZUFBTyxFQUFDLElBQUksRUFBSixJQUFJLEVBQUMsQ0FBQTtPQUNkO0tBQ0Y7OztTQXBEa0IsU0FBUzs7O3FCQUFULFNBQVMiLCJmaWxlIjoiL1VzZXJzL2xlcm9peC9naXRodWIvYXRvbS9vdXQvYXBwL3NyYy9jbGlwYm9hcmQuanMiLCJzb3VyY2VzQ29udGVudCI6WyIvKiogQGJhYmVsICovXG5cbmltcG9ydCBjcnlwdG8gZnJvbSAnY3J5cHRvJ1xuaW1wb3J0IGNsaXBib2FyZCBmcm9tICcuL3NhZmUtY2xpcGJvYXJkJ1xuXG4vLyBFeHRlbmRlZDogUmVwcmVzZW50cyB0aGUgY2xpcGJvYXJkIHVzZWQgZm9yIGNvcHlpbmcgYW5kIHBhc3RpbmcgaW4gQXRvbS5cbi8vXG4vLyBBbiBpbnN0YW5jZSBvZiB0aGlzIGNsYXNzIGlzIGFsd2F5cyBhdmFpbGFibGUgYXMgdGhlIGBhdG9tLmNsaXBib2FyZGAgZ2xvYmFsLlxuLy9cbi8vICMjIEV4YW1wbGVzXG4vL1xuLy8gYGBgY29mZmVlXG4vLyBhdG9tLmNsaXBib2FyZC53cml0ZSgnaGVsbG8nKVxuLy9cbi8vIGNvbnNvbGUubG9nKGF0b20uY2xpcGJvYXJkLnJlYWQoKSkgIyAnaGVsbG8nXG4vLyBgYGBcbmV4cG9ydCBkZWZhdWx0IGNsYXNzIENsaXBib2FyZCB7XG4gIGNvbnN0cnVjdG9yICgpIHtcbiAgICB0aGlzLnJlc2V0KClcbiAgfVxuXG4gIHJlc2V0ICgpIHtcbiAgICB0aGlzLm1ldGFkYXRhID0gbnVsbFxuICAgIHRoaXMuc2lnbmF0dXJlRm9yTWV0YWRhdGEgPSBudWxsXG4gIH1cblxuICAvLyBDcmVhdGVzIGFuIGBtZDVgIGhhc2ggb2Ygc29tZSB0ZXh0LlxuICAvL1xuICAvLyAqIGB0ZXh0YCBBIHtTdHJpbmd9IHRvIGhhc2guXG4gIC8vXG4gIC8vIFJldHVybnMgYSBoYXNoZWQge1N0cmluZ30uXG4gIG1kNSAodGV4dCkge1xuICAgIHJldHVybiBjcnlwdG8uY3JlYXRlSGFzaCgnbWQ1JykudXBkYXRlKHRleHQsICd1dGY4JykuZGlnZXN0KCdoZXgnKVxuICB9XG5cbiAgLy8gUHVibGljOiBXcml0ZSB0aGUgZ2l2ZW4gdGV4dCB0byB0aGUgY2xpcGJvYXJkLlxuICAvL1xuICAvLyBUaGUgbWV0YWRhdGEgYXNzb2NpYXRlZCB3aXRoIHRoZSB0ZXh0IGlzIGF2YWlsYWJsZSBieSBjYWxsaW5nXG4gIC8vIHs6OnJlYWRXaXRoTWV0YWRhdGF9LlxuICAvL1xuICAvLyAqIGB0ZXh0YCBUaGUge1N0cmluZ30gdG8gc3RvcmUuXG4gIC8vICogYG1ldGFkYXRhYCAob3B0aW9uYWwpIFRoZSBhZGRpdGlvbmFsIGluZm8gdG8gYXNzb2NpYXRlIHdpdGggdGhlIHRleHQuXG4gIHdyaXRlICh0ZXh0LCBtZXRhZGF0YSkge1xuICAgIHRoaXMuc2lnbmF0dXJlRm9yTWV0YWRhdGEgPSB0aGlzLm1kNSh0ZXh0KVxuICAgIHRoaXMubWV0YWRhdGEgPSBtZXRhZGF0YVxuICAgIGNsaXBib2FyZC53cml0ZVRleHQodGV4dClcbiAgfVxuXG4gIC8vIFB1YmxpYzogUmVhZCB0aGUgdGV4dCBmcm9tIHRoZSBjbGlwYm9hcmQuXG4gIC8vXG4gIC8vIFJldHVybnMgYSB7U3RyaW5nfS5cbiAgcmVhZCAoKSB7XG4gICAgcmV0dXJuIGNsaXBib2FyZC5yZWFkVGV4dCgpXG4gIH1cblxuICAvLyBQdWJsaWM6IFJlYWQgdGhlIHRleHQgZnJvbSB0aGUgY2xpcGJvYXJkIGFuZCByZXR1cm4gYm90aCB0aGUgdGV4dCBhbmQgdGhlXG4gIC8vIGFzc29jaWF0ZWQgbWV0YWRhdGEuXG4gIC8vXG4gIC8vIFJldHVybnMgYW4ge09iamVjdH0gd2l0aCB0aGUgZm9sbG93aW5nIGtleXM6XG4gIC8vICogYHRleHRgIFRoZSB7U3RyaW5nfSBjbGlwYm9hcmQgdGV4dC5cbiAgLy8gKiBgbWV0YWRhdGFgIFRoZSBtZXRhZGF0YSBzdG9yZWQgYnkgYW4gZWFybGllciBjYWxsIHRvIHs6OndyaXRlfS5cbiAgcmVhZFdpdGhNZXRhZGF0YSAoKSB7XG4gICAgbGV0IHRleHQgPSB0aGlzLnJlYWQoKVxuICAgIGlmICh0aGlzLnNpZ25hdHVyZUZvck1ldGFkYXRhID09PSB0aGlzLm1kNSh0ZXh0KSkge1xuICAgICAgcmV0dXJuIHt0ZXh0LCBtZXRhZGF0YTogdGhpcy5tZXRhZGF0YX1cbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuIHt0ZXh0fVxuICAgIH1cbiAgfVxufVxuIl19
},
"../src/text-editor.js": function (exports, module, __filename, __dirname, require, define) {
const _ = require("../node_modules/underscore-plus/lib/underscore-plus.js")
let path;
function get_path() {
return path = path || require('path');
}
const fs = require("../node_modules/fs-plus/lib/fs-plus.js")
const Grim = require("../node_modules/grim/lib/grim.js")
const dedent = require("../node_modules/dedent/dist/dedent.js")
const {CompositeDisposable, Disposable, Emitter} = require("../node_modules/event-kit/lib/event-kit.js")
const TextBuffer = require("../node_modules/text-buffer/lib/text-buffer.js")
const {Point, Range} = TextBuffer
const DecorationManager = require("../src/decoration-manager.js")
const Cursor = require("../src/cursor.js")
const Selection = require("../src/selection.js")
const NullGrammar = require("../src/null-grammar.js")
const TextMateLanguageMode = require("../src/text-mate-language-mode.js")
const TextMateScopeSelector = require("../node_modules/first-mate/lib/first-mate.js").ScopeSelector
const GutterContainer = require("../src/gutter-container.js")
let TextEditorComponent = null
let TextEditorElement = null
const {isDoubleWidthCharacter, isHalfWidthCharacter, isKoreanCharacter, isWrapBoundary} = require("../src/text-utils.js")
const SERIALIZATION_VERSION = 1
const NON_WHITESPACE_REGEXP = /\S/
const ZERO_WIDTH_NBSP = '\ufeff'
let nextId = 0
const DEFAULT_NON_WORD_CHARACTERS = "/\\()\"':,.;<>~!@#$%^&*|+=[]{}`?-…"
// Essential: This class represents all essential editing state for a single
// {TextBuffer}, including cursor and selection positions, folds, and soft wraps.
// If you're manipulating the state of an editor, use this class.
//
// A single {TextBuffer} can belong to multiple editors. For example, if the
// same file is open in two different panes, Atom creates a separate editor for
// each pane. If the buffer is manipulated the changes are reflected in both
// editors, but each maintains its own cursor position, folded lines, etc.
//
// ## Accessing TextEditor Instances
//
// The easiest way to get hold of `TextEditor` objects is by registering a callback
// with `::observeTextEditors` on the `atom.workspace` global. Your callback will
// then be called with all current editor instances and also when any editor is
// created in the future.
//
// ```coffee
// atom.workspace.observeTextEditors (editor) ->
// editor.insertText('Hello World')
// ```
//
// ## Buffer vs. Screen Coordinates
//
// Because editors support folds and soft-wrapping, the lines on screen don't
// always match the lines in the buffer. For example, a long line that soft wraps
// twice renders as three lines on screen, but only represents one line in the
// buffer. Similarly, if rows 5-10 are folded, then row 6 on screen corresponds
// to row 11 in the buffer.
//
// Your choice of coordinates systems will depend on what you're trying to
// achieve. For example, if you're writing a command that jumps the cursor up or
// down by 10 lines, you'll want to use screen coordinates because the user
// probably wants to skip lines *on screen*. However, if you're writing a package
// that jumps between method definitions, you'll want to work in buffer
// coordinates.
//
// **When in doubt, just default to buffer coordinates**, then experiment with
// soft wraps and folds to ensure your code interacts with them correctly.
module.exports =
class TextEditor {
static setClipboard (clipboard) {
this.clipboard = clipboard
}
static setScheduler (scheduler) {
if (TextEditorComponent == null) { TextEditorComponent = require("../src/text-editor-component.js") }
return TextEditorComponent.setScheduler(scheduler)
}
static didUpdateStyles () {
if (TextEditorComponent == null) { TextEditorComponent = require("../src/text-editor-component.js") }
return TextEditorComponent.didUpdateStyles()
}
static didUpdateScrollbarStyles () {
if (TextEditorComponent == null) { TextEditorComponent = require("../src/text-editor-component.js") }
return TextEditorComponent.didUpdateScrollbarStyles()
}
static viewForItem (item) { return item.element || item }
static deserialize (state, atomEnvironment) {
if (state.version !== SERIALIZATION_VERSION) return null
let bufferId = state.tokenizedBuffer
? state.tokenizedBuffer.bufferId
: state.bufferId
try {
state.buffer = atomEnvironment.project.bufferForIdSync(bufferId)
if (!state.buffer) return null
} catch (error) {
if (error.syscall === 'read') {
return // Error reading the file, don't deserialize an editor for it
} else {
throw error
}
}
state.assert = atomEnvironment.assert.bind(atomEnvironment)
const editor = new TextEditor(state)
if (state.registered) {
const disposable = atomEnvironment.textEditors.add(editor)
editor.onDidDestroy(() => disposable.dispose())
}
return editor
}
constructor (params = {}) {
if (this.constructor.clipboard == null) {
throw new Error('Must call TextEditor.setClipboard at least once before creating TextEditor instances')
}
this.id = params.id != null ? params.id : nextId++
this.initialScrollTopRow = params.initialScrollTopRow
this.initialScrollLeftColumn = params.initialScrollLeftColumn
this.decorationManager = params.decorationManager
this.selectionsMarkerLayer = params.selectionsMarkerLayer
this.mini = (params.mini != null) ? params.mini : false
this.placeholderText = params.placeholderText
this.showLineNumbers = params.showLineNumbers
this.assert = params.assert || (condition => condition)
this.showInvisibles = (params.showInvisibles != null) ? params.showInvisibles : true
this.autoHeight = params.autoHeight
this.autoWidth = params.autoWidth
this.scrollPastEnd = (params.scrollPastEnd != null) ? params.scrollPastEnd : false
this.scrollSensitivity = (params.scrollSensitivity != null) ? params.scrollSensitivity : 40
this.editorWidthInChars = params.editorWidthInChars
this.invisibles = params.invisibles
this.showIndentGuide = params.showIndentGuide
this.softWrapped = params.softWrapped
this.softWrapAtPreferredLineLength = params.softWrapAtPreferredLineLength
this.preferredLineLength = params.preferredLineLength
this.showCursorOnSelection = (params.showCursorOnSelection != null) ? params.showCursorOnSelection : true
this.maxScreenLineLength = params.maxScreenLineLength
this.softTabs = (params.softTabs != null) ? params.softTabs : true
this.autoIndent = (params.autoIndent != null) ? params.autoIndent : true
this.autoIndentOnPaste = (params.autoIndentOnPaste != null) ? params.autoIndentOnPaste : true
this.undoGroupingInterval = (params.undoGroupingInterval != null) ? params.undoGroupingInterval : 300
this.softWrapped = (params.softWrapped != null) ? params.softWrapped : false
this.softWrapAtPreferredLineLength = (params.softWrapAtPreferredLineLength != null) ? params.softWrapAtPreferredLineLength : false
this.preferredLineLength = (params.preferredLineLength != null) ? params.preferredLineLength : 80
this.maxScreenLineLength = (params.maxScreenLineLength != null) ? params.maxScreenLineLength : 500
this.showLineNumbers = (params.showLineNumbers != null) ? params.showLineNumbers : true
const {tabLength = 2} = params
this.alive = true
this.doBackgroundWork = this.doBackgroundWork.bind(this)
this.serializationVersion = 1
this.suppressSelectionMerging = false
this.selectionFlashDuration = 500
this.gutterContainer = null
this.verticalScrollMargin = 2
this.horizontalScrollMargin = 6
this.lineHeightInPixels = null
this.defaultCharWidth = null
this.height = null
this.width = null
this.registered = false
this.atomicSoftTabs = true
this.emitter = new Emitter()
this.disposables = new CompositeDisposable()
this.cursors = []
this.cursorsByMarkerId = new Map()
this.selections = []
this.hasTerminatedPendingState = false
if (params.buffer) {
this.buffer = params.buffer
} else {
this.buffer = new TextBuffer({
shouldDestroyOnFileDelete () { return atom.config.get('core.closeDeletedFileTabs') }
})
this.buffer.setLanguageMode(new TextMateLanguageMode({buffer: this.buffer, config: atom.config}))
}
const languageMode = this.buffer.getLanguageMode()
this.languageModeSubscription = languageMode.onDidTokenize && languageMode.onDidTokenize(() => {
this.emitter.emit('did-tokenize')
})
if (this.languageModeSubscription) this.disposables.add(this.languageModeSubscription)
if (params.displayLayer) {
this.displayLayer = params.displayLayer
} else {
const displayLayerParams = {
invisibles: this.getInvisibles(),
softWrapColumn: this.getSoftWrapColumn(),
showIndentGuides: this.doesShowIndentGuide(),
atomicSoftTabs: params.atomicSoftTabs != null ? params.atomicSoftTabs : true,
tabLength,
ratioForCharacter: this.ratioForCharacter.bind(this),
isWrapBoundary,
foldCharacter: ZERO_WIDTH_NBSP,
softWrapHangingIndent: params.softWrapHangingIndentLength != null ? params.softWrapHangingIndentLength : 0
}
this.displayLayer = this.buffer.getDisplayLayer(params.displayLayerId)
if (this.displayLayer) {
this.displayLayer.reset(displayLayerParams)
this.selectionsMarkerLayer = this.displayLayer.getMarkerLayer(params.selectionsMarkerLayerId)
} else {
this.displayLayer = this.buffer.addDisplayLayer(displayLayerParams)
}
}
this.backgroundWorkHandle = requestIdleCallback(this.doBackgroundWork)
this.disposables.add(new Disposable(() => {
if (this.backgroundWorkHandle != null) return cancelIdleCallback(this.backgroundWorkHandle)
}))
this.defaultMarkerLayer = this.displayLayer.addMarkerLayer()
if (!this.selectionsMarkerLayer) {
this.selectionsMarkerLayer = this.addMarkerLayer({maintainHistory: true, persistent: true})
}
this.decorationManager = new DecorationManager(this)
this.decorateMarkerLayer(this.selectionsMarkerLayer, {type: 'cursor'})
if (!this.isMini()) this.decorateCursorLine()
this.decorateMarkerLayer(this.displayLayer.foldsMarkerLayer, {type: 'line-number', class: 'folded'})
for (let marker of this.selectionsMarkerLayer.getMarkers()) {
this.addSelection(marker)
}
this.subscribeToBuffer()
this.subscribeToDisplayLayer()
if (this.cursors.length === 0 && !params.suppressCursorCreation) {
const initialLine = Math.max(parseInt(params.initialLine) || 0, 0)
const initialColumn = Math.max(parseInt(params.initialColumn) || 0, 0)
this.addCursorAtBufferPosition([initialLine, initialColumn])
}
this.gutterContainer = new GutterContainer(this)
this.lineNumberGutter = this.gutterContainer.addGutter({
name: 'line-number',
priority: 0,
visible: params.lineNumberGutterVisible
})
}
get element () {
return this.getElement()
}
get editorElement () {
Grim.deprecate(dedent`\
\`TextEditor.prototype.editorElement\` has always been private, but now
it is gone. Reading the \`editorElement\` property still returns a
reference to the editor element but this field will be removed in a
later version of Atom, so we recommend using the \`element\` property instead.\
`)
return this.getElement()
}
get displayBuffer () {
Grim.deprecate(dedent`\
\`TextEditor.prototype.displayBuffer\` has always been private, but now
it is gone. Reading the \`displayBuffer\` property now returns a reference
to the containing \`TextEditor\`, which now provides *some* of the API of
the defunct \`DisplayBuffer\` class.\
`)
return this
}
get languageMode () { return this.buffer.getLanguageMode() }
get tokenizedBuffer () { return this.buffer.getLanguageMode() }
get rowsPerPage () {
return this.getRowsPerPage()
}
decorateCursorLine () {
this.cursorLineDecorations = [
this.decorateMarkerLayer(this.selectionsMarkerLayer, {type: 'line', class: 'cursor-line', onlyEmpty: true}),
this.decorateMarkerLayer(this.selectionsMarkerLayer, {type: 'line-number', class: 'cursor-line'}),
this.decorateMarkerLayer(this.selectionsMarkerLayer, {type: 'line-number', class: 'cursor-line-no-selection', onlyHead: true, onlyEmpty: true})
]
}
doBackgroundWork (deadline) {
const previousLongestRow = this.getApproximateLongestScreenRow()
if (this.displayLayer.doBackgroundWork(deadline)) {
this.backgroundWorkHandle = requestIdleCallback(this.doBackgroundWork)
} else {
this.backgroundWorkHandle = null
}
if (this.component && this.getApproximateLongestScreenRow() !== previousLongestRow) {
this.component.scheduleUpdate()
}
}
update (params) {
const displayLayerParams = {}
for (let param of Object.keys(params)) {
const value = params[param]
switch (param) {
case 'autoIndent':
this.autoIndent = value
break
case 'autoIndentOnPaste':
this.autoIndentOnPaste = value
break
case 'undoGroupingInterval':
this.undoGroupingInterval = value
break
case 'scrollSensitivity':
this.scrollSensitivity = value
break
case 'encoding':
this.buffer.setEncoding(value)
break
case 'softTabs':
if (value !== this.softTabs) {
this.softTabs = value
}
break
case 'atomicSoftTabs':
if (value !== this.displayLayer.atomicSoftTabs) {
displayLayerParams.atomicSoftTabs = value
}
break
case 'tabLength':
if (value > 0 && value !== this.displayLayer.tabLength) {
displayLayerParams.tabLength = value
}
break
case 'softWrapped':
if (value !== this.softWrapped) {
this.softWrapped = value
displayLayerParams.softWrapColumn = this.getSoftWrapColumn()
this.emitter.emit('did-change-soft-wrapped', this.isSoftWrapped())
}
break
case 'softWrapHangingIndentLength':
if (value !== this.displayLayer.softWrapHangingIndent) {
displayLayerParams.softWrapHangingIndent = value
}
break
case 'softWrapAtPreferredLineLength':
if (value !== this.softWrapAtPreferredLineLength) {
this.softWrapAtPreferredLineLength = value
displayLayerParams.softWrapColumn = this.getSoftWrapColumn()
}
break
case 'preferredLineLength':
if (value !== this.preferredLineLength) {
this.preferredLineLength = value
displayLayerParams.softWrapColumn = this.getSoftWrapColumn()
}
break
case 'maxScreenLineLength':
if (value !== this.maxScreenLineLength) {
this.maxScreenLineLength = value
displayLayerParams.softWrapColumn = this.getSoftWrapColumn()
}
break
case 'mini':
if (value !== this.mini) {
this.mini = value
this.emitter.emit('did-change-mini', value)
displayLayerParams.invisibles = this.getInvisibles()
displayLayerParams.softWrapColumn = this.getSoftWrapColumn()
displayLayerParams.showIndentGuides = this.doesShowIndentGuide()
if (this.mini) {
for (let decoration of this.cursorLineDecorations) { decoration.destroy() }
this.cursorLineDecorations = null
} else {
this.decorateCursorLine()
}
if (this.component != null) {
this.component.scheduleUpdate()
}
}
break
case 'placeholderText':
if (value !== this.placeholderText) {
this.placeholderText = value
this.emitter.emit('did-change-placeholder-text', value)
}
break
case 'lineNumberGutterVisible':
if (value !== this.lineNumberGutterVisible) {
if (value) {
this.lineNumberGutter.show()
} else {
this.lineNumberGutter.hide()
}
this.emitter.emit('did-change-line-number-gutter-visible', this.lineNumberGutter.isVisible())
}
break
case 'showIndentGuide':
if (value !== this.showIndentGuide) {
this.showIndentGuide = value
displayLayerParams.showIndentGuides = this.doesShowIndentGuide()
}
break
case 'showLineNumbers':
if (value !== this.showLineNumbers) {
this.showLineNumbers = value
if (this.component != null) {
this.component.scheduleUpdate()
}
}
break
case 'showInvisibles':
if (value !== this.showInvisibles) {
this.showInvisibles = value
displayLayerParams.invisibles = this.getInvisibles()
}
break
case 'invisibles':
if (!_.isEqual(value, this.invisibles)) {
this.invisibles = value
displayLayerParams.invisibles = this.getInvisibles()
}
break
case 'editorWidthInChars':
if (value > 0 && value !== this.editorWidthInChars) {
this.editorWidthInChars = value
displayLayerParams.softWrapColumn = this.getSoftWrapColumn()
}
break
case 'width':
if (value !== this.width) {
this.width = value
displayLayerParams.softWrapColumn = this.getSoftWrapColumn()
}
break
case 'scrollPastEnd':
if (value !== this.scrollPastEnd) {
this.scrollPastEnd = value
if (this.component) this.component.scheduleUpdate()
}
break
case 'autoHeight':
if (value !== this.autoHeight) {
this.autoHeight = value
}
break
case 'autoWidth':
if (value !== this.autoWidth) {
this.autoWidth = value
}
break
case 'showCursorOnSelection':
if (value !== this.showCursorOnSelection) {
this.showCursorOnSelection = value
if (this.component) this.component.scheduleUpdate()
}
break
default:
if (param !== 'ref' && param !== 'key') {
throw new TypeError(`Invalid TextEditor parameter: '${param}'`)
}
}
}
this.displayLayer.reset(displayLayerParams)
if (this.component) {
return this.component.getNextUpdatePromise()
} else {
return Promise.resolve()
}
}
scheduleComponentUpdate () {
if (this.component) this.component.scheduleUpdate()
}
serialize () {
return {
deserializer: 'TextEditor',
version: SERIALIZATION_VERSION,
displayLayerId: this.displayLayer.id,
selectionsMarkerLayerId: this.selectionsMarkerLayer.id,
initialScrollTopRow: this.getScrollTopRow(),
initialScrollLeftColumn: this.getScrollLeftColumn(),
tabLength: this.displayLayer.tabLength,
atomicSoftTabs: this.displayLayer.atomicSoftTabs,
softWrapHangingIndentLength: this.displayLayer.softWrapHangingIndent,
id: this.id,
bufferId: this.buffer.id,
softTabs: this.softTabs,
softWrapped: this.softWrapped,
softWrapAtPreferredLineLength: this.softWrapAtPreferredLineLength,
preferredLineLength: this.preferredLineLength,
mini: this.mini,
editorWidthInChars: this.editorWidthInChars,
width: this.width,
maxScreenLineLength: this.maxScreenLineLength,
registered: this.registered,
invisibles: this.invisibles,
showInvisibles: this.showInvisibles,
showIndentGuide: this.showIndentGuide,
autoHeight: this.autoHeight,
autoWidth: this.autoWidth
}
}
subscribeToBuffer () {
this.buffer.retain()
this.disposables.add(this.buffer.onDidChangeLanguageMode(this.handleLanguageModeChange.bind(this)))
this.disposables.add(this.buffer.onDidChangePath(() => {
this.emitter.emit('did-change-title', this.getTitle())
this.emitter.emit('did-change-path', this.getPath())
}))
this.disposables.add(this.buffer.onDidChangeEncoding(() => {
this.emitter.emit('did-change-encoding', this.getEncoding())
}))
this.disposables.add(this.buffer.onDidDestroy(() => this.destroy()))
this.disposables.add(this.buffer.onDidChangeModified(() => {
if (!this.hasTerminatedPendingState && this.buffer.isModified()) this.terminatePendingState()
}))
}
terminatePendingState () {
if (!this.hasTerminatedPendingState) this.emitter.emit('did-terminate-pending-state')
this.hasTerminatedPendingState = true
}
onDidTerminatePendingState (callback) {
return this.emitter.on('did-terminate-pending-state', callback)
}
subscribeToDisplayLayer () {
this.disposables.add(this.displayLayer.onDidChange(changes => {
this.mergeIntersectingSelections()
if (this.component) this.component.didChangeDisplayLayer(changes)
this.emitter.emit('did-change', changes.map(change => new ChangeEvent(change)))
}))
this.disposables.add(this.displayLayer.onDidReset(() => {
this.mergeIntersectingSelections()
if (this.component) this.component.didResetDisplayLayer()
this.emitter.emit('did-change', {})
}))
this.disposables.add(this.selectionsMarkerLayer.onDidCreateMarker(this.addSelection.bind(this)))
return this.disposables.add(this.selectionsMarkerLayer.onDidUpdate(() => (this.component != null ? this.component.didUpdateSelections() : undefined)))
}
destroy () {
if (!this.alive) return
this.alive = false
this.disposables.dispose()
this.displayLayer.destroy()
for (let selection of this.selections.slice()) {
selection.destroy()
}
this.buffer.release()
this.gutterContainer.destroy()
this.emitter.emit('did-destroy')
this.emitter.clear()
if (this.component) this.component.element.component = null
this.component = null
this.lineNumberGutter.element = null
}
isAlive () { return this.alive }
isDestroyed () { return !this.alive }
/*
Section: Event Subscription
*/
// Essential: Calls your `callback` when the buffer's title has changed.
//
// * `callback` {Function}
//
// Returns a {Disposable} on which `.dispose()` can be called to unsubscribe.
onDidChangeTitle (callback) {
return this.emitter.on('did-change-title', callback)
}
// Essential: Calls your `callback` when the buffer's path, and therefore title, has changed.
//
// * `callback` {Function}
//
// Returns a {Disposable} on which `.dispose()` can be called to unsubscribe.
onDidChangePath (callback) {
return this.emitter.on('did-change-path', callback)
}
// Essential: Invoke the given callback synchronously when the content of the
// buffer changes.
//
// Because observers are invoked synchronously, it's important not to perform
// any expensive operations via this method. Consider {::onDidStopChanging} to
// delay expensive operations until after changes stop occurring.
//
// * `callback` {Function}
//
// Returns a {Disposable} on which `.dispose()` can be called to unsubscribe.
onDidChange (callback) {
return this.emitter.on('did-change', callback)
}
// Essential: Invoke `callback` when the buffer's contents change. It is
// emit asynchronously 300ms after the last buffer change. This is a good place
// to handle changes to the buffer without compromising typing performance.
//
// * `callback` {Function}
//
// Returns a {Disposable} on which `.dispose()` can be called to unsubscribe.
onDidStopChanging (callback) {
return this.getBuffer().onDidStopChanging(callback)
}
// Essential: Calls your `callback` when a {Cursor} is moved. If there are
// multiple cursors, your callback will be called for each cursor.
//
// * `callback` {Function}
// * `event` {Object}
// * `oldBufferPosition` {Point}
// * `oldScreenPosition` {Point}
// * `newBufferPosition` {Point}
// * `newScreenPosition` {Point}
// * `textChanged` {Boolean}
// * `cursor` {Cursor} that triggered the event
//
// Returns a {Disposable} on which `.dispose()` can be called to unsubscribe.
onDidChangeCursorPosition (callback) {
return this.emitter.on('did-change-cursor-position', callback)
}
// Essential: Calls your `callback` when a selection's screen range changes.
//
// * `callback` {Function}
// * `event` {Object}
// * `oldBufferRange` {Range}
// * `oldScreenRange` {Range}
// * `newBufferRange` {Range}
// * `newScreenRange` {Range}
// * `selection` {Selection} that triggered the event
//
// Returns a {Disposable} on which `.dispose()` can be called to unsubscribe.
onDidChangeSelectionRange (callback) {
return this.emitter.on('did-change-selection-range', callback)
}
// Extended: Calls your `callback` when soft wrap was enabled or disabled.
//
// * `callback` {Function}
//
// Returns a {Disposable} on which `.dispose()` can be called to unsubscribe.
onDidChangeSoftWrapped (callback) {
return this.emitter.on('did-change-soft-wrapped', callback)
}
// Extended: Calls your `callback` when the buffer's encoding has changed.
//
// * `callback` {Function}
//
// Returns a {Disposable} on which `.dispose()` can be called to unsubscribe.
onDidChangeEncoding (callback) {
return this.emitter.on('did-change-encoding', callback)
}
// Extended: Calls your `callback` when the grammar that interprets and
// colorizes the text has been changed. Immediately calls your callback with
// the current grammar.
//
// * `callback` {Function}
// * `grammar` {Grammar}
//
// Returns a {Disposable} on which `.dispose()` can be called to unsubscribe.
observeGrammar (callback) {
callback(this.getGrammar())
return this.onDidChangeGrammar(callback)
}
// Extended: Calls your `callback` when the grammar that interprets and
// colorizes the text has been changed.
//
// * `callback` {Function}
// * `grammar` {Grammar}
//
// Returns a {Disposable} on which `.dispose()` can be called to unsubscribe.
onDidChangeGrammar (callback) {
return this.buffer.onDidChangeLanguageMode(() => {
callback(this.buffer.getLanguageMode().grammar)
})
}
// Extended: Calls your `callback` when the result of {::isModified} changes.
//
// * `callback` {Function}
//
// Returns a {Disposable} on which `.dispose()` can be called to unsubscribe.
onDidChangeModified (callback) {
return this.getBuffer().onDidChangeModified(callback)
}
// Extended: Calls your `callback` when the buffer's underlying file changes on
// disk at a moment when the result of {::isModified} is true.
//
// * `callback` {Function}
//
// Returns a {Disposable} on which `.dispose()` can be called to unsubscribe.
onDidConflict (callback) {
return this.getBuffer().onDidConflict(callback)
}
// Extended: Calls your `callback` before text has been inserted.
//
// * `callback` {Function}
// * `event` event {Object}
// * `text` {String} text to be inserted
// * `cancel` {Function} Call to prevent the text from being inserted
//
// Returns a {Disposable} on which `.dispose()` can be called to unsubscribe.
onWillInsertText (callback) {
return this.emitter.on('will-insert-text', callback)
}
// Extended: Calls your `callback` after text has been inserted.
//
// * `callback` {Function}
// * `event` event {Object}
// * `text` {String} text to be inserted
//
// Returns a {Disposable} on which `.dispose()` can be called to unsubscribe.
onDidInsertText (callback) {
return this.emitter.on('did-insert-text', callback)
}
// Essential: Invoke the given callback after the buffer is saved to disk.
//
// * `callback` {Function} to be called after the buffer is saved.
// * `event` {Object} with the following keys:
// * `path` The path to which the buffer was saved.
//
// Returns a {Disposable} on which `.dispose()` can be called to unsubscribe.
onDidSave (callback) {
return this.getBuffer().onDidSave(callback)
}
// Essential: Invoke the given callback when the editor is destroyed.
//
// * `callback` {Function} to be called when the editor is destroyed.
//
// Returns a {Disposable} on which `.dispose()` can be called to unsubscribe.
onDidDestroy (callback) {
return this.emitter.once('did-destroy', callback)
}
// Extended: Calls your `callback` when a {Cursor} is added to the editor.
// Immediately calls your callback for each existing cursor.
//
// * `callback` {Function}
// * `cursor` {Cursor} that was added
//
// Returns a {Disposable} on which `.dispose()` can be called to unsubscribe.
observeCursors (callback) {
this.getCursors().forEach(callback)
return this.onDidAddCursor(callback)
}
// Extended: Calls your `callback` when a {Cursor} is added to the editor.
//
// * `callback` {Function}
// * `cursor` {Cursor} that was added
//
// Returns a {Disposable} on which `.dispose()` can be called to unsubscribe.
onDidAddCursor (callback) {
return this.emitter.on('did-add-cursor', callback)
}
// Extended: Calls your `callback` when a {Cursor} is removed from the editor.
//
// * `callback` {Function}
// * `cursor` {Cursor} that was removed
//
// Returns a {Disposable} on which `.dispose()` can be called to unsubscribe.
onDidRemoveCursor (callback) {
return this.emitter.on('did-remove-cursor', callback)
}
// Extended: Calls your `callback` when a {Selection} is added to the editor.
// Immediately calls your callback for each existing selection.
//
// * `callback` {Function}
// * `selection` {Selection} that was added
//
// Returns a {Disposable} on which `.dispose()` can be called to unsubscribe.
observeSelections (callback) {
this.getSelections().forEach(callback)
return this.onDidAddSelection(callback)
}
// Extended: Calls your `callback` when a {Selection} is added to the editor.
//
// * `callback` {Function}
// * `selection` {Selection} that was added
//
// Returns a {Disposable} on which `.dispose()` can be called to unsubscribe.
onDidAddSelection (callback) {
return this.emitter.on('did-add-selection', callback)
}
// Extended: Calls your `callback` when a {Selection} is removed from the editor.
//
// * `callback` {Function}
// * `selection` {Selection} that was removed
//
// Returns a {Disposable} on which `.dispose()` can be called to unsubscribe.
onDidRemoveSelection (callback) {
return this.emitter.on('did-remove-selection', callback)
}
// Extended: Calls your `callback` with each {Decoration} added to the editor.
// Calls your `callback` immediately for any existing decorations.
//
// * `callback` {Function}
// * `decoration` {Decoration}
//
// Returns a {Disposable} on which `.dispose()` can be called to unsubscribe.
observeDecorations (callback) {
return this.decorationManager.observeDecorations(callback)
}
// Extended: Calls your `callback` when a {Decoration} is added to the editor.
//
// * `callback` {Function}
// * `decoration` {Decoration} that was added
//
// Returns a {Disposable} on which `.dispose()` can be called to unsubscribe.
onDidAddDecoration (callback) {
return this.decorationManager.onDidAddDecoration(callback)
}
// Extended: Calls your `callback` when a {Decoration} is removed from the editor.
//
// * `callback` {Function}
// * `decoration` {Decoration} that was removed
//
// Returns a {Disposable} on which `.dispose()` can be called to unsubscribe.
onDidRemoveDecoration (callback) {
return this.decorationManager.onDidRemoveDecoration(callback)
}
// Called by DecorationManager when a decoration is added.
didAddDecoration (decoration) {
if (this.component && decoration.isType('block')) {
this.component.addBlockDecoration(decoration)
}
}
// Extended: Calls your `callback` when the placeholder text is changed.
//
// * `callback` {Function}
// * `placeholderText` {String} new text
//
// Returns a {Disposable} on which `.dispose()` can be called to unsubscribe.
onDidChangePlaceholderText (callback) {
return this.emitter.on('did-change-placeholder-text', callback)
}
onDidChangeScrollTop (callback) {
Grim.deprecate('This is now a view method. Call TextEditorElement::onDidChangeScrollTop instead.')
return this.getElement().onDidChangeScrollTop(callback)
}
onDidChangeScrollLeft (callback) {
Grim.deprecate('This is now a view method. Call TextEditorElement::onDidChangeScrollLeft instead.')
return this.getElement().onDidChangeScrollLeft(callback)
}
onDidRequestAutoscroll (callback) {
return this.emitter.on('did-request-autoscroll', callback)
}
// TODO Remove once the tabs package no longer uses .on subscriptions
onDidChangeIcon (callback) {
return this.emitter.on('did-change-icon', callback)
}
onDidUpdateDecorations (callback) {
return this.decorationManager.onDidUpdateDecorations(callback)
}
// Essential: Retrieves the current {TextBuffer}.
getBuffer () { return this.buffer }
// Retrieves the current buffer's URI.
getURI () { return this.buffer.getUri() }
// Create an {TextEditor} with its initial state based on this object
copy () {
const displayLayer = this.displayLayer.copy()
const selectionsMarkerLayer = displayLayer.getMarkerLayer(this.buffer.getMarkerLayer(this.selectionsMarkerLayer.id).copy().id)
const softTabs = this.getSoftTabs()
return new TextEditor({
buffer: this.buffer,
selectionsMarkerLayer,
softTabs,
suppressCursorCreation: true,
tabLength: this.getTabLength(),
initialScrollTopRow: this.getScrollTopRow(),
initialScrollLeftColumn: this.getScrollLeftColumn(),
assert: this.assert,
displayLayer,
grammar: this.getGrammar(),
autoWidth: this.autoWidth,
autoHeight: this.autoHeight,
showCursorOnSelection: this.showCursorOnSelection
})
}
// Controls visibility based on the given {Boolean}.
setVisible (visible) {
if (visible) {
const languageMode = this.buffer.getLanguageMode()
if (languageMode.startTokenizing) languageMode.startTokenizing()
}
}
setMini (mini) {
this.update({mini})
}
isMini () { return this.mini }
onDidChangeMini (callback) {
return this.emitter.on('did-change-mini', callback)
}
setLineNumberGutterVisible (lineNumberGutterVisible) { this.update({lineNumberGutterVisible}) }
isLineNumberGutterVisible () { return this.lineNumberGutter.isVisible() }
onDidChangeLineNumberGutterVisible (callback) {
return this.emitter.on('did-change-line-number-gutter-visible', callback)
}
// Essential: Calls your `callback` when a {Gutter} is added to the editor.
// Immediately calls your callback for each existing gutter.
//
// * `callback` {Function}
// * `gutter` {Gutter} that currently exists/was added.
//
// Returns a {Disposable} on which `.dispose()` can be called to unsubscribe.
observeGutters (callback) {
return this.gutterContainer.observeGutters(callback)
}
// Essential: Calls your `callback` when a {Gutter} is added to the editor.
//
// * `callback` {Function}
// * `gutter` {Gutter} that was added.
//
// Returns a {Disposable} on which `.dispose()` can be called to unsubscribe.
onDidAddGutter (callback) {
return this.gutterContainer.onDidAddGutter(callback)
}
// Essential: Calls your `callback` when a {Gutter} is removed from the editor.
//
// * `callback` {Function}
// * `name` The name of the {Gutter} that was removed.
//
// Returns a {Disposable} on which `.dispose()` can be called to unsubscribe.
onDidRemoveGutter (callback) {
return this.gutterContainer.onDidRemoveGutter(callback)
}
// Set the number of characters that can be displayed horizontally in the
// editor.
//
// * `editorWidthInChars` A {Number} representing the width of the
// {TextEditorElement} in characters.
setEditorWidthInChars (editorWidthInChars) { this.update({editorWidthInChars}) }
// Returns the editor width in characters.
getEditorWidthInChars () {
if (this.width != null && this.defaultCharWidth > 0) {
return Math.max(0, Math.floor(this.width / this.defaultCharWidth))
} else {
return this.editorWidthInChars
}
}
/*
Section: File Details
*/
// Essential: Get the editor's title for display in other parts of the
// UI such as the tabs.
//
// If the editor's buffer is saved, its title is the file name. If it is
// unsaved, its title is "untitled".
//
// Returns a {String}.
getTitle () {
return this.getFileName() || 'untitled'
}
// Essential: Get unique title for display in other parts of the UI, such as
// the window title.
//
// If the editor's buffer is unsaved, its title is "untitled"
// If the editor's buffer is saved, its unique title is formatted as one
// of the following,
// * "<filename>" when it is the only editing buffer with this file name.
// * "<filename> — <unique-dir-prefix>" when other buffers have this file name.
//
// Returns a {String}
getLongTitle () {
if (this.getPath()) {
const fileName = this.getFileName()
let myPathSegments
const openEditorPathSegmentsWithSameFilename = []
for (const textEditor of atom.workspace.getTextEditors()) {
if (textEditor.getFileName() === fileName) {
const pathSegments = fs.tildify(textEditor.getDirectoryPath()).split(get_path().sep)
openEditorPathSegmentsWithSameFilename.push(pathSegments)
if (textEditor === this) myPathSegments = pathSegments
}
}
if (!myPathSegments || openEditorPathSegmentsWithSameFilename.length === 1) return fileName
let commonPathSegmentCount
for (let i = 0, {length} = myPathSegments; i < length; i++) {
const myPathSegment = myPathSegments[i]
if (openEditorPathSegmentsWithSameFilename.some(segments => (segments.length === i + 1) || (segments[i] !== myPathSegment))) {
commonPathSegmentCount = i
break
}
}
return `${fileName} \u2014 ${get_path().join(...myPathSegments.slice(commonPathSegmentCount))}`;
} else {
return 'untitled'
}
}
// Essential: Returns the {String} path of this editor's text buffer.
getPath () {
return this.buffer.getPath()
}
getFileName () {
const fullPath = this.getPath()
if (fullPath) return get_path().basename(fullPath);
}
getDirectoryPath () {
const fullPath = this.getPath()
if (fullPath) return get_path().dirname(fullPath);
}
// Extended: Returns the {String} character set encoding of this editor's text
// buffer.
getEncoding () { return this.buffer.getEncoding() }
// Extended: Set the character set encoding to use in this editor's text
// buffer.
//
// * `encoding` The {String} character set encoding name such as 'utf8'
setEncoding (encoding) { this.buffer.setEncoding(encoding) }
// Essential: Returns {Boolean} `true` if this editor has been modified.
isModified () { return this.buffer.isModified() }
// Essential: Returns {Boolean} `true` if this editor has no content.
isEmpty () { return this.buffer.isEmpty() }
/*
Section: File Operations
*/
// Essential: Saves the editor's text buffer.
//
// See {TextBuffer::save} for more details.
save () { return this.buffer.save() }
// Essential: Saves the editor's text buffer as the given path.
//
// See {TextBuffer::saveAs} for more details.
//
// * `filePath` A {String} path.
saveAs (filePath) { return this.buffer.saveAs(filePath) }
// Determine whether the user should be prompted to save before closing
// this editor.
shouldPromptToSave ({windowCloseRequested, projectHasPaths} = {}) {
if (windowCloseRequested && projectHasPaths && atom.stateStore.isConnected()) {
return this.buffer.isInConflict()
} else {
return this.isModified() && !this.buffer.hasMultipleEditors()
}
}
// Returns an {Object} to configure dialog shown when this editor is saved
// via {Pane::saveItemAs}.
getSaveDialogOptions () { return {} }
/*
Section: Reading Text
*/
// Essential: Returns a {String} representing the entire contents of the editor.
getText () { return this.buffer.getText() }
// Essential: Get the text in the given {Range} in buffer coordinates.
//
// * `range` A {Range} or range-compatible {Array}.
//
// Returns a {String}.
getTextInBufferRange (range) {
return this.buffer.getTextInRange(range)
}
// Essential: Returns a {Number} representing the number of lines in the buffer.
getLineCount () { return this.buffer.getLineCount() }
// Essential: Returns a {Number} representing the number of screen lines in the
// editor. This accounts for folds.
getScreenLineCount () { return this.displayLayer.getScreenLineCount() }
getApproximateScreenLineCount () { return this.displayLayer.getApproximateScreenLineCount() }
// Essential: Returns a {Number} representing the last zero-indexed buffer row
// number of the editor.
getLastBufferRow () { return this.buffer.getLastRow() }
// Essential: Returns a {Number} representing the last zero-indexed screen row
// number of the editor.
getLastScreenRow () { return this.getScreenLineCount() - 1 }
// Essential: Returns a {String} representing the contents of the line at the
// given buffer row.
//
// * `bufferRow` A {Number} representing a zero-indexed buffer row.
lineTextForBufferRow (bufferRow) { return this.buffer.lineForRow(bufferRow) }
// Essential: Returns a {String} representing the contents of the line at the
// given screen row.
//
// * `screenRow` A {Number} representing a zero-indexed screen row.
lineTextForScreenRow (screenRow) {
const screenLine = this.screenLineForScreenRow(screenRow)
if (screenLine) return screenLine.lineText
}
logScreenLines (start = 0, end = this.getLastScreenRow()) {
for (let row = start; row <= end; row++) {
const line = this.lineTextForScreenRow(row)
get_console().log(row, this.bufferRowForScreenRow(row), line, line.length)
}
}
tokensForScreenRow (screenRow) {
const tokens = []
let lineTextIndex = 0
const currentTokenScopes = []
const {lineText, tags} = this.screenLineForScreenRow(screenRow)
for (const tag of tags) {
if (this.displayLayer.isOpenTag(tag)) {
currentTokenScopes.push(this.displayLayer.classNameForTag(tag))
} else if (this.displayLayer.isCloseTag(tag)) {
currentTokenScopes.pop()
} else {
tokens.push({
text: lineText.substr(lineTextIndex, tag),
scopes: currentTokenScopes.slice()
})
lineTextIndex += tag
}
}
return tokens
}
screenLineForScreenRow (screenRow) {
return this.displayLayer.getScreenLine(screenRow)
}
bufferRowForScreenRow (screenRow) {
return this.displayLayer.translateScreenPosition(Point(screenRow, 0)).row
}
bufferRowsForScreenRows (startScreenRow, endScreenRow) {
return this.displayLayer.bufferRowsForScreenRows(startScreenRow, endScreenRow + 1)
}
screenRowForBufferRow (row) {
return this.displayLayer.translateBufferPosition(Point(row, 0)).row
}
getRightmostScreenPosition () { return this.displayLayer.getRightmostScreenPosition() }
getApproximateRightmostScreenPosition () { return this.displayLayer.getApproximateRightmostScreenPosition() }
getMaxScreenLineLength () { return this.getRightmostScreenPosition().column }
getLongestScreenRow () { return this.getRightmostScreenPosition().row }
getApproximateLongestScreenRow () { return this.getApproximateRightmostScreenPosition().row }
lineLengthForScreenRow (screenRow) { return this.displayLayer.lineLengthForScreenRow(screenRow) }
// Returns the range for the given buffer row.
//
// * `row` A row {Number}.
// * `options` (optional) An options hash with an `includeNewline` key.
//
// Returns a {Range}.
bufferRangeForBufferRow (row, options) {
return this.buffer.rangeForRow(row, options && options.includeNewline)
}
// Get the text in the given {Range}.
//
// Returns a {String}.
getTextInRange (range) { return this.buffer.getTextInRange(range) }
// {Delegates to: TextBuffer.isRowBlank}
isBufferRowBlank (bufferRow) { return this.buffer.isRowBlank(bufferRow) }
// {Delegates to: TextBuffer.nextNonBlankRow}
nextNonBlankBufferRow (bufferRow) { return this.buffer.nextNonBlankRow(bufferRow) }
// {Delegates to: TextBuffer.getEndPosition}
getEofBufferPosition () { return this.buffer.getEndPosition() }
// Essential: Get the {Range} of the paragraph surrounding the most recently added
// cursor.
//
// Returns a {Range}.
getCurrentParagraphBufferRange () {
return this.getLastCursor().getCurrentParagraphBufferRange()
}
/*
Section: Mutating Text
*/
// Essential: Replaces the entire contents of the buffer with the given {String}.
//
// * `text` A {String} to replace with
setText (text) { return this.buffer.setText(text) }
// Essential: Set the text in the given {Range} in buffer coordinates.
//
// * `range` A {Range} or range-compatible {Array}.
// * `text` A {String}
// * `options` (optional) {Object}
// * `normalizeLineEndings` (optional) {Boolean} (default: true)
// * `undo` (optional) {String} 'skip' will skip the undo system
//
// Returns the {Range} of the newly-inserted text.
setTextInBufferRange (range, text, options) {
return this.getBuffer().setTextInRange(range, text, options)
}
// Essential: For each selection, replace the selected text with the given text.
//
// * `text` A {String} representing the text to insert.
// * `options` (optional) See {Selection::insertText}.
//
// Returns a {Range} when the text has been inserted
// Returns a {Boolean} false when the text has not been inserted
insertText (text, options = {}) {
if (!this.emitWillInsertTextEvent(text)) return false
const groupingInterval = options.groupUndo ? this.undoGroupingInterval : 0
if (options.autoIndentNewline == null) options.autoIndentNewline = this.shouldAutoIndent()
if (options.autoDecreaseIndent == null) options.autoDecreaseIndent = this.shouldAutoIndent()
return this.mutateSelectedText(selection => {
const range = selection.insertText(text, options)
const didInsertEvent = {text, range}
this.emitter.emit('did-insert-text', didInsertEvent)
return range
}, groupingInterval)
}
// Essential: For each selection, replace the selected text with a newline.
insertNewline (options) {
return this.insertText('\n', options)
}
// Essential: For each selection, if the selection is empty, delete the character
// following the cursor. Otherwise delete the selected text.
delete () {
return this.mutateSelectedText(selection => selection.delete())
}
// Essential: For each selection, if the selection is empty, delete the character
// preceding the cursor. Otherwise delete the selected text.
backspace () {
return this.mutateSelectedText(selection => selection.backspace())
}
// Extended: Mutate the text of all the selections in a single transaction.
//
// All the changes made inside the given {Function} can be reverted with a
// single call to {::undo}.
//
// * `fn` A {Function} that will be called once for each {Selection}. The first
// argument will be a {Selection} and the second argument will be the
// {Number} index of that selection.
mutateSelectedText (fn, groupingInterval = 0) {
return this.mergeIntersectingSelections(() => {
return this.transact(groupingInterval, () => {
return this.getSelectionsOrderedByBufferPosition().map((selection, index) => fn(selection, index))
})
})
}
// Move lines intersecting the most recent selection or multiple selections
// up by one row in screen coordinates.
moveLineUp () {
const selections = this.getSelectedBufferRanges().sort((a, b) => a.compare(b))
if (selections[0].start.row === 0) return
if (selections[selections.length - 1].start.row === this.getLastBufferRow() && this.buffer.getLastLine() === '') return
this.transact(() => {
const newSelectionRanges = []
while (selections.length > 0) {
// Find selections spanning a contiguous set of lines
const selection = selections.shift()
const selectionsToMove = [selection]
while (selection.end.row === (selections[0] != null ? selections[0].start.row : undefined)) {
selectionsToMove.push(selections[0])
selection.end.row = selections[0].end.row
selections.shift()
}
// Compute the buffer range spanned by all these selections, expanding it
// so that it includes any folded region that intersects them.
let startRow = selection.start.row
let endRow = selection.end.row
if (selection.end.row > selection.start.row && selection.end.column === 0) {
// Don't move the last line of a multi-line selection if the selection ends at column 0
endRow--
}
startRow = this.displayLayer.findBoundaryPrecedingBufferRow(startRow)
endRow = this.displayLayer.findBoundaryFollowingBufferRow(endRow + 1)
const linesRange = new Range(Point(startRow, 0), Point(endRow, 0))
// If selected line range is preceded by a fold, one line above on screen
// could be multiple lines in the buffer.
const precedingRow = this.displayLayer.findBoundaryPrecedingBufferRow(startRow - 1)
const insertDelta = linesRange.start.row - precedingRow
// Any folds in the text that is moved will need to be re-created.
// It includes the folds that were intersecting with the selection.
const rangesToRefold = this.displayLayer
.destroyFoldsIntersectingBufferRange(linesRange)
.map(range => range.translate([-insertDelta, 0]))
// Delete lines spanned by selection and insert them on the preceding buffer row
let lines = this.buffer.getTextInRange(linesRange)
if (lines[lines.length - 1] !== '\n') { lines += this.buffer.lineEndingForRow(linesRange.end.row - 2) }
this.buffer.delete(linesRange)
this.buffer.insert([precedingRow, 0], lines)
// Restore folds that existed before the lines were moved
for (let rangeToRefold of rangesToRefold) {
this.displayLayer.foldBufferRange(rangeToRefold)
}
for (const selectionToMove of selectionsToMove) {
newSelectionRanges.push(selectionToMove.translate([-insertDelta, 0]))
}
}
this.setSelectedBufferRanges(newSelectionRanges, {autoscroll: false, preserveFolds: true})
if (this.shouldAutoIndent()) this.autoIndentSelectedRows()
this.scrollToBufferPosition([newSelectionRanges[0].start.row, 0])
})
}
// Move lines intersecting the most recent selection or multiple selections
// down by one row in screen coordinates.
moveLineDown () {
const selections = this.getSelectedBufferRanges()
selections.sort((a, b) => b.compare(a))
this.transact(() => {
this.consolidateSelections()
const newSelectionRanges = []
while (selections.length > 0) {
// Find selections spanning a contiguous set of lines
const selection = selections.shift()
const selectionsToMove = [selection]
// if the current selection start row matches the next selections' end row - make them one selection
while (selection.start.row === (selections[0] != null ? selections[0].end.row : undefined)) {
selectionsToMove.push(selections[0])
selection.start.row = selections[0].start.row
selections.shift()
}
// Compute the buffer range spanned by all these selections, expanding it
// so that it includes any folded region that intersects them.
let startRow = selection.start.row
let endRow = selection.end.row
if (selection.end.row > selection.start.row && selection.end.column === 0) {
// Don't move the last line of a multi-line selection if the selection ends at column 0
endRow--
}
startRow = this.displayLayer.findBoundaryPrecedingBufferRow(startRow)
endRow = this.displayLayer.findBoundaryFollowingBufferRow(endRow + 1)
const linesRange = new Range(Point(startRow, 0), Point(endRow, 0))
// If selected line range is followed by a fold, one line below on screen
// could be multiple lines in the buffer. But at the same time, if the
// next buffer row is wrapped, one line in the buffer can represent many
// screen rows.
const followingRow = Math.min(this.buffer.getLineCount(), this.displayLayer.findBoundaryFollowingBufferRow(endRow + 1))
const insertDelta = followingRow - linesRange.end.row
// Any folds in the text that is moved will need to be re-created.
// It includes the folds that were intersecting with the selection.
const rangesToRefold = this.displayLayer
.destroyFoldsIntersectingBufferRange(linesRange)
.map(range => range.translate([insertDelta, 0]))
// Delete lines spanned by selection and insert them on the following correct buffer row
let lines = this.buffer.getTextInRange(linesRange)
if (followingRow - 1 === this.buffer.getLastRow()) {
lines = `\n${lines}`
}
this.buffer.insert([followingRow, 0], lines)
this.buffer.delete(linesRange)
// Restore folds that existed before the lines were moved
for (let rangeToRefold of rangesToRefold) {
this.displayLayer.foldBufferRange(rangeToRefold)
}
for (const selectionToMove of selectionsToMove) {
newSelectionRanges.push(selectionToMove.translate([insertDelta, 0]))
}
}
this.setSelectedBufferRanges(newSelectionRanges, {autoscroll: false, preserveFolds: true})
if (this.shouldAutoIndent()) this.autoIndentSelectedRows()
this.scrollToBufferPosition([newSelectionRanges[0].start.row - 1, 0])
})
}
// Move any active selections one column to the left.
moveSelectionLeft () {
const selections = this.getSelectedBufferRanges()
const noSelectionAtStartOfLine = selections.every(selection => selection.start.column !== 0)
const translationDelta = [0, -1]
const translatedRanges = []
if (noSelectionAtStartOfLine) {
this.transact(() => {
for (let selection of selections) {
const charToLeftOfSelection = new Range(selection.start.translate(translationDelta), selection.start)
const charTextToLeftOfSelection = this.buffer.getTextInRange(charToLeftOfSelection)
this.buffer.insert(selection.end, charTextToLeftOfSelection)
this.buffer.delete(charToLeftOfSelection)
translatedRanges.push(selection.translate(translationDelta))
}
this.setSelectedBufferRanges(translatedRanges)
})
}
}
// Move any active selections one column to the right.
moveSelectionRight () {
const selections = this.getSelectedBufferRanges()
const noSelectionAtEndOfLine = selections.every(selection => {
return selection.end.column !== this.buffer.lineLengthForRow(selection.end.row)
})
const translationDelta = [0, 1]
const translatedRanges = []
if (noSelectionAtEndOfLine) {
this.transact(() => {
for (let selection of selections) {
const charToRightOfSelection = new Range(selection.end, selection.end.translate(translationDelta))
const charTextToRightOfSelection = this.buffer.getTextInRange(charToRightOfSelection)
this.buffer.delete(charToRightOfSelection)
this.buffer.insert(selection.start, charTextToRightOfSelection)
translatedRanges.push(selection.translate(translationDelta))
}
this.setSelectedBufferRanges(translatedRanges)
})
}
}
duplicateLines () {
this.transact(() => {
const selections = this.getSelectionsOrderedByBufferPosition()
const previousSelectionRanges = []
let i = selections.length - 1
while (i >= 0) {
const j = i
previousSelectionRanges[i] = selections[i].getBufferRange()
if (selections[i].isEmpty()) {
const {start} = selections[i].getScreenRange()
selections[i].setScreenRange([[start.row, 0], [start.row + 1, 0]], {preserveFolds: true})
}
let [startRow, endRow] = selections[i].getBufferRowRange()
endRow++
while (i > 0) {
const [previousSelectionStartRow, previousSelectionEndRow] = selections[i - 1].getBufferRowRange()
if (previousSelectionEndRow === startRow) {
startRow = previousSelectionStartRow
previousSelectionRanges[i - 1] = selections[i - 1].getBufferRange()
i--
} else {
break
}
}
const intersectingFolds = this.displayLayer.foldsIntersectingBufferRange([[startRow, 0], [endRow, 0]])
let textToDuplicate = this.getTextInBufferRange([[startRow, 0], [endRow, 0]])
if (endRow > this.getLastBufferRow()) textToDuplicate = `\n${textToDuplicate}`
this.buffer.insert([endRow, 0], textToDuplicate)
const insertedRowCount = endRow - startRow
for (let k = i; k <= j; k++) {
selections[k].setBufferRange(previousSelectionRanges[k].translate([insertedRowCount, 0]))
}
for (const fold of intersectingFolds) {
const foldRange = this.displayLayer.bufferRangeForFold(fold)
this.displayLayer.foldBufferRange(foldRange.translate([insertedRowCount, 0]))
}
i--
}
})
}
replaceSelectedText (options, fn) {
this.mutateSelectedText((selection) => {
selection.getBufferRange()
if (options && options.selectWordIfEmpty && selection.isEmpty()) {
selection.selectWord()
}
const text = selection.getText()
selection.deleteSelectedText()
const range = selection.insertText(fn(text))
selection.setBufferRange(range)
})
}
// Split multi-line selections into one selection per line.
//
// Operates on all selections. This method breaks apart all multi-line
// selections to create multiple single-line selections that cumulatively cover
// the same original area.
splitSelectionsIntoLines () {
this.mergeIntersectingSelections(() => {
for (const selection of this.getSelections()) {
const range = selection.getBufferRange()
if (range.isSingleLine()) continue
const {start, end} = range
this.addSelectionForBufferRange([start, [start.row, Infinity]])
let {row} = start
while (++row < end.row) {
this.addSelectionForBufferRange([[row, 0], [row, Infinity]])
}
if (end.column !== 0) this.addSelectionForBufferRange([[end.row, 0], [end.row, end.column]])
selection.destroy()
}
})
}
// Extended: For each selection, transpose the selected text.
//
// If the selection is empty, the characters preceding and following the cursor
// are swapped. Otherwise, the selected characters are reversed.
transpose () {
this.mutateSelectedText(selection => {
if (selection.isEmpty()) {
selection.selectRight()
const text = selection.getText()
selection.delete()
selection.cursor.moveLeft()
selection.insertText(text)
} else {
selection.insertText(selection.getText().split('').reverse().join(''))
}
})
}
// Extended: Convert the selected text to upper case.
//
// For each selection, if the selection is empty, converts the containing word
// to upper case. Otherwise convert the selected text to upper case.
upperCase () {
this.replaceSelectedText({selectWordIfEmpty: true}, text => text.toUpperCase())
}
// Extended: Convert the selected text to lower case.
//
// For each selection, if the selection is empty, converts the containing word
// to upper case. Otherwise convert the selected text to upper case.
lowerCase () {
this.replaceSelectedText({selectWordIfEmpty: true}, text => text.toLowerCase())
}
// Extended: Toggle line comments for rows intersecting selections.
//
// If the current grammar doesn't support comments, does nothing.
toggleLineCommentsInSelection () {
this.mutateSelectedText(selection => selection.toggleLineComments())
}
// Convert multiple lines to a single line.
//
// Operates on all selections. If the selection is empty, joins the current
// line with the next line. Otherwise it joins all lines that intersect the
// selection.
//
// Joining a line means that multiple lines are converted to a single line with
// the contents of each of the original non-empty lines separated by a space.
joinLines () {
this.mutateSelectedText(selection => selection.joinLines())
}
// Extended: For each cursor, insert a newline at beginning the following line.
insertNewlineBelow () {
this.transact(() => {
this.moveToEndOfLine()
this.insertNewline()
})
}
// Extended: For each cursor, insert a newline at the end of the preceding line.
insertNewlineAbove () {
this.transact(() => {
const bufferRow = this.getCursorBufferPosition().row
const indentLevel = this.indentationForBufferRow(bufferRow)
const onFirstLine = bufferRow === 0
this.moveToBeginningOfLine()
this.moveLeft()
this.insertNewline()
if (this.shouldAutoIndent() && (this.indentationForBufferRow(bufferRow) < indentLevel)) {
this.setIndentationForBufferRow(bufferRow, indentLevel)
}
if (onFirstLine) {
this.moveUp()
this.moveToEndOfLine()
}
})
}
// Extended: For each selection, if the selection is empty, delete all characters
// of the containing word that precede the cursor. Otherwise delete the
// selected text.
deleteToBeginningOfWord () {
this.mutateSelectedText(selection => selection.deleteToBeginningOfWord())
}
// Extended: Similar to {::deleteToBeginningOfWord}, but deletes only back to the
// previous word boundary.
deleteToPreviousWordBoundary () {
this.mutateSelectedText(selection => selection.deleteToPreviousWordBoundary())
}
// Extended: Similar to {::deleteToEndOfWord}, but deletes only up to the
// next word boundary.
deleteToNextWordBoundary () {
this.mutateSelectedText(selection => selection.deleteToNextWordBoundary())
}
// Extended: For each selection, if the selection is empty, delete all characters
// of the containing subword following the cursor. Otherwise delete the selected
// text.
deleteToBeginningOfSubword () {
this.mutateSelectedText(selection => selection.deleteToBeginningOfSubword())
}
// Extended: For each selection, if the selection is empty, delete all characters
// of the containing subword following the cursor. Otherwise delete the selected
// text.
deleteToEndOfSubword () {
this.mutateSelectedText(selection => selection.deleteToEndOfSubword())
}
// Extended: For each selection, if the selection is empty, delete all characters
// of the containing line that precede the cursor. Otherwise delete the
// selected text.
deleteToBeginningOfLine () {
this.mutateSelectedText(selection => selection.deleteToBeginningOfLine())
}
// Extended: For each selection, if the selection is not empty, deletes the
// selection; otherwise, deletes all characters of the containing line
// following the cursor. If the cursor is already at the end of the line,
// deletes the following newline.
deleteToEndOfLine () {
this.mutateSelectedText(selection => selection.deleteToEndOfLine())
}
// Extended: For each selection, if the selection is empty, delete all characters
// of the containing word following the cursor. Otherwise delete the selected
// text.
deleteToEndOfWord () {
this.mutateSelectedText(selection => selection.deleteToEndOfWord())
}
// Extended: Delete all lines intersecting selections.
deleteLine () {
this.mergeSelectionsOnSameRows()
this.mutateSelectedText(selection => selection.deleteLine())
}
/*
Section: History
*/
// Essential: Undo the last change.
undo () {
this.avoidMergingSelections(() => this.buffer.undo())
this.getLastSelection().autoscroll()
}
// Essential: Redo the last change.
redo () {
this.avoidMergingSelections(() => this.buffer.redo())
this.getLastSelection().autoscroll()
}
// Extended: Batch multiple operations as a single undo/redo step.
//
// Any group of operations that are logically grouped from the perspective of
// undoing and redoing should be performed in a transaction. If you want to
// abort the transaction, call {::abortTransaction} to terminate the function's
// execution and revert any changes performed up to the abortion.
//
// * `groupingInterval` (optional) The {Number} of milliseconds for which this
// transaction should be considered 'groupable' after it begins. If a transaction
// with a positive `groupingInterval` is committed while the previous transaction is
// still 'groupable', the two transactions are merged with respect to undo and redo.
// * `fn` A {Function} to call inside the transaction.
transact (groupingInterval, fn) {
return this.buffer.transact(groupingInterval, fn)
}
// Extended: Abort an open transaction, undoing any operations performed so far
// within the transaction.
abortTransaction () { return this.buffer.abortTransaction() }
// Extended: Create a pointer to the current state of the buffer for use
// with {::revertToCheckpoint} and {::groupChangesSinceCheckpoint}.
//
// Returns a checkpoint value.
createCheckpoint () { return this.buffer.createCheckpoint() }
// Extended: Revert the buffer to the state it was in when the given
// checkpoint was created.
//
// The redo stack will be empty following this operation, so changes since the
// checkpoint will be lost. If the given checkpoint is no longer present in the
// undo history, no changes will be made to the buffer and this method will
// return `false`.
//
// * `checkpoint` The checkpoint to revert to.
//
// Returns a {Boolean} indicating whether the operation succeeded.
revertToCheckpoint (checkpoint) { return this.buffer.revertToCheckpoint(checkpoint) }
// Extended: Group all changes since the given checkpoint into a single
// transaction for purposes of undo/redo.
//
// If the given checkpoint is no longer present in the undo history, no
// grouping will be performed and this method will return `false`.
//
// * `checkpoint` The checkpoint from which to group changes.
//
// Returns a {Boolean} indicating whether the operation succeeded.
groupChangesSinceCheckpoint (checkpoint) { return this.buffer.groupChangesSinceCheckpoint(checkpoint) }
/*
Section: TextEditor Coordinates
*/
// Essential: Convert a position in buffer-coordinates to screen-coordinates.
//
// The position is clipped via {::clipBufferPosition} prior to the conversion.
// The position is also clipped via {::clipScreenPosition} following the
// conversion, which only makes a difference when `options` are supplied.
//
// * `bufferPosition` A {Point} or {Array} of [row, column].
// * `options` (optional) An options hash for {::clipScreenPosition}.
//
// Returns a {Point}.
screenPositionForBufferPosition (bufferPosition, options) {
if (options && options.clip) {
Grim.deprecate('The `clip` parameter has been deprecated and will be removed soon. Please, use `clipDirection` instead.')
if (options.clipDirection) options.clipDirection = options.clip
}
if (options && options.wrapAtSoftNewlines != null) {
Grim.deprecate("The `wrapAtSoftNewlines` parameter has been deprecated and will be removed soon. Please, use `clipDirection: 'forward'` instead.")
if (options.clipDirection) options.clipDirection = options.wrapAtSoftNewlines ? 'forward' : 'backward'
}
if (options && options.wrapBeyondNewlines != null) {
Grim.deprecate("The `wrapBeyondNewlines` parameter has been deprecated and will be removed soon. Please, use `clipDirection: 'forward'` instead.")
if (options.clipDirection) options.clipDirection = options.wrapBeyondNewlines ? 'forward' : 'backward'
}
return this.displayLayer.translateBufferPosition(bufferPosition, options)
}
// Essential: Convert a position in screen-coordinates to buffer-coordinates.
//
// The position is clipped via {::clipScreenPosition} prior to the conversion.
//
// * `bufferPosition` A {Point} or {Array} of [row, column].
// * `options` (optional) An options hash for {::clipScreenPosition}.
//
// Returns a {Point}.
bufferPositionForScreenPosition (screenPosition, options) {
if (options && options.clip) {
Grim.deprecate('The `clip` parameter has been deprecated and will be removed soon. Please, use `clipDirection` instead.')
if (options.clipDirection) options.clipDirection = options.clip
}
if (options && options.wrapAtSoftNewlines != null) {
Grim.deprecate("The `wrapAtSoftNewlines` parameter has been deprecated and will be removed soon. Please, use `clipDirection: 'forward'` instead.")
if (options.clipDirection) options.clipDirection = options.wrapAtSoftNewlines ? 'forward' : 'backward'
}
if (options && options.wrapBeyondNewlines != null) {
Grim.deprecate("The `wrapBeyondNewlines` parameter has been deprecated and will be removed soon. Please, use `clipDirection: 'forward'` instead.")
if (options.clipDirection) options.clipDirection = options.wrapBeyondNewlines ? 'forward' : 'backward'
}
return this.displayLayer.translateScreenPosition(screenPosition, options)
}
// Essential: Convert a range in buffer-coordinates to screen-coordinates.
//
// * `bufferRange` {Range} in buffer coordinates to translate into screen coordinates.
//
// Returns a {Range}.
screenRangeForBufferRange (bufferRange, options) {
bufferRange = Range.fromObject(bufferRange)
const start = this.screenPositionForBufferPosition(bufferRange.start, options)
const end = this.screenPositionForBufferPosition(bufferRange.end, options)
return new Range(start, end)
}
// Essential: Convert a range in screen-coordinates to buffer-coordinates.
//
// * `screenRange` {Range} in screen coordinates to translate into buffer coordinates.
//
// Returns a {Range}.
bufferRangeForScreenRange (screenRange) {
screenRange = Range.fromObject(screenRange)
const start = this.bufferPositionForScreenPosition(screenRange.start)
const end = this.bufferPositionForScreenPosition(screenRange.end)
return new Range(start, end)
}
// Extended: Clip the given {Point} to a valid position in the buffer.
//
// If the given {Point} describes a position that is actually reachable by the
// cursor based on the current contents of the buffer, it is returned
// unchanged. If the {Point} does not describe a valid position, the closest
// valid position is returned instead.
//
// ## Examples
//
// ```coffee
// editor.clipBufferPosition([-1, -1]) # -> `[0, 0]`
//
// # When the line at buffer row 2 is 10 characters long
// editor.clipBufferPosition([2, Infinity]) # -> `[2, 10]`
// ```
//
// * `bufferPosition` The {Point} representing the position to clip.
//
// Returns a {Point}.
clipBufferPosition (bufferPosition) { return this.buffer.clipPosition(bufferPosition) }
// Extended: Clip the start and end of the given range to valid positions in the
// buffer. See {::clipBufferPosition} for more information.
//
// * `range` The {Range} to clip.
//
// Returns a {Range}.
clipBufferRange (range) { return this.buffer.clipRange(range) }
// Extended: Clip the given {Point} to a valid position on screen.
//
// If the given {Point} describes a position that is actually reachable by the
// cursor based on the current contents of the screen, it is returned
// unchanged. If the {Point} does not describe a valid position, the closest
// valid position is returned instead.
//
// ## Examples
//
// ```coffee
// editor.clipScreenPosition([-1, -1]) # -> `[0, 0]`
//
// # When the line at screen row 2 is 10 characters long
// editor.clipScreenPosition([2, Infinity]) # -> `[2, 10]`
// ```
//
// * `screenPosition` The {Point} representing the position to clip.
// * `options` (optional) {Object}
// * `clipDirection` {String} If `'backward'`, returns the first valid
// position preceding an invalid position. If `'forward'`, returns the
// first valid position following an invalid position. If `'closest'`,
// returns the first valid position closest to an invalid position.
// Defaults to `'closest'`.
//
// Returns a {Point}.
clipScreenPosition (screenPosition, options) {
if (options && options.clip) {
Grim.deprecate('The `clip` parameter has been deprecated and will be removed soon. Please, use `clipDirection` instead.')
if (options.clipDirection) options.clipDirection = options.clip
}
if (options && options.wrapAtSoftNewlines != null) {
Grim.deprecate("The `wrapAtSoftNewlines` parameter has been deprecated and will be removed soon. Please, use `clipDirection: 'forward'` instead.")
if (options.clipDirection) options.clipDirection = options.wrapAtSoftNewlines ? 'forward' : 'backward'
}
if (options && options.wrapBeyondNewlines != null) {
Grim.deprecate("The `wrapBeyondNewlines` parameter has been deprecated and will be removed soon. Please, use `clipDirection: 'forward'` instead.")
if (options.clipDirection) options.clipDirection = options.wrapBeyondNewlines ? 'forward' : 'backward'
}
return this.displayLayer.clipScreenPosition(screenPosition, options)
}
// Extended: Clip the start and end of the given range to valid positions on screen.
// See {::clipScreenPosition} for more information.
//
// * `range` The {Range} to clip.
// * `options` (optional) See {::clipScreenPosition} `options`.
//
// Returns a {Range}.
clipScreenRange (screenRange, options) {
screenRange = Range.fromObject(screenRange)
const start = this.displayLayer.clipScreenPosition(screenRange.start, options)
const end = this.displayLayer.clipScreenPosition(screenRange.end, options)
return Range(start, end)
}
/*
Section: Decorations
*/
// Essential: Add a decoration that tracks a {DisplayMarker}. When the
// marker moves, is invalidated, or is destroyed, the decoration will be
// updated to reflect the marker's state.
//
// The following are the supported decorations types:
//
// * __line__: Adds your CSS `class` to the line nodes within the range
// marked by the marker
// * __line-number__: Adds your CSS `class` to the line number nodes within the
// range marked by the marker
// * __highlight__: Adds a new highlight div to the editor surrounding the
// range marked by the marker. When the user selects text, the selection is
// visualized with a highlight decoration internally. The structure of this
// highlight will be
// ```html
// <div class="highlight <your-class>">
// <!-- Will be one region for each row in the range. Spans 2 lines? There will be 2 regions. -->
// <div class="region"></div>
// </div>
// ```
// * __overlay__: Positions the view associated with the given item at the head
// or tail of the given `DisplayMarker`.
// * __gutter__: A decoration that tracks a {DisplayMarker} in a {Gutter}. Gutter
// decorations are created by calling {Gutter::decorateMarker} on the
// desired `Gutter` instance.
// * __block__: Positions the view associated with the given item before or
// after the row of the given `TextEditorMarker`.
//
// ## Arguments
//
// * `marker` A {DisplayMarker} you want this decoration to follow.
// * `decorationParams` An {Object} representing the decoration e.g.
// `{type: 'line-number', class: 'linter-error'}`
// * `type` There are several supported decoration types. The behavior of the
// types are as follows:
// * `line` Adds the given `class` to the lines overlapping the rows
// spanned by the `DisplayMarker`.
// * `line-number` Adds the given `class` to the line numbers overlapping
// the rows spanned by the `DisplayMarker`.
// * `text` Injects spans into all text overlapping the marked range,
// then adds the given `class` or `style` properties to these spans.
// Use this to manipulate the foreground color or styling of text in
// a given range.
// * `highlight` Creates an absolutely-positioned `.highlight` div
// containing nested divs to cover the marked region. For example, this
// is used to implement selections.
// * `overlay` Positions the view associated with the given item at the
// head or tail of the given `DisplayMarker`, depending on the `position`
// property.
// * `gutter` Tracks a {DisplayMarker} in a {Gutter}. Created by calling
// {Gutter::decorateMarker} on the desired `Gutter` instance.
// * `block` Positions the view associated with the given item before or
// after the row of the given `TextEditorMarker`, depending on the `position`
// property.
// * `cursor` Renders a cursor at the head of the given marker. If multiple
// decorations are created for the same marker, their class strings and
// style objects are combined into a single cursor. You can use this
// decoration type to style existing cursors by passing in their markers
// or render artificial cursors that don't actually exist in the model
// by passing a marker that isn't actually associated with a cursor.
// * `class` This CSS class will be applied to the decorated line number,
// line, text spans, highlight regions, cursors, or overlay.
// * `style` An {Object} containing CSS style properties to apply to the
// relevant DOM node. Currently this only works with a `type` of `cursor`
// or `text`.
// * `item` (optional) An {HTMLElement} or a model {Object} with a
// corresponding view registered. Only applicable to the `gutter`,
// `overlay` and `block` decoration types.
// * `onlyHead` (optional) If `true`, the decoration will only be applied to
// the head of the `DisplayMarker`. Only applicable to the `line` and
// `line-number` decoration types.
// * `onlyEmpty` (optional) If `true`, the decoration will only be applied if
// the associated `DisplayMarker` is empty. Only applicable to the `gutter`,
// `line`, and `line-number` decoration types.
// * `onlyNonEmpty` (optional) If `true`, the decoration will only be applied
// if the associated `DisplayMarker` is non-empty. Only applicable to the
// `gutter`, `line`, and `line-number` decoration types.
// * `omitEmptyLastRow` (optional) If `false`, the decoration will be applied
// to the last row of a non-empty range, even if it ends at column 0.
// Defaults to `true`. Only applicable to the `gutter`, `line`, and
// `line-number` decoration types.
// * `position` (optional) Only applicable to decorations of type `overlay` and `block`.
// Controls where the view is positioned relative to the `TextEditorMarker`.
// Values can be `'head'` (the default) or `'tail'` for overlay decorations, and
// `'before'` (the default) or `'after'` for block decorations.
// * `avoidOverflow` (optional) Only applicable to decorations of type
// `overlay`. Determines whether the decoration adjusts its horizontal or
// vertical position to remain fully visible when it would otherwise
// overflow the editor. Defaults to `true`.
//
// Returns a {Decoration} object
decorateMarker (marker, decorationParams) {
return this.decorationManager.decorateMarker(marker, decorationParams)
}
// Essential: Add a decoration to every marker in the given marker layer. Can
// be used to decorate a large number of markers without having to create and
// manage many individual decorations.
//
// * `markerLayer` A {DisplayMarkerLayer} or {MarkerLayer} to decorate.
// * `decorationParams` The same parameters that are passed to
// {TextEditor::decorateMarker}, except the `type` cannot be `overlay` or `gutter`.
//
// Returns a {LayerDecoration}.
decorateMarkerLayer (markerLayer, decorationParams) {
return this.decorationManager.decorateMarkerLayer(markerLayer, decorationParams)
}
// Deprecated: Get all the decorations within a screen row range on the default
// layer.
//
// * `startScreenRow` the {Number} beginning screen row
// * `endScreenRow` the {Number} end screen row (inclusive)
//
// Returns an {Object} of decorations in the form
// `{1: [{id: 10, type: 'line-number', class: 'someclass'}], 2: ...}`
// where the keys are {DisplayMarker} IDs, and the values are an array of decoration
// params objects attached to the marker.
// Returns an empty object when no decorations are found
decorationsForScreenRowRange (startScreenRow, endScreenRow) {
return this.decorationManager.decorationsForScreenRowRange(startScreenRow, endScreenRow)
}
decorationsStateForScreenRowRange (startScreenRow, endScreenRow) {
return this.decorationManager.decorationsStateForScreenRowRange(startScreenRow, endScreenRow)
}
// Extended: Get all decorations.
//
// * `propertyFilter` (optional) An {Object} containing key value pairs that
// the returned decorations' properties must match.
//
// Returns an {Array} of {Decoration}s.
getDecorations (propertyFilter) {
return this.decorationManager.getDecorations(propertyFilter)
}
// Extended: Get all decorations of type 'line'.
//
// * `propertyFilter` (optional) An {Object} containing key value pairs that
// the returned decorations' properties must match.
//
// Returns an {Array} of {Decoration}s.
getLineDecorations (propertyFilter) {
return this.decorationManager.getLineDecorations(propertyFilter)
}
// Extended: Get all decorations of type 'line-number'.
//
// * `propertyFilter` (optional) An {Object} containing key value pairs that
// the returned decorations' properties must match.
//
// Returns an {Array} of {Decoration}s.
getLineNumberDecorations (propertyFilter) {
return this.decorationManager.getLineNumberDecorations(propertyFilter)
}
// Extended: Get all decorations of type 'highlight'.
//
// * `propertyFilter` (optional) An {Object} containing key value pairs that
// the returned decorations' properties must match.
//
// Returns an {Array} of {Decoration}s.
getHighlightDecorations (propertyFilter) {
return this.decorationManager.getHighlightDecorations(propertyFilter)
}
// Extended: Get all decorations of type 'overlay'.
//
// * `propertyFilter` (optional) An {Object} containing key value pairs that
// the returned decorations' properties must match.
//
// Returns an {Array} of {Decoration}s.
getOverlayDecorations (propertyFilter) {
return this.decorationManager.getOverlayDecorations(propertyFilter)
}
/*
Section: Markers
*/
// Essential: Create a marker on the default marker layer with the given range
// in buffer coordinates. This marker will maintain its logical location as the
// buffer is changed, so if you mark a particular word, the marker will remain
// over that word even if the word's location in the buffer changes.
//
// * `range` A {Range} or range-compatible {Array}
// * `properties` A hash of key-value pairs to associate with the marker. There
// are also reserved property names that have marker-specific meaning.
// * `maintainHistory` (optional) {Boolean} Whether to store this marker's
// range before and after each change in the undo history. This allows the
// marker's position to be restored more accurately for certain undo/redo
// operations, but uses more time and memory. (default: false)
// * `reversed` (optional) {Boolean} Creates the marker in a reversed
// orientation. (default: false)
// * `invalidate` (optional) {String} Determines the rules by which changes
// to the buffer *invalidate* the marker. (default: 'overlap') It can be
// any of the following strategies, in order of fragility:
// * __never__: The marker is never marked as invalid. This is a good choice for
// markers representing selections in an editor.
// * __surround__: The marker is invalidated by changes that completely surround it.
// * __overlap__: The marker is invalidated by changes that surround the
// start or end of the marker. This is the default.
// * __inside__: The marker is invalidated by changes that extend into the
// inside of the marker. Changes that end at the marker's start or
// start at the marker's end do not invalidate the marker.
// * __touch__: The marker is invalidated by a change that touches the marked
// region in any way, including changes that end at the marker's
// start or start at the marker's end. This is the most fragile strategy.
//
// Returns a {DisplayMarker}.
markBufferRange (bufferRange, options) {
return this.defaultMarkerLayer.markBufferRange(bufferRange, options)
}
// Essential: Create a marker on the default marker layer with the given range
// in screen coordinates. This marker will maintain its logical location as the
// buffer is changed, so if you mark a particular word, the marker will remain
// over that word even if the word's location in the buffer changes.
//
// * `range` A {Range} or range-compatible {Array}
// * `properties` A hash of key-value pairs to associate with the marker. There
// are also reserved property names that have marker-specific meaning.
// * `maintainHistory` (optional) {Boolean} Whether to store this marker's
// range before and after each change in the undo history. This allows the
// marker's position to be restored more accurately for certain undo/redo
// operations, but uses more time and memory. (default: false)
// * `reversed` (optional) {Boolean} Creates the marker in a reversed
// orientation. (default: false)
// * `invalidate` (optional) {String} Determines the rules by which changes
// to the buffer *invalidate* the marker. (default: 'overlap') It can be
// any of the following strategies, in order of fragility:
// * __never__: The marker is never marked as invalid. This is a good choice for
// markers representing selections in an editor.
// * __surround__: The marker is invalidated by changes that completely surround it.
// * __overlap__: The marker is invalidated by changes that surround the
// start or end of the marker. This is the default.
// * __inside__: The marker is invalidated by changes that extend into the
// inside of the marker. Changes that end at the marker's start or
// start at the marker's end do not invalidate the marker.
// * __touch__: The marker is invalidated by a change that touches the marked
// region in any way, including changes that end at the marker's
// start or start at the marker's end. This is the most fragile strategy.
//
// Returns a {DisplayMarker}.
markScreenRange (screenRange, options) {
return this.defaultMarkerLayer.markScreenRange(screenRange, options)
}
// Essential: Create a marker on the default marker layer with the given buffer
// position and no tail. To group multiple markers together in their own
// private layer, see {::addMarkerLayer}.
//
// * `bufferPosition` A {Point} or point-compatible {Array}
// * `options` (optional) An {Object} with the following keys:
// * `invalidate` (optional) {String} Determines the rules by which changes
// to the buffer *invalidate* the marker. (default: 'overlap') It can be
// any of the following strategies, in order of fragility:
// * __never__: The marker is never marked as invalid. This is a good choice for
// markers representing selections in an editor.
// * __surround__: The marker is invalidated by changes that completely surround it.
// * __overlap__: The marker is invalidated by changes that surround the
// start or end of the marker. This is the default.
// * __inside__: The marker is invalidated by changes that extend into the
// inside of the marker. Changes that end at the marker's start or
// start at the marker's end do not invalidate the marker.
// * __touch__: The marker is invalidated by a change that touches the marked
// region in any way, including changes that end at the marker's
// start or start at the marker's end. This is the most fragile strategy.
//
// Returns a {DisplayMarker}.
markBufferPosition (bufferPosition, options) {
return this.defaultMarkerLayer.markBufferPosition(bufferPosition, options)
}
// Essential: Create a marker on the default marker layer with the given screen
// position and no tail. To group multiple markers together in their own
// private layer, see {::addMarkerLayer}.
//
// * `screenPosition` A {Point} or point-compatible {Array}
// * `options` (optional) An {Object} with the following keys:
// * `invalidate` (optional) {String} Determines the rules by which changes
// to the buffer *invalidate* the marker. (default: 'overlap') It can be
// any of the following strategies, in order of fragility:
// * __never__: The marker is never marked as invalid. This is a good choice for
// markers representing selections in an editor.
// * __surround__: The marker is invalidated by changes that completely surround it.
// * __overlap__: The marker is invalidated by changes that surround the
// start or end of the marker. This is the default.
// * __inside__: The marker is invalidated by changes that extend into the
// inside of the marker. Changes that end at the marker's start or
// start at the marker's end do not invalidate the marker.
// * __touch__: The marker is invalidated by a change that touches the marked
// region in any way, including changes that end at the marker's
// start or start at the marker's end. This is the most fragile strategy.
// * `clipDirection` {String} If `'backward'`, returns the first valid
// position preceding an invalid position. If `'forward'`, returns the
// first valid position following an invalid position. If `'closest'`,
// returns the first valid position closest to an invalid position.
// Defaults to `'closest'`.
//
// Returns a {DisplayMarker}.
markScreenPosition (screenPosition, options) {
return this.defaultMarkerLayer.markScreenPosition(screenPosition, options)
}
// Essential: Find all {DisplayMarker}s on the default marker layer that
// match the given properties.
//
// This method finds markers based on the given properties. Markers can be
// associated with custom properties that will be compared with basic equality.
// In addition, there are several special properties that will be compared
// with the range of the markers rather than their properties.
//
// * `properties` An {Object} containing properties that each returned marker
// must satisfy. Markers can be associated with custom properties, which are
// compared with basic equality. In addition, several reserved properties
// can be used to filter markers based on their current range:
// * `startBufferRow` Only include markers starting at this row in buffer
// coordinates.
// * `endBufferRow` Only include markers ending at this row in buffer
// coordinates.
// * `containsBufferRange` Only include markers containing this {Range} or
// in range-compatible {Array} in buffer coordinates.
// * `containsBufferPosition` Only include markers containing this {Point}
// or {Array} of `[row, column]` in buffer coordinates.
//
// Returns an {Array} of {DisplayMarker}s
findMarkers (params) {
return this.defaultMarkerLayer.findMarkers(params)
}
// Extended: Get the {DisplayMarker} on the default layer for the given
// marker id.
//
// * `id` {Number} id of the marker
getMarker (id) {
return this.defaultMarkerLayer.getMarker(id)
}
// Extended: Get all {DisplayMarker}s on the default marker layer. Consider
// using {::findMarkers}
getMarkers () {
return this.defaultMarkerLayer.getMarkers()
}
// Extended: Get the number of markers in the default marker layer.
//
// Returns a {Number}.
getMarkerCount () {
return this.defaultMarkerLayer.getMarkerCount()
}
destroyMarker (id) {
const marker = this.getMarker(id)
if (marker) marker.destroy()
}
// Essential: Create a marker layer to group related markers.
//
// * `options` An {Object} containing the following keys:
// * `maintainHistory` A {Boolean} indicating whether marker state should be
// restored on undo/redo. Defaults to `false`.
// * `persistent` A {Boolean} indicating whether or not this marker layer
// should be serialized and deserialized along with the rest of the
// buffer. Defaults to `false`. If `true`, the marker layer's id will be
// maintained across the serialization boundary, allowing you to retrieve
// it via {::getMarkerLayer}.
//
// Returns a {DisplayMarkerLayer}.
addMarkerLayer (options) {
return this.displayLayer.addMarkerLayer(options)
}
// Essential: Get a {DisplayMarkerLayer} by id.
//
// * `id` The id of the marker layer to retrieve.
//
// Returns a {DisplayMarkerLayer} or `undefined` if no layer exists with the
// given id.
getMarkerLayer (id) {
return this.displayLayer.getMarkerLayer(id)
}
// Essential: Get the default {DisplayMarkerLayer}.
//
// All marker APIs not tied to an explicit layer interact with this default
// layer.
//
// Returns a {DisplayMarkerLayer}.
getDefaultMarkerLayer () {
return this.defaultMarkerLayer
}
/*
Section: Cursors
*/
// Essential: Get the position of the most recently added cursor in buffer
// coordinates.
//
// Returns a {Point}
getCursorBufferPosition () {
return this.getLastCursor().getBufferPosition()
}
// Essential: Get the position of all the cursor positions in buffer coordinates.
//
// Returns {Array} of {Point}s in the order they were added
getCursorBufferPositions () {
return this.getCursors().map((cursor) => cursor.getBufferPosition())
}
// Essential: Move the cursor to the given position in buffer coordinates.
//
// If there are multiple cursors, they will be consolidated to a single cursor.
//
// * `position` A {Point} or {Array} of `[row, column]`
// * `options` (optional) An {Object} containing the following keys:
// * `autoscroll` Determines whether the editor scrolls to the new cursor's
// position. Defaults to true.
setCursorBufferPosition (position, options) {
return this.moveCursors(cursor => cursor.setBufferPosition(position, options))
}
// Essential: Get a {Cursor} at given screen coordinates {Point}
//
// * `position` A {Point} or {Array} of `[row, column]`
//
// Returns the first matched {Cursor} or undefined
getCursorAtScreenPosition (position) {
const selection = this.getSelectionAtScreenPosition(position)
if (selection && selection.getHeadScreenPosition().isEqual(position)) {
return selection.cursor
}
}
// Essential: Get the position of the most recently added cursor in screen
// coordinates.
//
// Returns a {Point}.
getCursorScreenPosition () {
return this.getLastCursor().getScreenPosition()
}
// Essential: Get the position of all the cursor positions in screen coordinates.
//
// Returns {Array} of {Point}s in the order the cursors were added
getCursorScreenPositions () {
return this.getCursors().map((cursor) => cursor.getScreenPosition())
}
// Essential: Move the cursor to the given position in screen coordinates.
//
// If there are multiple cursors, they will be consolidated to a single cursor.
//
// * `position` A {Point} or {Array} of `[row, column]`
// * `options` (optional) An {Object} combining options for {::clipScreenPosition} with:
// * `autoscroll` Determines whether the editor scrolls to the new cursor's
// position. Defaults to true.
setCursorScreenPosition (position, options) {
if (options && options.clip) {
Grim.deprecate('The `clip` parameter has been deprecated and will be removed soon. Please, use `clipDirection` instead.')
if (options.clipDirection) options.clipDirection = options.clip
}
if (options && options.wrapAtSoftNewlines != null) {
Grim.deprecate("The `wrapAtSoftNewlines` parameter has been deprecated and will be removed soon. Please, use `clipDirection: 'forward'` instead.")
if (options.clipDirection) options.clipDirection = options.wrapAtSoftNewlines ? 'forward' : 'backward'
}
if (options && options.wrapBeyondNewlines != null) {
Grim.deprecate("The `wrapBeyondNewlines` parameter has been deprecated and will be removed soon. Please, use `clipDirection: 'forward'` instead.")
if (options.clipDirection) options.clipDirection = options.wrapBeyondNewlines ? 'forward' : 'backward'
}
return this.moveCursors(cursor => cursor.setScreenPosition(position, options))
}
// Essential: Add a cursor at the given position in buffer coordinates.
//
// * `bufferPosition` A {Point} or {Array} of `[row, column]`
//
// Returns a {Cursor}.
addCursorAtBufferPosition (bufferPosition, options) {
this.selectionsMarkerLayer.markBufferPosition(bufferPosition, {invalidate: 'never'})
if (!options || options.autoscroll !== false) this.getLastSelection().cursor.autoscroll()
return this.getLastSelection().cursor
}
// Essential: Add a cursor at the position in screen coordinates.
//
// * `screenPosition` A {Point} or {Array} of `[row, column]`
//
// Returns a {Cursor}.
addCursorAtScreenPosition (screenPosition, options) {
this.selectionsMarkerLayer.markScreenPosition(screenPosition, {invalidate: 'never'})
if (!options || options.autoscroll !== false) this.getLastSelection().cursor.autoscroll()
return this.getLastSelection().cursor
}
// Essential: Returns {Boolean} indicating whether or not there are multiple cursors.
hasMultipleCursors () {
return this.getCursors().length > 1
}
// Essential: Move every cursor up one row in screen coordinates.
//
// * `lineCount` (optional) {Number} number of lines to move
moveUp (lineCount) {
return this.moveCursors(cursor => cursor.moveUp(lineCount, {moveToEndOfSelection: true}))
}
// Essential: Move every cursor down one row in screen coordinates.
//
// * `lineCount` (optional) {Number} number of lines to move
moveDown (lineCount) {
return this.moveCursors(cursor => cursor.moveDown(lineCount, {moveToEndOfSelection: true}))
}
// Essential: Move every cursor left one column.
//
// * `columnCount` (optional) {Number} number of columns to move (default: 1)
moveLeft (columnCount) {
return this.moveCursors(cursor => cursor.moveLeft(columnCount, {moveToEndOfSelection: true}))
}
// Essential: Move every cursor right one column.
//
// * `columnCount` (optional) {Number} number of columns to move (default: 1)
moveRight (columnCount) {
return this.moveCursors(cursor => cursor.moveRight(columnCount, {moveToEndOfSelection: true}))
}
// Essential: Move every cursor to the beginning of its line in buffer coordinates.
moveToBeginningOfLine () {
return this.moveCursors(cursor => cursor.moveToBeginningOfLine())
}
// Essential: Move every cursor to the beginning of its line in screen coordinates.
moveToBeginningOfScreenLine () {
return this.moveCursors(cursor => cursor.moveToBeginningOfScreenLine())
}
// Essential: Move every cursor to the first non-whitespace character of its line.
moveToFirstCharacterOfLine () {
return this.moveCursors(cursor => cursor.moveToFirstCharacterOfLine())
}
// Essential: Move every cursor to the end of its line in buffer coordinates.
moveToEndOfLine () {
return this.moveCursors(cursor => cursor.moveToEndOfLine())
}
// Essential: Move every cursor to the end of its line in screen coordinates.
moveToEndOfScreenLine () {
return this.moveCursors(cursor => cursor.moveToEndOfScreenLine())
}
// Essential: Move every cursor to the beginning of its surrounding word.
moveToBeginningOfWord () {
return this.moveCursors(cursor => cursor.moveToBeginningOfWord())
}
// Essential: Move every cursor to the end of its surrounding word.
moveToEndOfWord () {
return this.moveCursors(cursor => cursor.moveToEndOfWord())
}
// Cursor Extended
// Extended: Move every cursor to the top of the buffer.
//
// If there are multiple cursors, they will be merged into a single cursor.
moveToTop () {
return this.moveCursors(cursor => cursor.moveToTop())
}
// Extended: Move every cursor to the bottom of the buffer.
//
// If there are multiple cursors, they will be merged into a single cursor.
moveToBottom () {
return this.moveCursors(cursor => cursor.moveToBottom())
}
// Extended: Move every cursor to the beginning of the next word.
moveToBeginningOfNextWord () {
return this.moveCursors(cursor => cursor.moveToBeginningOfNextWord())
}
// Extended: Move every cursor to the previous word boundary.
moveToPreviousWordBoundary () {
return this.moveCursors(cursor => cursor.moveToPreviousWordBoundary())
}
// Extended: Move every cursor to the next word boundary.
moveToNextWordBoundary () {
return this.moveCursors(cursor => cursor.moveToNextWordBoundary())
}
// Extended: Move every cursor to the previous subword boundary.
moveToPreviousSubwordBoundary () {
return this.moveCursors(cursor => cursor.moveToPreviousSubwordBoundary())
}
// Extended: Move every cursor to the next subword boundary.
moveToNextSubwordBoundary () {
return this.moveCursors(cursor => cursor.moveToNextSubwordBoundary())
}
// Extended: Move every cursor to the beginning of the next paragraph.
moveToBeginningOfNextParagraph () {
return this.moveCursors(cursor => cursor.moveToBeginningOfNextParagraph())
}
// Extended: Move every cursor to the beginning of the previous paragraph.
moveToBeginningOfPreviousParagraph () {
return this.moveCursors(cursor => cursor.moveToBeginningOfPreviousParagraph())
}
// Extended: Returns the most recently added {Cursor}
getLastCursor () {
this.createLastSelectionIfNeeded()
return _.last(this.cursors)
}
// Extended: Returns the word surrounding the most recently added cursor.
//
// * `options` (optional) See {Cursor::getBeginningOfCurrentWordBufferPosition}.
getWordUnderCursor (options) {
return this.getTextInBufferRange(this.getLastCursor().getCurrentWordBufferRange(options))
}
// Extended: Get an Array of all {Cursor}s.
getCursors () {
this.createLastSelectionIfNeeded()
return this.cursors.slice()
}
// Extended: Get all {Cursors}s, ordered by their position in the buffer
// instead of the order in which they were added.
//
// Returns an {Array} of {Selection}s.
getCursorsOrderedByBufferPosition () {
return this.getCursors().sort((a, b) => a.compare(b))
}
cursorsForScreenRowRange (startScreenRow, endScreenRow) {
const cursors = []
for (let marker of this.selectionsMarkerLayer.findMarkers({intersectsScreenRowRange: [startScreenRow, endScreenRow]})) {
const cursor = this.cursorsByMarkerId.get(marker.id)
if (cursor) cursors.push(cursor)
}
return cursors
}
// Add a cursor based on the given {DisplayMarker}.
addCursor (marker) {
const cursor = new Cursor({editor: this, marker, showCursorOnSelection: this.showCursorOnSelection})
this.cursors.push(cursor)
this.cursorsByMarkerId.set(marker.id, cursor)
return cursor
}
moveCursors (fn) {
return this.transact(() => {
this.getCursors().forEach(fn)
return this.mergeCursors()
})
}
cursorMoved (event) {
return this.emitter.emit('did-change-cursor-position', event)
}
// Merge cursors that have the same screen position
mergeCursors () {
const positions = {}
for (let cursor of this.getCursors()) {
const position = cursor.getBufferPosition().toString()
if (positions.hasOwnProperty(position)) {
cursor.destroy()
} else {
positions[position] = true
}
}
}
/*
Section: Selections
*/
// Essential: Get the selected text of the most recently added selection.
//
// Returns a {String}.
getSelectedText () {
return this.getLastSelection().getText()
}
// Essential: Get the {Range} of the most recently added selection in buffer
// coordinates.
//
// Returns a {Range}.
getSelectedBufferRange () {
return this.getLastSelection().getBufferRange()
}
// Essential: Get the {Range}s of all selections in buffer coordinates.
//
// The ranges are sorted by when the selections were added. Most recent at the end.
//
// Returns an {Array} of {Range}s.
getSelectedBufferRanges () {
return this.getSelections().map((selection) => selection.getBufferRange())
}
// Essential: Set the selected range in buffer coordinates. If there are multiple
// selections, they are reduced to a single selection with the given range.
//
// * `bufferRange` A {Range} or range-compatible {Array}.
// * `options` (optional) An options {Object}:
// * `reversed` A {Boolean} indicating whether to create the selection in a
// reversed orientation.
// * `preserveFolds` A {Boolean}, which if `true` preserves the fold settings after the
// selection is set.
setSelectedBufferRange (bufferRange, options) {
return this.setSelectedBufferRanges([bufferRange], options)
}
// Essential: Set the selected ranges in buffer coordinates. If there are multiple
// selections, they are replaced by new selections with the given ranges.
//
// * `bufferRanges` An {Array} of {Range}s or range-compatible {Array}s.
// * `options` (optional) An options {Object}:
// * `reversed` A {Boolean} indicating whether to create the selection in a
// reversed orientation.
// * `preserveFolds` A {Boolean}, which if `true` preserves the fold settings after the
// selection is set.
setSelectedBufferRanges (bufferRanges, options = {}) {
if (!bufferRanges.length) throw new Error('Passed an empty array to setSelectedBufferRanges')
const selections = this.getSelections()
for (let selection of selections.slice(bufferRanges.length)) {
selection.destroy()
}
this.mergeIntersectingSelections(options, () => {
for (let i = 0; i < bufferRanges.length; i++) {
let bufferRange = bufferRanges[i]
bufferRange = Range.fromObject(bufferRange)
if (selections[i]) {
selections[i].setBufferRange(bufferRange, options)
} else {
this.addSelectionForBufferRange(bufferRange, options)
}
}
})
}
// Essential: Get the {Range} of the most recently added selection in screen
// coordinates.
//
// Returns a {Range}.
getSelectedScreenRange () {
return this.getLastSelection().getScreenRange()
}
// Essential: Get the {Range}s of all selections in screen coordinates.
//
// The ranges are sorted by when the selections were added. Most recent at the end.
//
// Returns an {Array} of {Range}s.
getSelectedScreenRanges () {
return this.getSelections().map((selection) => selection.getScreenRange())
}
// Essential: Set the selected range in screen coordinates. If there are multiple
// selections, they are reduced to a single selection with the given range.
//
// * `screenRange` A {Range} or range-compatible {Array}.
// * `options` (optional) An options {Object}:
// * `reversed` A {Boolean} indicating whether to create the selection in a
// reversed orientation.
setSelectedScreenRange (screenRange, options) {
return this.setSelectedBufferRange(this.bufferRangeForScreenRange(screenRange, options), options)
}
// Essential: Set the selected ranges in screen coordinates. If there are multiple
// selections, they are replaced by new selections with the given ranges.
//
// * `screenRanges` An {Array} of {Range}s or range-compatible {Array}s.
// * `options` (optional) An options {Object}:
// * `reversed` A {Boolean} indicating whether to create the selection in a
// reversed orientation.
setSelectedScreenRanges (screenRanges, options = {}) {
if (!screenRanges.length) throw new Error('Passed an empty array to setSelectedScreenRanges')
const selections = this.getSelections()
for (let selection of selections.slice(screenRanges.length)) {
selection.destroy()
}
this.mergeIntersectingSelections(options, () => {
for (let i = 0; i < screenRanges.length; i++) {
let screenRange = screenRanges[i]
screenRange = Range.fromObject(screenRange)
if (selections[i]) {
selections[i].setScreenRange(screenRange, options)
} else {
this.addSelectionForScreenRange(screenRange, options)
}
}
})
}
// Essential: Add a selection for the given range in buffer coordinates.
//
// * `bufferRange` A {Range}
// * `options` (optional) An options {Object}:
// * `reversed` A {Boolean} indicating whether to create the selection in a
// reversed orientation.
// * `preserveFolds` A {Boolean}, which if `true` preserves the fold settings after the
// selection is set.
//
// Returns the added {Selection}.
addSelectionForBufferRange (bufferRange, options = {}) {
bufferRange = Range.fromObject(bufferRange)
if (!options.preserveFolds) {
this.displayLayer.destroyFoldsContainingBufferPositions([bufferRange.start, bufferRange.end], true)
}
this.selectionsMarkerLayer.markBufferRange(bufferRange, {invalidate: 'never', reversed: options.reversed != null ? options.reversed : false})
if (options.autoscroll !== false) this.getLastSelection().autoscroll()
return this.getLastSelection()
}
// Essential: Add a selection for the given range in screen coordinates.
//
// * `screenRange` A {Range}
// * `options` (optional) An options {Object}:
// * `reversed` A {Boolean} indicating whether to create the selection in a
// reversed orientation.
// * `preserveFolds` A {Boolean}, which if `true` preserves the fold settings after the
// selection is set.
// Returns the added {Selection}.
addSelectionForScreenRange (screenRange, options = {}) {
return this.addSelectionForBufferRange(this.bufferRangeForScreenRange(screenRange), options)
}
// Essential: Select from the current cursor position to the given position in
// buffer coordinates.
//
// This method may merge selections that end up intersecting.
//
// * `position` An instance of {Point}, with a given `row` and `column`.
selectToBufferPosition (position) {
const lastSelection = this.getLastSelection()
lastSelection.selectToBufferPosition(position)
return this.mergeIntersectingSelections({reversed: lastSelection.isReversed()})
}
// Essential: Select from the current cursor position to the given position in
// screen coordinates.
//
// This method may merge selections that end up intersecting.
//
// * `position` An instance of {Point}, with a given `row` and `column`.
selectToScreenPosition (position, options) {
const lastSelection = this.getLastSelection()
lastSelection.selectToScreenPosition(position, options)
if (!options || !options.suppressSelectionMerge) {
return this.mergeIntersectingSelections({reversed: lastSelection.isReversed()})
}
}
// Essential: Move the cursor of each selection one character upward while
// preserving the selection's tail position.
//
// * `rowCount` (optional) {Number} number of rows to select (default: 1)
//
// This method may merge selections that end up intersecting.
selectUp (rowCount) {
return this.expandSelectionsBackward(selection => selection.selectUp(rowCount))
}
// Essential: Move the cursor of each selection one character downward while
// preserving the selection's tail position.
//
// * `rowCount` (optional) {Number} number of rows to select (default: 1)
//
// This method may merge selections that end up intersecting.
selectDown (rowCount) {
return this.expandSelectionsForward(selection => selection.selectDown(rowCount))
}
// Essential: Move the cursor of each selection one character leftward while
// preserving the selection's tail position.
//
// * `columnCount` (optional) {Number} number of columns to select (default: 1)
//
// This method may merge selections that end up intersecting.
selectLeft (columnCount) {
return this.expandSelectionsBackward(selection => selection.selectLeft(columnCount))
}
// Essential: Move the cursor of each selection one character rightward while
// preserving the selection's tail position.
//
// * `columnCount` (optional) {Number} number of columns to select (default: 1)
//
// This method may merge selections that end up intersecting.
selectRight (columnCount) {
return this.expandSelectionsForward(selection => selection.selectRight(columnCount))
}
// Essential: Select from the top of the buffer to the end of the last selection
// in the buffer.
//
// This method merges multiple selections into a single selection.
selectToTop () {
return this.expandSelectionsBackward(selection => selection.selectToTop())
}
// Essential: Selects from the top of the first selection in the buffer to the end
// of the buffer.
//
// This method merges multiple selections into a single selection.
selectToBottom () {
return this.expandSelectionsForward(selection => selection.selectToBottom())
}
// Essential: Select all text in the buffer.
//
// This method merges multiple selections into a single selection.
selectAll () {
return this.expandSelectionsForward(selection => selection.selectAll())
}
// Essential: Move the cursor of each selection to the beginning of its line
// while preserving the selection's tail position.
//
// This method may merge selections that end up intersecting.
selectToBeginningOfLine () {
return this.expandSelectionsBackward(selection => selection.selectToBeginningOfLine())
}
// Essential: Move the cursor of each selection to the first non-whitespace
// character of its line while preserving the selection's tail position. If the
// cursor is already on the first character of the line, move it to the
// beginning of the line.
//
// This method may merge selections that end up intersecting.
selectToFirstCharacterOfLine () {
return this.expandSelectionsBackward(selection => selection.selectToFirstCharacterOfLine())
}
// Essential: Move the cursor of each selection to the end of its line while
// preserving the selection's tail position.
//
// This method may merge selections that end up intersecting.
selectToEndOfLine () {
return this.expandSelectionsForward(selection => selection.selectToEndOfLine())
}
// Essential: Expand selections to the beginning of their containing word.
//
// Operates on all selections. Moves the cursor to the beginning of the
// containing word while preserving the selection's tail position.
selectToBeginningOfWord () {
return this.expandSelectionsBackward(selection => selection.selectToBeginningOfWord())
}
// Essential: Expand selections to the end of their containing word.
//
// Operates on all selections. Moves the cursor to the end of the containing
// word while preserving the selection's tail position.
selectToEndOfWord () {
return this.expandSelectionsForward(selection => selection.selectToEndOfWord())
}
// Extended: For each selection, move its cursor to the preceding subword
// boundary while maintaining the selection's tail position.
//
// This method may merge selections that end up intersecting.
selectToPreviousSubwordBoundary () {
return this.expandSelectionsBackward(selection => selection.selectToPreviousSubwordBoundary())
}
// Extended: For each selection, move its cursor to the next subword boundary
// while maintaining the selection's tail position.
//
// This method may merge selections that end up intersecting.
selectToNextSubwordBoundary () {
return this.expandSelectionsForward(selection => selection.selectToNextSubwordBoundary())
}
// Essential: For each cursor, select the containing line.
//
// This method merges selections on successive lines.
selectLinesContainingCursors () {
return this.expandSelectionsForward(selection => selection.selectLine())
}
// Essential: Select the word surrounding each cursor.
selectWordsContainingCursors () {
return this.expandSelectionsForward(selection => selection.selectWord())
}
// Selection Extended
// Extended: For each selection, move its cursor to the preceding word boundary
// while maintaining the selection's tail position.
//
// This method may merge selections that end up intersecting.
selectToPreviousWordBoundary () {
return this.expandSelectionsBackward(selection => selection.selectToPreviousWordBoundary())
}
// Extended: For each selection, move its cursor to the next word boundary while
// maintaining the selection's tail position.
//
// This method may merge selections that end up intersecting.
selectToNextWordBoundary () {
return this.expandSelectionsForward(selection => selection.selectToNextWordBoundary())
}
// Extended: Expand selections to the beginning of the next word.
//
// Operates on all selections. Moves the cursor to the beginning of the next
// word while preserving the selection's tail position.
selectToBeginningOfNextWord () {
return this.expandSelectionsForward(selection => selection.selectToBeginningOfNextWord())
}
// Extended: Expand selections to the beginning of the next paragraph.
//
// Operates on all selections. Moves the cursor to the beginning of the next
// paragraph while preserving the selection's tail position.
selectToBeginningOfNextParagraph () {
return this.expandSelectionsForward(selection => selection.selectToBeginningOfNextParagraph())
}
// Extended: Expand selections to the beginning of the next paragraph.
//
// Operates on all selections. Moves the cursor to the beginning of the next
// paragraph while preserving the selection's tail position.
selectToBeginningOfPreviousParagraph () {
return this.expandSelectionsBackward(selection => selection.selectToBeginningOfPreviousParagraph())
}
// Extended: Select the range of the given marker if it is valid.
//
// * `marker` A {DisplayMarker}
//
// Returns the selected {Range} or `undefined` if the marker is invalid.
selectMarker (marker) {
if (marker.isValid()) {
const range = marker.getBufferRange()
this.setSelectedBufferRange(range)
return range
}
}
// Extended: Get the most recently added {Selection}.
//
// Returns a {Selection}.
getLastSelection () {
this.createLastSelectionIfNeeded()
return _.last(this.selections)
}
getSelectionAtScreenPosition (position) {
const markers = this.selectionsMarkerLayer.findMarkers({containsScreenPosition: position})
if (markers.length > 0) return this.cursorsByMarkerId.get(markers[0].id).selection
}
// Extended: Get current {Selection}s.
//
// Returns: An {Array} of {Selection}s.
getSelections () {
this.createLastSelectionIfNeeded()
return this.selections.slice()
}
// Extended: Get all {Selection}s, ordered by their position in the buffer
// instead of the order in which they were added.
//
// Returns an {Array} of {Selection}s.
getSelectionsOrderedByBufferPosition () {
return this.getSelections().sort((a, b) => a.compare(b))
}
// Extended: Determine if a given range in buffer coordinates intersects a
// selection.
//
// * `bufferRange` A {Range} or range-compatible {Array}.
//
// Returns a {Boolean}.
selectionIntersectsBufferRange (bufferRange) {
return this.getSelections().some(selection => selection.intersectsBufferRange(bufferRange))
}
// Selections Private
// Add a similarly-shaped selection to the next eligible line below
// each selection.
//
// Operates on all selections. If the selection is empty, adds an empty
// selection to the next following non-empty line as close to the current
// selection's column as possible. If the selection is non-empty, adds a
// selection to the next line that is long enough for a non-empty selection
// starting at the same column as the current selection to be added to it.
addSelectionBelow () {
return this.expandSelectionsForward(selection => selection.addSelectionBelow())
}
// Add a similarly-shaped selection to the next eligible line above
// each selection.
//
// Operates on all selections. If the selection is empty, adds an empty
// selection to the next preceding non-empty line as close to the current
// selection's column as possible. If the selection is non-empty, adds a
// selection to the next line that is long enough for a non-empty selection
// starting at the same column as the current selection to be added to it.
addSelectionAbove () {
return this.expandSelectionsBackward(selection => selection.addSelectionAbove())
}
// Calls the given function with each selection, then merges selections
expandSelectionsForward (fn) {
this.mergeIntersectingSelections(() => this.getSelections().forEach(fn))
}
// Calls the given function with each selection, then merges selections in the
// reversed orientation
expandSelectionsBackward (fn) {
this.mergeIntersectingSelections({reversed: true}, () => this.getSelections().forEach(fn))
}
finalizeSelections () {
for (let selection of this.getSelections()) { selection.finalize() }
}
selectionsForScreenRows (startRow, endRow) {
return this.getSelections().filter(selection => selection.intersectsScreenRowRange(startRow, endRow))
}
// Merges intersecting selections. If passed a function, it executes
// the function with merging suppressed, then merges intersecting selections
// afterward.
mergeIntersectingSelections (...args) {
return this.mergeSelections(...args, (previousSelection, currentSelection) => {
const exclusive = !currentSelection.isEmpty() && !previousSelection.isEmpty()
return previousSelection.intersectsWith(currentSelection, exclusive)
})
}
mergeSelectionsOnSameRows (...args) {
return this.mergeSelections(...args, (previousSelection, currentSelection) => {
const screenRange = currentSelection.getScreenRange()
return previousSelection.intersectsScreenRowRange(screenRange.start.row, screenRange.end.row)
})
}
avoidMergingSelections (...args) {
return this.mergeSelections(...args, () => false)
}
mergeSelections (...args) {
const mergePredicate = args.pop()
let fn = args.pop()
let options = args.pop()
if (typeof fn !== 'function') {
options = fn
fn = () => {}
}
if (this.suppressSelectionMerging) return fn()
this.suppressSelectionMerging = true
const result = fn()
this.suppressSelectionMerging = false
const selections = this.getSelectionsOrderedByBufferPosition()
let lastSelection = selections.shift()
for (const selection of selections) {
if (mergePredicate(lastSelection, selection)) {
lastSelection.merge(selection, options)
} else {
lastSelection = selection
}
}
return result
}
// Add a {Selection} based on the given {DisplayMarker}.
//
// * `marker` The {DisplayMarker} to highlight
// * `options` (optional) An {Object} that pertains to the {Selection} constructor.
//
// Returns the new {Selection}.
addSelection (marker, options = {}) {
const cursor = this.addCursor(marker)
let selection = new Selection(Object.assign({editor: this, marker, cursor}, options))
this.selections.push(selection)
const selectionBufferRange = selection.getBufferRange()
this.mergeIntersectingSelections({preserveFolds: options.preserveFolds})
if (selection.destroyed) {
for (selection of this.getSelections()) {
if (selection.intersectsBufferRange(selectionBufferRange)) return selection
}
} else {
this.emitter.emit('did-add-cursor', cursor)
this.emitter.emit('did-add-selection', selection)
return selection
}
}
// Remove the given selection.
removeSelection (selection) {
_.remove(this.cursors, selection.cursor)
_.remove(this.selections, selection)
this.cursorsByMarkerId.delete(selection.cursor.marker.id)
this.emitter.emit('did-remove-cursor', selection.cursor)
return this.emitter.emit('did-remove-selection', selection)
}
// Reduce one or more selections to a single empty selection based on the most
// recently added cursor.
clearSelections (options) {
this.consolidateSelections()
this.getLastSelection().clear(options)
}
// Reduce multiple selections to the least recently added selection.
consolidateSelections () {
const selections = this.getSelections()
if (selections.length > 1) {
for (let selection of selections.slice(1, (selections.length))) { selection.destroy() }
selections[0].autoscroll({center: true})
return true
} else {
return false
}
}
// Called by the selection
selectionRangeChanged (event) {
if (this.component) this.component.didChangeSelectionRange()
this.emitter.emit('did-change-selection-range', event)
}
createLastSelectionIfNeeded () {
if (this.selections.length === 0) {
this.addSelectionForBufferRange([[0, 0], [0, 0]], {autoscroll: false, preserveFolds: true})
}
}
/*
Section: Searching and Replacing
*/
// Essential: Scan regular expression matches in the entire buffer, calling the
// given iterator function on each match.
//
// `::scan` functions as the replace method as well via the `replace`
//
// If you're programmatically modifying the results, you may want to try
// {::backwardsScanInBufferRange} to avoid tripping over your own changes.
//
// * `regex` A {RegExp} to search for.
// * `options` (optional) {Object}
// * `leadingContextLineCount` {Number} default `0`; The number of lines
// before the matched line to include in the results object.
// * `trailingContextLineCount` {Number} default `0`; The number of lines
// after the matched line to include in the results object.
// * `iterator` A {Function} that's called on each match
// * `object` {Object}
// * `match` The current regular expression match.
// * `matchText` A {String} with the text of the match.
// * `range` The {Range} of the match.
// * `stop` Call this {Function} to terminate the scan.
// * `replace` Call this {Function} with a {String} to replace the match.
scan (regex, options = {}, iterator) {
if (_.isFunction(options)) {
iterator = options
options = {}
}
return this.buffer.scan(regex, options, iterator)
}
// Essential: Scan regular expression matches in a given range, calling the given
// iterator function on each match.
//
// * `regex` A {RegExp} to search for.
// * `range` A {Range} in which to search.
// * `iterator` A {Function} that's called on each match with an {Object}
// containing the following keys:
// * `match` The current regular expression match.
// * `matchText` A {String} with the text of the match.
// * `range` The {Range} of the match.
// * `stop` Call this {Function} to terminate the scan.
// * `replace` Call this {Function} with a {String} to replace the match.
scanInBufferRange (regex, range, iterator) { return this.buffer.scanInRange(regex, range, iterator) }
// Essential: Scan regular expression matches in a given range in reverse order,
// calling the given iterator function on each match.
//
// * `regex` A {RegExp} to search for.
// * `range` A {Range} in which to search.
// * `iterator` A {Function} that's called on each match with an {Object}
// containing the following keys:
// * `match` The current regular expression match.
// * `matchText` A {String} with the text of the match.
// * `range` The {Range} of the match.
// * `stop` Call this {Function} to terminate the scan.
// * `replace` Call this {Function} with a {String} to replace the match.
backwardsScanInBufferRange (regex, range, iterator) { return this.buffer.backwardsScanInRange(regex, range, iterator) }
/*
Section: Tab Behavior
*/
// Essential: Returns a {Boolean} indicating whether softTabs are enabled for this
// editor.
getSoftTabs () { return this.softTabs }
// Essential: Enable or disable soft tabs for this editor.
//
// * `softTabs` A {Boolean}
setSoftTabs (softTabs) {
this.softTabs = softTabs
this.update({softTabs: this.softTabs})
}
// Returns a {Boolean} indicating whether atomic soft tabs are enabled for this editor.
hasAtomicSoftTabs () { return this.displayLayer.atomicSoftTabs }
// Essential: Toggle soft tabs for this editor
toggleSoftTabs () { this.setSoftTabs(!this.getSoftTabs()) }
// Essential: Get the on-screen length of tab characters.
//
// Returns a {Number}.
getTabLength () { return this.displayLayer.tabLength }
// Essential: Set the on-screen length of tab characters. Setting this to a
// {Number} This will override the `editor.tabLength` setting.
//
// * `tabLength` {Number} length of a single tab. Setting to `null` will
// fallback to using the `editor.tabLength` config setting
setTabLength (tabLength) { this.update({tabLength}) }
// Returns an {Object} representing the current invisible character
// substitutions for this editor. See {::setInvisibles}.
getInvisibles () {
if (!this.mini && this.showInvisibles && (this.invisibles != null)) {
return this.invisibles
} else {
return {}
}
}
doesShowIndentGuide () { return this.showIndentGuide && !this.mini }
getSoftWrapHangingIndentLength () { return this.displayLayer.softWrapHangingIndent }
// Extended: Determine if the buffer uses hard or soft tabs.
//
// Returns `true` if the first non-comment line with leading whitespace starts
// with a space character. Returns `false` if it starts with a hard tab (`\t`).
//
// Returns a {Boolean} or undefined if no non-comment lines had leading
// whitespace.
usesSoftTabs () {
const languageMode = this.buffer.getLanguageMode()
const hasIsRowCommented = languageMode.isRowCommented
for (let bufferRow = 0, end = Math.min(1000, this.buffer.getLastRow()); bufferRow <= end; bufferRow++) {
if (hasIsRowCommented && languageMode.isRowCommented(bufferRow)) continue
const line = this.buffer.lineForRow(bufferRow)
if (line[0] === ' ') return true
if (line[0] === '\t') return false
}
}
// Extended: Get the text representing a single level of indent.
//
// If soft tabs are enabled, the text is composed of N spaces, where N is the
// tab length. Otherwise the text is a tab character (`\t`).
//
// Returns a {String}.
getTabText () { return this.buildIndentString(1) }
// If soft tabs are enabled, convert all hard tabs to soft tabs in the given
// {Range}.
normalizeTabsInBufferRange (bufferRange) {
if (!this.getSoftTabs()) { return }
return this.scanInBufferRange(/\t/g, bufferRange, ({replace}) => replace(this.getTabText()))
}
/*
Section: Soft Wrap Behavior
*/
// Essential: Determine whether lines in this editor are soft-wrapped.
//
// Returns a {Boolean}.
isSoftWrapped () { return this.softWrapped }
// Essential: Enable or disable soft wrapping for this editor.
//
// * `softWrapped` A {Boolean}
//
// Returns a {Boolean}.
setSoftWrapped (softWrapped) {
this.update({softWrapped})
return this.isSoftWrapped()
}
getPreferredLineLength () { return this.preferredLineLength }
// Essential: Toggle soft wrapping for this editor
//
// Returns a {Boolean}.
toggleSoftWrapped () { return this.setSoftWrapped(!this.isSoftWrapped()) }
// Essential: Gets the column at which column will soft wrap
getSoftWrapColumn () {
if (this.isSoftWrapped() && !this.mini) {
if (this.softWrapAtPreferredLineLength) {
return Math.min(this.getEditorWidthInChars(), this.preferredLineLength)
} else {
return this.getEditorWidthInChars()
}
} else {
return this.maxScreenLineLength
}
}
/*
Section: Indentation
*/
// Essential: Get the indentation level of the given buffer row.
//
// Determines how deeply the given row is indented based on the soft tabs and
// tab length settings of this editor. Note that if soft tabs are enabled and
// the tab length is 2, a row with 4 leading spaces would have an indentation
// level of 2.
//
// * `bufferRow` A {Number} indicating the buffer row.
//
// Returns a {Number}.
indentationForBufferRow (bufferRow) {
return this.indentLevelForLine(this.lineTextForBufferRow(bufferRow))
}
// Essential: Set the indentation level for the given buffer row.
//
// Inserts or removes hard tabs or spaces based on the soft tabs and tab length
// settings of this editor in order to bring it to the given indentation level.
// Note that if soft tabs are enabled and the tab length is 2, a row with 4
// leading spaces would have an indentation level of 2.
//
// * `bufferRow` A {Number} indicating the buffer row.
// * `newLevel` A {Number} indicating the new indentation level.
// * `options` (optional) An {Object} with the following keys:
// * `preserveLeadingWhitespace` `true` to preserve any whitespace already at
// the beginning of the line (default: false).
setIndentationForBufferRow (bufferRow, newLevel, {preserveLeadingWhitespace} = {}) {
let endColumn
if (preserveLeadingWhitespace) {
endColumn = 0
} else {
endColumn = this.lineTextForBufferRow(bufferRow).match(/^\s*/)[0].length
}
const newIndentString = this.buildIndentString(newLevel)
return this.buffer.setTextInRange([[bufferRow, 0], [bufferRow, endColumn]], newIndentString)
}
// Extended: Indent rows intersecting selections by one level.
indentSelectedRows () {
return this.mutateSelectedText(selection => selection.indentSelectedRows())
}
// Extended: Outdent rows intersecting selections by one level.
outdentSelectedRows () {
return this.mutateSelectedText(selection => selection.outdentSelectedRows())
}
// Extended: Get the indentation level of the given line of text.
//
// Determines how deeply the given line is indented based on the soft tabs and
// tab length settings of this editor. Note that if soft tabs are enabled and
// the tab length is 2, a row with 4 leading spaces would have an indentation
// level of 2.
//
// * `line` A {String} representing a line of text.
//
// Returns a {Number}.
indentLevelForLine (line) {
const tabLength = this.getTabLength()
let indentLength = 0
for (let i = 0, {length} = line; i < length; i++) {
const char = line[i]
if (char === '\t') {
indentLength += tabLength - (indentLength % tabLength)
} else if (char === ' ') {
indentLength++
} else {
break
}
}
return indentLength / tabLength
}
// Extended: Indent rows intersecting selections based on the grammar's suggested
// indent level.
autoIndentSelectedRows () {
return this.mutateSelectedText(selection => selection.autoIndentSelectedRows())
}
// Indent all lines intersecting selections. See {Selection::indent} for more
// information.
indent (options = {}) {
if (options.autoIndent == null) options.autoIndent = this.shouldAutoIndent()
this.mutateSelectedText(selection => selection.indent(options))
}
// Constructs the string used for indents.
buildIndentString (level, column = 0) {
if (this.getSoftTabs()) {
const tabStopViolation = column % this.getTabLength()
return _.multiplyString(' ', Math.floor(level * this.getTabLength()) - tabStopViolation)
} else {
const excessWhitespace = _.multiplyString(' ', Math.round((level - Math.floor(level)) * this.getTabLength()))
return _.multiplyString('\t', Math.floor(level)) + excessWhitespace
}
}
/*
Section: Grammars
*/
// Essential: Get the current {Grammar} of this editor.
getGrammar () {
const languageMode = this.buffer.getLanguageMode()
return languageMode.getGrammar && languageMode.getGrammar() || NullGrammar
}
// Deprecated: Set the current {Grammar} of this editor.
//
// Assigning a grammar will cause the editor to re-tokenize based on the new
// grammar.
//
// * `grammar` {Grammar}
setGrammar (grammar) {
const buffer = this.getBuffer()
buffer.setLanguageMode(atom.grammars.languageModeForGrammarAndBuffer(grammar, buffer))
}
// Experimental: Get a notification when async tokenization is completed.
onDidTokenize (callback) {
return this.emitter.on('did-tokenize', callback)
}
/*
Section: Managing Syntax Scopes
*/
// Essential: Returns a {ScopeDescriptor} that includes this editor's language.
// e.g. `['.source.ruby']`, or `['.source.coffee']`. You can use this with
// {Config::get} to get language specific config values.
getRootScopeDescriptor () {
return this.buffer.getLanguageMode().rootScopeDescriptor
}
// Essential: Get the syntactic scopeDescriptor for the given position in buffer
// coordinates. Useful with {Config::get}.
//
// For example, if called with a position inside the parameter list of an
// anonymous CoffeeScript function, the method returns the following array:
// `["source.coffee", "meta.inline.function.coffee", "variable.parameter.function.coffee"]`
//
// * `bufferPosition` A {Point} or {Array} of [row, column].
//
// Returns a {ScopeDescriptor}.
scopeDescriptorForBufferPosition (bufferPosition) {
return this.buffer.getLanguageMode().scopeDescriptorForPosition(bufferPosition)
}
// Extended: Get the range in buffer coordinates of all tokens surrounding the
// cursor that match the given scope selector.
//
// For example, if you wanted to find the string surrounding the cursor, you
// could call `editor.bufferRangeForScopeAtCursor(".string.quoted")`.
//
// * `scopeSelector` {String} selector. e.g. `'.source.ruby'`
//
// Returns a {Range}.
bufferRangeForScopeAtCursor (scopeSelector) {
return this.bufferRangeForScopeAtPosition(scopeSelector, this.getCursorBufferPosition())
}
bufferRangeForScopeAtPosition (scopeSelector, position) {
return this.buffer.getLanguageMode().bufferRangeForScopeAtPosition(scopeSelector, position)
}
// Extended: Determine if the given row is entirely a comment
isBufferRowCommented (bufferRow) {
const match = this.lineTextForBufferRow(bufferRow).match(/\S/)
if (match) {
if (!this.commentScopeSelector) this.commentScopeSelector = new TextMateScopeSelector('comment.*')
return this.commentScopeSelector.matches(this.scopeDescriptorForBufferPosition([bufferRow, match.index]).scopes)
}
}
// Get the scope descriptor at the cursor.
getCursorScope () {
return this.getLastCursor().getScopeDescriptor()
}
tokenForBufferPosition (bufferPosition) {
return this.buffer.getLanguageMode().tokenForPosition(bufferPosition)
}
/*
Section: Clipboard Operations
*/
// Essential: For each selection, copy the selected text.
copySelectedText () {
let maintainClipboard = false
for (let selection of this.getSelectionsOrderedByBufferPosition()) {
if (selection.isEmpty()) {
const previousRange = selection.getBufferRange()
selection.selectLine()
selection.copy(maintainClipboard, true)
selection.setBufferRange(previousRange)
} else {
selection.copy(maintainClipboard, false)
}
maintainClipboard = true
}
}
// Private: For each selection, only copy highlighted text.
copyOnlySelectedText () {
let maintainClipboard = false
for (let selection of this.getSelectionsOrderedByBufferPosition()) {
if (!selection.isEmpty()) {
selection.copy(maintainClipboard, false)
maintainClipboard = true
}
}
}
// Essential: For each selection, cut the selected text.
cutSelectedText () {
let maintainClipboard = false
this.mutateSelectedText(selection => {
if (selection.isEmpty()) {
selection.selectLine()
selection.cut(maintainClipboard, true)
} else {
selection.cut(maintainClipboard, false)
}
maintainClipboard = true
})
}
// Essential: For each selection, replace the selected text with the contents of
// the clipboard.
//
// If the clipboard contains the same number of selections as the current
// editor, each selection will be replaced with the content of the
// corresponding clipboard selection text.
//
// * `options` (optional) See {Selection::insertText}.
pasteText (options) {
options = Object.assign({}, options)
let {text: clipboardText, metadata} = this.constructor.clipboard.readWithMetadata()
if (!this.emitWillInsertTextEvent(clipboardText)) return false
if (!metadata) metadata = {}
if (options.autoIndent == null) options.autoIndent = this.shouldAutoIndentOnPaste()
this.mutateSelectedText((selection, index) => {
let fullLine, indentBasis, text
if (metadata.selections && metadata.selections.length === this.getSelections().length) {
({text, indentBasis, fullLine} = metadata.selections[index])
} else {
({indentBasis, fullLine} = metadata)
text = clipboardText
}
if (indentBasis != null && (text.includes('\n') || !selection.cursor.hasPrecedingCharactersOnLine())) {
options.indentBasis = indentBasis
} else {
options.indentBasis = null
}
let range
if (fullLine && selection.isEmpty()) {
const oldPosition = selection.getBufferRange().start
selection.setBufferRange([[oldPosition.row, 0], [oldPosition.row, 0]])
range = selection.insertText(text, options)
const newPosition = oldPosition.translate([1, 0])
selection.setBufferRange([newPosition, newPosition])
} else {
range = selection.insertText(text, options)
}
this.emitter.emit('did-insert-text', {text, range})
})
}
// Essential: For each selection, if the selection is empty, cut all characters
// of the containing screen line following the cursor. Otherwise cut the selected
// text.
cutToEndOfLine () {
let maintainClipboard = false
this.mutateSelectedText(selection => {
selection.cutToEndOfLine(maintainClipboard)
maintainClipboard = true
})
}
// Essential: For each selection, if the selection is empty, cut all characters
// of the containing buffer line following the cursor. Otherwise cut the
// selected text.
cutToEndOfBufferLine () {
let maintainClipboard = false
this.mutateSelectedText(selection => {
selection.cutToEndOfBufferLine(maintainClipboard)
maintainClipboard = true
})
}
/*
Section: Folds
*/
// Essential: Fold the most recent cursor's row based on its indentation level.
//
// The fold will extend from the nearest preceding line with a lower
// indentation level up to the nearest following row with a lower indentation
// level.
foldCurrentRow () {
const {row} = this.getCursorBufferPosition()
const languageMode = this.buffer.getLanguageMode()
const range = (
languageMode.getFoldableRangeContainingPoint &&
languageMode.getFoldableRangeContainingPoint(Point(row, Infinity), this.getTabLength())
)
if (range) return this.displayLayer.foldBufferRange(range)
}
// Essential: Unfold the most recent cursor's row by one level.
unfoldCurrentRow () {
const {row} = this.getCursorBufferPosition()
return this.displayLayer.destroyFoldsContainingBufferPositions([Point(row, Infinity)], false)
}
// Essential: Fold the given row in buffer coordinates based on its indentation
// level.
//
// If the given row is foldable, the fold will begin there. Otherwise, it will
// begin at the first foldable row preceding the given row.
//
// * `bufferRow` A {Number}.
foldBufferRow (bufferRow) {
let position = Point(bufferRow, Infinity)
const languageMode = this.buffer.getLanguageMode()
while (true) {
const foldableRange = (
languageMode.getFoldableRangeContainingPoint &&
languageMode.getFoldableRangeContainingPoint(position, this.getTabLength())
)
if (foldableRange) {
const existingFolds = this.displayLayer.foldsIntersectingBufferRange(Range(foldableRange.start, foldableRange.start))
if (existingFolds.length === 0) {
this.displayLayer.foldBufferRange(foldableRange)
} else {
const firstExistingFoldRange = this.displayLayer.bufferRangeForFold(existingFolds[0])
if (firstExistingFoldRange.start.isLessThan(position)) {
position = Point(firstExistingFoldRange.start.row, 0)
continue
}
}
}
break
}
}
// Essential: Unfold all folds containing the given row in buffer coordinates.
//
// * `bufferRow` A {Number}
unfoldBufferRow (bufferRow) {
const position = Point(bufferRow, Infinity)
return this.displayLayer.destroyFoldsContainingBufferPositions([position])
}
// Extended: For each selection, fold the rows it intersects.
foldSelectedLines () {
for (let selection of this.selections) {
selection.fold()
}
}
// Extended: Fold all foldable lines.
foldAll () {
const languageMode = this.buffer.getLanguageMode()
const foldableRanges = (
languageMode.getFoldableRanges &&
languageMode.getFoldableRanges(this.getTabLength())
)
this.displayLayer.destroyAllFolds()
for (let range of foldableRanges || []) {
this.displayLayer.foldBufferRange(range)
}
}
// Extended: Unfold all existing folds.
unfoldAll () {
const result = this.displayLayer.destroyAllFolds()
this.scrollToCursorPosition()
return result
}
// Extended: Fold all foldable lines at the given indent level.
//
// * `level` A {Number}.
foldAllAtIndentLevel (level) {
const languageMode = this.buffer.getLanguageMode()
const foldableRanges = (
languageMode.getFoldableRangesAtIndentLevel &&
languageMode.getFoldableRangesAtIndentLevel(level, this.getTabLength())
)
this.displayLayer.destroyAllFolds()
for (let range of foldableRanges || []) {
this.displayLayer.foldBufferRange(range)
}
}
// Extended: Determine whether the given row in buffer coordinates is foldable.
//
// A *foldable* row is a row that *starts* a row range that can be folded.
//
// * `bufferRow` A {Number}
//
// Returns a {Boolean}.
isFoldableAtBufferRow (bufferRow) {
const languageMode = this.buffer.getLanguageMode()
return languageMode.isFoldableAtRow && languageMode.isFoldableAtRow(bufferRow)
}
// Extended: Determine whether the given row in screen coordinates is foldable.
//
// A *foldable* row is a row that *starts* a row range that can be folded.
//
// * `bufferRow` A {Number}
//
// Returns a {Boolean}.
isFoldableAtScreenRow (screenRow) {
return this.isFoldableAtBufferRow(this.bufferRowForScreenRow(screenRow))
}
// Extended: Fold the given buffer row if it isn't currently folded, and unfold
// it otherwise.
toggleFoldAtBufferRow (bufferRow) {
if (this.isFoldedAtBufferRow(bufferRow)) {
return this.unfoldBufferRow(bufferRow)
} else {
return this.foldBufferRow(bufferRow)
}
}
// Extended: Determine whether the most recently added cursor's row is folded.
//
// Returns a {Boolean}.
isFoldedAtCursorRow () {
return this.isFoldedAtBufferRow(this.getCursorBufferPosition().row)
}
// Extended: Determine whether the given row in buffer coordinates is folded.
//
// * `bufferRow` A {Number}
//
// Returns a {Boolean}.
isFoldedAtBufferRow (bufferRow) {
const range = Range(
Point(bufferRow, 0),
Point(bufferRow, this.buffer.lineLengthForRow(bufferRow))
)
return this.displayLayer.foldsIntersectingBufferRange(range).length > 0
}
// Extended: Determine whether the given row in screen coordinates is folded.
//
// * `screenRow` A {Number}
//
// Returns a {Boolean}.
isFoldedAtScreenRow (screenRow) {
return this.isFoldedAtBufferRow(this.bufferRowForScreenRow(screenRow))
}
// Creates a new fold between two row numbers.
//
// startRow - The row {Number} to start folding at
// endRow - The row {Number} to end the fold
//
// Returns the new {Fold}.
foldBufferRowRange (startRow, endRow) {
return this.foldBufferRange(Range(Point(startRow, Infinity), Point(endRow, Infinity)))
}
foldBufferRange (range) {
return this.displayLayer.foldBufferRange(range)
}
// Remove any {Fold}s found that intersect the given buffer range.
destroyFoldsIntersectingBufferRange (bufferRange) {
return this.displayLayer.destroyFoldsIntersectingBufferRange(bufferRange)
}
// Remove any {Fold}s found that contain the given array of buffer positions.
destroyFoldsContainingBufferPositions (bufferPositions, excludeEndpoints) {
return this.displayLayer.destroyFoldsContainingBufferPositions(bufferPositions, excludeEndpoints)
}
/*
Section: Gutters
*/
// Essential: Add a custom {Gutter}.
//
// * `options` An {Object} with the following fields:
// * `name` (required) A unique {String} to identify this gutter.
// * `priority` (optional) A {Number} that determines stacking order between
// gutters. Lower priority items are forced closer to the edges of the
// window. (default: -100)
// * `visible` (optional) {Boolean} specifying whether the gutter is visible
// initially after being created. (default: true)
//
// Returns the newly-created {Gutter}.
addGutter (options) {
return this.gutterContainer.addGutter(options)
}
// Essential: Get this editor's gutters.
//
// Returns an {Array} of {Gutter}s.
getGutters () {
return this.gutterContainer.getGutters()
}
getLineNumberGutter () {
return this.lineNumberGutter
}
// Essential: Get the gutter with the given name.
//
// Returns a {Gutter}, or `null` if no gutter exists for the given name.
gutterWithName (name) {
return this.gutterContainer.gutterWithName(name)
}
/*
Section: Scrolling the TextEditor
*/
// Essential: Scroll the editor to reveal the most recently added cursor if it is
// off-screen.
//
// * `options` (optional) {Object}
// * `center` Center the editor around the cursor if possible. (default: true)
scrollToCursorPosition (options) {
this.getLastCursor().autoscroll({center: options && options.center !== false})
}
// Essential: Scrolls the editor to the given buffer position.
//
// * `bufferPosition` An object that represents a buffer position. It can be either
// an {Object} (`{row, column}`), {Array} (`[row, column]`), or {Point}
// * `options` (optional) {Object}
// * `center` Center the editor around the position if possible. (default: false)
scrollToBufferPosition (bufferPosition, options) {
return this.scrollToScreenPosition(this.screenPositionForBufferPosition(bufferPosition), options)
}
// Essential: Scrolls the editor to the given screen position.
//
// * `screenPosition` An object that represents a screen position. It can be either
// an {Object} (`{row, column}`), {Array} (`[row, column]`), or {Point}
// * `options` (optional) {Object}
// * `center` Center the editor around the position if possible. (default: false)
scrollToScreenPosition (screenPosition, options) {
this.scrollToScreenRange(new Range(screenPosition, screenPosition), options)
}
scrollToTop () {
Grim.deprecate('This is now a view method. Call TextEditorElement::scrollToTop instead.')
this.getElement().scrollToTop()
}
scrollToBottom () {
Grim.deprecate('This is now a view method. Call TextEditorElement::scrollToTop instead.')
this.getElement().scrollToBottom()
}
scrollToScreenRange (screenRange, options = {}) {
if (options.clip !== false) screenRange = this.clipScreenRange(screenRange)
const scrollEvent = {screenRange, options}
if (this.component) this.component.didRequestAutoscroll(scrollEvent)
this.emitter.emit('did-request-autoscroll', scrollEvent)
}
getHorizontalScrollbarHeight () {
Grim.deprecate('This is now a view method. Call TextEditorElement::getHorizontalScrollbarHeight instead.')
return this.getElement().getHorizontalScrollbarHeight()
}
getVerticalScrollbarWidth () {
Grim.deprecate('This is now a view method. Call TextEditorElement::getVerticalScrollbarWidth instead.')
return this.getElement().getVerticalScrollbarWidth()
}
pageUp () {
this.moveUp(this.getRowsPerPage())
}
pageDown () {
this.moveDown(this.getRowsPerPage())
}
selectPageUp () {
this.selectUp(this.getRowsPerPage())
}
selectPageDown () {
this.selectDown(this.getRowsPerPage())
}
// Returns the number of rows per page
getRowsPerPage () {
if (this.component) {
const clientHeight = this.component.getScrollContainerClientHeight()
const lineHeight = this.component.getLineHeight()
return Math.max(1, Math.ceil(clientHeight / lineHeight))
} else {
return 1
}
}
/*
Section: Config
*/
// Experimental: Is auto-indentation enabled for this editor?
//
// Returns a {Boolean}.
shouldAutoIndent () { return this.autoIndent }
// Experimental: Is auto-indentation on paste enabled for this editor?
//
// Returns a {Boolean}.
shouldAutoIndentOnPaste () { return this.autoIndentOnPaste }
// Experimental: Does this editor allow scrolling past the last line?
//
// Returns a {Boolean}.
getScrollPastEnd () {
if (this.getAutoHeight()) {
return false
} else {
return this.scrollPastEnd
}
}
// Experimental: How fast does the editor scroll in response to mouse wheel
// movements?
//
// Returns a positive {Number}.
getScrollSensitivity () { return this.scrollSensitivity }
// Experimental: Does this editor show cursors while there is a selection?
//
// Returns a positive {Boolean}.
getShowCursorOnSelection () { return this.showCursorOnSelection }
// Experimental: Are line numbers enabled for this editor?
//
// Returns a {Boolean}
doesShowLineNumbers () { return this.showLineNumbers }
// Experimental: Get the time interval within which text editing operations
// are grouped together in the editor's undo history.
//
// Returns the time interval {Number} in milliseconds.
getUndoGroupingInterval () { return this.undoGroupingInterval }
// Experimental: Get the characters that are *not* considered part of words,
// for the purpose of word-based cursor movements.
//
// Returns a {String} containing the non-word characters.
getNonWordCharacters (position) {
const languageMode = this.buffer.getLanguageMode()
return (
languageMode.getNonWordCharacters &&
languageMode.getNonWordCharacters(position || Point(0, 0))
) || DEFAULT_NON_WORD_CHARACTERS
}
/*
Section: Event Handlers
*/
handleLanguageModeChange () {
this.unfoldAll()
if (this.languageModeSubscription) {
this.languageModeSubscription.dispose()
this.disposables.remove(this.languageModeSubscription)
}
const languageMode = this.buffer.getLanguageMode()
if (this.component && this.component.visible && languageMode.startTokenizing) {
languageMode.startTokenizing()
}
this.languageModeSubscription = languageMode.onDidTokenize && languageMode.onDidTokenize(() => {
this.emitter.emit('did-tokenize')
})
if (this.languageModeSubscription) this.disposables.add(this.languageModeSubscription)
this.emitter.emit('did-change-grammar', languageMode.grammar)
}
/*
Section: TextEditor Rendering
*/
// Get the Element for the editor.
getElement () {
if (!this.component) {
if (!TextEditorComponent) TextEditorComponent = require("../src/text-editor-component.js")
if (!TextEditorElement) TextEditorElement = require("../src/text-editor-element.js")
this.component = new TextEditorComponent({
model: this,
updatedSynchronously: TextEditorElement.prototype.updatedSynchronously,
initialScrollTopRow: this.initialScrollTopRow,
initialScrollLeftColumn: this.initialScrollLeftColumn
})
}
return this.component.element
}
getAllowedLocations () {
return ['center']
}
// Essential: Retrieves the greyed out placeholder of a mini editor.
//
// Returns a {String}.
getPlaceholderText () { return this.placeholderText }
// Essential: Set the greyed out placeholder of a mini editor. Placeholder text
// will be displayed when the editor has no content.
//
// * `placeholderText` {String} text that is displayed when the editor has no content.
setPlaceholderText (placeholderText) { this.update({placeholderText}) }
pixelPositionForBufferPosition (bufferPosition) {
Grim.deprecate('This method is deprecated on the model layer. Use `TextEditorElement::pixelPositionForBufferPosition` instead')
return this.getElement().pixelPositionForBufferPosition(bufferPosition)
}
pixelPositionForScreenPosition (screenPosition) {
Grim.deprecate('This method is deprecated on the model layer. Use `TextEditorElement::pixelPositionForScreenPosition` instead')
return this.getElement().pixelPositionForScreenPosition(screenPosition)
}
getVerticalScrollMargin () {
const maxScrollMargin = Math.floor(((this.height / this.getLineHeightInPixels()) - 1) / 2)
return Math.min(this.verticalScrollMargin, maxScrollMargin)
}
setVerticalScrollMargin (verticalScrollMargin) {
this.verticalScrollMargin = verticalScrollMargin
return this.verticalScrollMargin
}
getHorizontalScrollMargin () {
return Math.min(this.horizontalScrollMargin, Math.floor(((this.width / this.getDefaultCharWidth()) - 1) / 2))
}
setHorizontalScrollMargin (horizontalScrollMargin) {
this.horizontalScrollMargin = horizontalScrollMargin
return this.horizontalScrollMargin
}
getLineHeightInPixels () { return this.lineHeightInPixels }
setLineHeightInPixels (lineHeightInPixels) {
this.lineHeightInPixels = lineHeightInPixels
return this.lineHeightInPixels
}
getKoreanCharWidth () { return this.koreanCharWidth }
getHalfWidthCharWidth () { return this.halfWidthCharWidth }
getDoubleWidthCharWidth () { return this.doubleWidthCharWidth }
getDefaultCharWidth () { return this.defaultCharWidth }
ratioForCharacter (character) {
if (isKoreanCharacter(character)) {
return this.getKoreanCharWidth() / this.getDefaultCharWidth()
} else if (isHalfWidthCharacter(character)) {
return this.getHalfWidthCharWidth() / this.getDefaultCharWidth()
} else if (isDoubleWidthCharacter(character)) {
return this.getDoubleWidthCharWidth() / this.getDefaultCharWidth()
} else {
return 1
}
}
setDefaultCharWidth (defaultCharWidth, doubleWidthCharWidth, halfWidthCharWidth, koreanCharWidth) {
if (doubleWidthCharWidth == null) { doubleWidthCharWidth = defaultCharWidth }
if (halfWidthCharWidth == null) { halfWidthCharWidth = defaultCharWidth }
if (koreanCharWidth == null) { koreanCharWidth = defaultCharWidth }
if (defaultCharWidth !== this.defaultCharWidth ||
(doubleWidthCharWidth !== this.doubleWidthCharWidth &&
halfWidthCharWidth !== this.halfWidthCharWidth &&
koreanCharWidth !== this.koreanCharWidth)) {
this.defaultCharWidth = defaultCharWidth
this.doubleWidthCharWidth = doubleWidthCharWidth
this.halfWidthCharWidth = halfWidthCharWidth
this.koreanCharWidth = koreanCharWidth
if (this.isSoftWrapped()) {
this.displayLayer.reset({
softWrapColumn: this.getSoftWrapColumn()
})
}
}
return defaultCharWidth
}
setHeight (height) {
Grim.deprecate('This is now a view method. Call TextEditorElement::setHeight instead.')
this.getElement().setHeight(height)
}
getHeight () {
Grim.deprecate('This is now a view method. Call TextEditorElement::getHeight instead.')
return this.getElement().getHeight()
}
getAutoHeight () { return this.autoHeight != null ? this.autoHeight : true }
getAutoWidth () { return this.autoWidth != null ? this.autoWidth : false }
setWidth (width) {
Grim.deprecate('This is now a view method. Call TextEditorElement::setWidth instead.')
this.getElement().setWidth(width)
}
getWidth () {
Grim.deprecate('This is now a view method. Call TextEditorElement::getWidth instead.')
return this.getElement().getWidth()
}
// Use setScrollTopRow instead of this method
setFirstVisibleScreenRow (screenRow) {
this.setScrollTopRow(screenRow)
}
getFirstVisibleScreenRow () {
return this.getElement().component.getFirstVisibleRow()
}
getLastVisibleScreenRow () {
return this.getElement().component.getLastVisibleRow()
}
getVisibleRowRange () {
return [this.getFirstVisibleScreenRow(), this.getLastVisibleScreenRow()]
}
// Use setScrollLeftColumn instead of this method
setFirstVisibleScreenColumn (column) {
return this.setScrollLeftColumn(column)
}
getFirstVisibleScreenColumn () {
return this.getElement().component.getFirstVisibleColumn()
}
getScrollTop () {
Grim.deprecate('This is now a view method. Call TextEditorElement::getScrollTop instead.')
return this.getElement().getScrollTop()
}
setScrollTop (scrollTop) {
Grim.deprecate('This is now a view method. Call TextEditorElement::setScrollTop instead.')
this.getElement().setScrollTop(scrollTop)
}
getScrollBottom () {
Grim.deprecate('This is now a view method. Call TextEditorElement::getScrollBottom instead.')
return this.getElement().getScrollBottom()
}
setScrollBottom (scrollBottom) {
Grim.deprecate('This is now a view method. Call TextEditorElement::setScrollBottom instead.')
this.getElement().setScrollBottom(scrollBottom)
}
getScrollLeft () {
Grim.deprecate('This is now a view method. Call TextEditorElement::getScrollLeft instead.')
return this.getElement().getScrollLeft()
}
setScrollLeft (scrollLeft) {
Grim.deprecate('This is now a view method. Call TextEditorElement::setScrollLeft instead.')
this.getElement().setScrollLeft(scrollLeft)
}
getScrollRight () {
Grim.deprecate('This is now a view method. Call TextEditorElement::getScrollRight instead.')
return this.getElement().getScrollRight()
}
setScrollRight (scrollRight) {
Grim.deprecate('This is now a view method. Call TextEditorElement::setScrollRight instead.')
this.getElement().setScrollRight(scrollRight)
}
getScrollHeight () {
Grim.deprecate('This is now a view method. Call TextEditorElement::getScrollHeight instead.')
return this.getElement().getScrollHeight()
}
getScrollWidth () {
Grim.deprecate('This is now a view method. Call TextEditorElement::getScrollWidth instead.')
return this.getElement().getScrollWidth()
}
getMaxScrollTop () {
Grim.deprecate('This is now a view method. Call TextEditorElement::getMaxScrollTop instead.')
return this.getElement().getMaxScrollTop()
}
getScrollTopRow () {
return this.getElement().component.getScrollTopRow()
}
setScrollTopRow (scrollTopRow) {
this.getElement().component.setScrollTopRow(scrollTopRow)
}
getScrollLeftColumn () {
return this.getElement().component.getScrollLeftColumn()
}
setScrollLeftColumn (scrollLeftColumn) {
this.getElement().component.setScrollLeftColumn(scrollLeftColumn)
}
intersectsVisibleRowRange (startRow, endRow) {
Grim.deprecate('This is now a view method. Call TextEditorElement::intersectsVisibleRowRange instead.')
return this.getElement().intersectsVisibleRowRange(startRow, endRow)
}
selectionIntersectsVisibleRowRange (selection) {
Grim.deprecate('This is now a view method. Call TextEditorElement::selectionIntersectsVisibleRowRange instead.')
return this.getElement().selectionIntersectsVisibleRowRange(selection)
}
screenPositionForPixelPosition (pixelPosition) {
Grim.deprecate('This is now a view method. Call TextEditorElement::screenPositionForPixelPosition instead.')
return this.getElement().screenPositionForPixelPosition(pixelPosition)
}
pixelRectForScreenRange (screenRange) {
Grim.deprecate('This is now a view method. Call TextEditorElement::pixelRectForScreenRange instead.')
return this.getElement().pixelRectForScreenRange(screenRange)
}
/*
Section: Utility
*/
inspect () {
return `<TextEditor ${this.id}>`
}
emitWillInsertTextEvent (text) {
let result = true
const cancel = () => { result = false }
this.emitter.emit('will-insert-text', {cancel, text})
return result
}
/*
Section: Language Mode Delegated Methods
*/
suggestedIndentForBufferRow (bufferRow, options) {
const languageMode = this.buffer.getLanguageMode()
return (
languageMode.suggestedIndentForBufferRow &&
languageMode.suggestedIndentForBufferRow(bufferRow, this.getTabLength(), options)
)
}
// Given a buffer row, indent it.
//
// * bufferRow - The row {Number}.
// * options - An options {Object} to pass through to {TextEditor::setIndentationForBufferRow}.
autoIndentBufferRow (bufferRow, options) {
const indentLevel = this.suggestedIndentForBufferRow(bufferRow, options)
return this.setIndentationForBufferRow(bufferRow, indentLevel, options)
}
// Indents all the rows between two buffer row numbers.
//
// * startRow - The row {Number} to start at
// * endRow - The row {Number} to end at
autoIndentBufferRows (startRow, endRow) {
let row = startRow
while (row <= endRow) {
this.autoIndentBufferRow(row)
row++
}
}
autoDecreaseIndentForBufferRow (bufferRow) {
const languageMode = this.buffer.getLanguageMode()
const indentLevel = (
languageMode.suggestedIndentForEditedBufferRow &&
languageMode.suggestedIndentForEditedBufferRow(bufferRow, this.getTabLength())
)
if (indentLevel != null) this.setIndentationForBufferRow(bufferRow, indentLevel)
}
toggleLineCommentForBufferRow (row) { this.toggleLineCommentsForBufferRows(row, row) }
toggleLineCommentsForBufferRows (start, end) {
const languageMode = this.buffer.getLanguageMode()
let {commentStartString, commentEndString} =
languageMode.commentStringsForPosition &&
languageMode.commentStringsForPosition(Point(start, 0)) || {}
if (!commentStartString) return
commentStartString = commentStartString.trim()
if (commentEndString) {
commentEndString = commentEndString.trim()
const startDelimiterColumnRange = columnRangeForStartDelimiter(
this.buffer.lineForRow(start),
commentStartString
)
if (startDelimiterColumnRange) {
const endDelimiterColumnRange = columnRangeForEndDelimiter(
this.buffer.lineForRow(end),
commentEndString
)
if (endDelimiterColumnRange) {
this.buffer.transact(() => {
this.buffer.delete([[end, endDelimiterColumnRange[0]], [end, endDelimiterColumnRange[1]]])
this.buffer.delete([[start, startDelimiterColumnRange[0]], [start, startDelimiterColumnRange[1]]])
})
}
} else {
this.buffer.transact(() => {
const indentLength = this.buffer.lineForRow(start).match(/^\s*/)[0].length
this.buffer.insert([start, indentLength], commentStartString + ' ')
this.buffer.insert([end, this.buffer.lineLengthForRow(end)], ' ' + commentEndString)
})
}
} else {
let hasCommentedLines = false
let hasUncommentedLines = false
for (let row = start; row <= end; row++) {
const line = this.buffer.lineForRow(row)
if (NON_WHITESPACE_REGEXP.test(line)) {
if (columnRangeForStartDelimiter(line, commentStartString)) {
hasCommentedLines = true
} else {
hasUncommentedLines = true
}
}
}
const shouldUncomment = hasCommentedLines && !hasUncommentedLines
if (shouldUncomment) {
for (let row = start; row <= end; row++) {
const columnRange = columnRangeForStartDelimiter(
this.buffer.lineForRow(row),
commentStartString
)
if (columnRange) this.buffer.delete([[row, columnRange[0]], [row, columnRange[1]]])
}
} else {
let minIndentLevel = Infinity
let minBlankIndentLevel = Infinity
for (let row = start; row <= end; row++) {
const line = this.buffer.lineForRow(row)
const indentLevel = this.indentLevelForLine(line)
if (NON_WHITESPACE_REGEXP.test(line)) {
if (indentLevel < minIndentLevel) minIndentLevel = indentLevel
} else {
if (indentLevel < minBlankIndentLevel) minBlankIndentLevel = indentLevel
}
}
minIndentLevel = Number.isFinite(minIndentLevel)
? minIndentLevel
: Number.isFinite(minBlankIndentLevel)
? minBlankIndentLevel
: 0
const indentString = this.buildIndentString(minIndentLevel)
for (let row = start; row <= end; row++) {
const line = this.buffer.lineForRow(row)
if (NON_WHITESPACE_REGEXP.test(line)) {
const indentColumn = columnForIndentLevel(line, minIndentLevel, this.getTabLength())
this.buffer.insert(Point(row, indentColumn), commentStartString + ' ')
} else {
this.buffer.setTextInRange(
new Range(new Point(row, 0), new Point(row, Infinity)),
indentString + commentStartString + ' '
)
}
}
}
}
}
rowRangeForParagraphAtBufferRow (bufferRow) {
if (!NON_WHITESPACE_REGEXP.test(this.lineTextForBufferRow(bufferRow))) return
const languageMode = this.buffer.getLanguageMode()
const isCommented = languageMode.isRowCommented(bufferRow)
let startRow = bufferRow
while (startRow > 0) {
if (!NON_WHITESPACE_REGEXP.test(this.lineTextForBufferRow(startRow - 1))) break
if (languageMode.isRowCommented(startRow - 1) !== isCommented) break
startRow--
}
let endRow = bufferRow
const rowCount = this.getLineCount()
while (endRow < rowCount) {
if (!NON_WHITESPACE_REGEXP.test(this.lineTextForBufferRow(endRow + 1))) break
if (languageMode.isRowCommented(endRow + 1) !== isCommented) break
endRow++
}
return new Range(new Point(startRow, 0), new Point(endRow, this.buffer.lineLengthForRow(endRow)))
}
}
function columnForIndentLevel (line, indentLevel, tabLength) {
let column = 0
let indentLength = 0
const goalIndentLength = indentLevel * tabLength
while (indentLength < goalIndentLength) {
const char = line[column]
if (char === '\t') {
indentLength += tabLength - (indentLength % tabLength)
} else if (char === ' ') {
indentLength++
} else {
break
}
column++
}
return column
}
function columnRangeForStartDelimiter (line, delimiter) {
const startColumn = line.search(NON_WHITESPACE_REGEXP)
if (startColumn === -1) return null
if (!line.startsWith(delimiter, startColumn)) return null
let endColumn = startColumn + delimiter.length
if (line[endColumn] === ' ') endColumn++
return [startColumn, endColumn]
}
function columnRangeForEndDelimiter (line, delimiter) {
let startColumn = line.lastIndexOf(delimiter)
if (startColumn === -1) return null
const endColumn = startColumn + delimiter.length
if (NON_WHITESPACE_REGEXP.test(line.slice(endColumn))) return null
if (line[startColumn - 1] === ' ') startColumn--
return [startColumn, endColumn]
}
class ChangeEvent {
constructor ({oldRange, newRange}) {
this.oldRange = oldRange
this.newRange = newRange
}
get start () {
return this.newRange.start
}
get oldExtent () {
return this.oldRange.getExtent()
}
get newExtent () {
return this.newRange.getExtent()
}
}
},
"../src/text-editor-component.js": function (exports, module, __filename, __dirname, require, define) {
/* global ResizeObserver */
const etch = require("../node_modules/etch/lib/index.js")
const {Point, Range} = require("../node_modules/text-buffer/lib/text-buffer.js")
const LineTopIndex = require("../node_modules/line-top-index/dist/line-top-index.js")
const TextEditor = require("../src/text-editor.js")
const {isPairedCharacter} = require("../src/text-utils.js")
let clipboard;
function get_clipboard() {
return clipboard = clipboard || require("../src/safe-clipboard.js");
}
let electron;
function get_electron() {
return electron = electron || require('electron');
}
const $ = etch.dom
let TextEditorElement
const DEFAULT_ROWS_PER_TILE = 6
const NORMAL_WIDTH_CHARACTER = 'x'
const DOUBLE_WIDTH_CHARACTER = '我'
const HALF_WIDTH_CHARACTER = 'ハ'
const KOREAN_CHARACTER = '세'
const NBSP_CHARACTER = '\u00a0'
const ZERO_WIDTH_NBSP_CHARACTER = '\ufeff'
const MOUSE_DRAG_AUTOSCROLL_MARGIN = 40
const CURSOR_BLINK_RESUME_DELAY = 300
const CURSOR_BLINK_PERIOD = 800
function scaleMouseDragAutoscrollDelta (delta) {
return Math.pow(delta / 3, 3) / 280
}
module.exports =
class TextEditorComponent {
static setScheduler (scheduler) {
etch.setScheduler(scheduler)
}
static getScheduler () {
return etch.getScheduler()
}
static didUpdateStyles () {
if (this.attachedComponents) {
this.attachedComponents.forEach((component) => {
component.didUpdateStyles()
})
}
}
static didUpdateScrollbarStyles () {
if (this.attachedComponents) {
this.attachedComponents.forEach((component) => {
component.didUpdateScrollbarStyles()
})
}
}
constructor (props) {
this.props = props
if (!props.model) {
props.model = new TextEditor({mini: props.mini})
}
this.props.model.component = this
if (props.element) {
this.element = props.element
} else {
if (!TextEditorElement) TextEditorElement = require("../src/text-editor-element.js")
this.element = new TextEditorElement()
}
this.element.initialize(this)
this.virtualNode = $('atom-text-editor')
this.virtualNode.domNode = this.element
this.refs = {}
this.updateSync = this.updateSync.bind(this)
this.didBlurHiddenInput = this.didBlurHiddenInput.bind(this)
this.didFocusHiddenInput = this.didFocusHiddenInput.bind(this)
this.didPaste = this.didPaste.bind(this)
this.didTextInput = this.didTextInput.bind(this)
this.didKeydown = this.didKeydown.bind(this)
this.didKeyup = this.didKeyup.bind(this)
this.didKeypress = this.didKeypress.bind(this)
this.didCompositionStart = this.didCompositionStart.bind(this)
this.didCompositionUpdate = this.didCompositionUpdate.bind(this)
this.didCompositionEnd = this.didCompositionEnd.bind(this)
this.updatedSynchronously = this.props.updatedSynchronously
this.didScrollDummyScrollbar = this.didScrollDummyScrollbar.bind(this)
this.didMouseDownOnContent = this.didMouseDownOnContent.bind(this)
this.debouncedResumeCursorBlinking = debounce(
this.resumeCursorBlinking.bind(this),
(this.props.cursorBlinkResumeDelay || CURSOR_BLINK_RESUME_DELAY)
)
this.lineTopIndex = new LineTopIndex()
this.lineNodesPool = new NodePool()
this.updateScheduled = false
this.suppressUpdates = false
this.hasInitialMeasurements = false
this.measurements = {
lineHeight: 0,
baseCharacterWidth: 0,
doubleWidthCharacterWidth: 0,
halfWidthCharacterWidth: 0,
koreanCharacterWidth: 0,
gutterContainerWidth: 0,
lineNumberGutterWidth: 0,
clientContainerHeight: 0,
clientContainerWidth: 0,
verticalScrollbarWidth: 0,
horizontalScrollbarHeight: 0,
longestLineWidth: 0
}
this.derivedDimensionsCache = {}
this.visible = false
this.cursorsBlinking = false
this.cursorsBlinkedOff = false
this.nextUpdateOnlyBlinksCursors = null
this.linesToMeasure = new Map()
this.extraRenderedScreenLines = new Map()
this.horizontalPositionsToMeasure = new Map() // Keys are rows with positions we want to measure, values are arrays of columns to measure
this.horizontalPixelPositionsByScreenLineId = new Map() // Values are maps from column to horizontal pixel positions
this.blockDecorationsToMeasure = new Set()
this.blockDecorationsByElement = new WeakMap()
this.blockDecorationSentinel = get_document().createElement('div')
this.blockDecorationSentinel.style.height = '1px'
this.heightsByBlockDecoration = new WeakMap()
this.blockDecorationResizeObserver = new ResizeObserver(this.didResizeBlockDecorations.bind(this))
this.lineComponentsByScreenLineId = new Map()
this.overlayComponents = new Set()
this.shouldRenderDummyScrollbars = true
this.remeasureScrollbars = false
this.pendingAutoscroll = null
this.scrollTopPending = false
this.scrollLeftPending = false
this.scrollTop = 0
this.scrollLeft = 0
this.previousScrollWidth = 0
this.previousScrollHeight = 0
this.lastKeydown = null
this.lastKeydownBeforeKeypress = null
this.accentedCharacterMenuIsOpen = false
this.remeasureGutterDimensions = false
this.guttersToRender = [this.props.model.getLineNumberGutter()]
this.guttersVisibility = [this.guttersToRender[0].visible]
this.idsByTileStartRow = new Map()
this.nextTileId = 0
this.renderedTileStartRows = []
this.showLineNumbers = this.props.model.doesShowLineNumbers()
this.lineNumbersToRender = {
maxDigits: 2,
bufferRows: [],
keys: [],
softWrappedFlags: [],
foldableFlags: []
}
this.decorationsToRender = {
lineNumbers: null,
lines: null,
highlights: [],
cursors: [],
overlays: [],
customGutter: new Map(),
blocks: new Map(),
text: []
}
this.decorationsToMeasure = {
highlights: [],
cursors: new Map()
}
this.textDecorationsByMarker = new Map()
this.textDecorationBoundaries = []
this.pendingScrollTopRow = this.props.initialScrollTopRow
this.pendingScrollLeftColumn = this.props.initialScrollLeftColumn
this.measuredContent = false
this.queryGuttersToRender()
this.queryMaxLineNumberDigits()
this.observeBlockDecorations()
this.updateClassList()
etch.updateSync(this)
}
update (props) {
if (props.model !== this.props.model) {
this.props.model.component = null
props.model.component = this
}
this.props = props
this.scheduleUpdate()
}
pixelPositionForScreenPosition ({row, column}) {
const top = this.pixelPositionAfterBlocksForRow(row)
let left = column === 0 ? 0 : this.pixelLeftForRowAndColumn(row, column)
if (left == null) {
this.requestHorizontalMeasurement(row, column)
this.updateSync()
left = this.pixelLeftForRowAndColumn(row, column)
}
return {top, left}
}
scheduleUpdate (nextUpdateOnlyBlinksCursors = false) {
if (!this.visible) return
if (this.suppressUpdates) return
this.nextUpdateOnlyBlinksCursors =
this.nextUpdateOnlyBlinksCursors !== false && nextUpdateOnlyBlinksCursors === true
if (this.updatedSynchronously) {
this.updateSync()
} else if (!this.updateScheduled) {
this.updateScheduled = true
etch.getScheduler().updateDocument(() => {
if (this.updateScheduled) this.updateSync(true)
})
}
}
updateSync (useScheduler = false) {
// Don't proceed if we know we are not visible
if (!this.visible) {
this.updateScheduled = false
return
}
// Don't proceed if we have to pay for a measurement anyway and detect
// that we are no longer visible.
if ((this.remeasureCharacterDimensions || this.remeasureAllBlockDecorations) && !this.isVisible()) {
if (this.resolveNextUpdatePromise) this.resolveNextUpdatePromise()
this.updateScheduled = false
return
}
const onlyBlinkingCursors = this.nextUpdateOnlyBlinksCursors
this.nextUpdateOnlyBlinksCursors = null
if (useScheduler && onlyBlinkingCursors) {
this.refs.cursorsAndInput.updateCursorBlinkSync(this.cursorsBlinkedOff)
if (this.resolveNextUpdatePromise) this.resolveNextUpdatePromise()
this.updateScheduled = false
return
}
if (this.remeasureCharacterDimensions) {
const originalLineHeight = this.getLineHeight()
const originalBaseCharacterWidth = this.getBaseCharacterWidth()
const scrollTopRow = this.getScrollTopRow()
const scrollLeftColumn = this.getScrollLeftColumn()
this.measureCharacterDimensions()
this.measureGutterDimensions()
this.queryLongestLine()
if (this.getLineHeight() !== originalLineHeight) {
this.setScrollTopRow(scrollTopRow)
}
if (this.getBaseCharacterWidth() !== originalBaseCharacterWidth) {
this.setScrollLeftColumn(scrollLeftColumn)
}
this.remeasureCharacterDimensions = false
}
this.measureBlockDecorations()
this.updateSyncBeforeMeasuringContent()
if (useScheduler === true) {
const scheduler = etch.getScheduler()
scheduler.readDocument(() => {
this.measureContentDuringUpdateSync()
scheduler.updateDocument(() => {
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment